#ifndef UTILS_H
#define UTILS_H

#include "ast.h"

//TODO mark dirty members

/*
template<class T>
struct DdesctructableClass<T> {

}
*/
/*
template<class OriginalType>
struct TagUpdatable{
    TagUpdatable(const OriginalType& source)
            : __source(source)
    {}

    TagUpdatable() = delete;

    const OriginalType& __source;
};


struct Updatable;

template <class Tag, class OT>
struct TagsDictionary
{};

template<class OT>
struct TagsDictionary<Updatable, OT>
{
    typedef TagUpdatable<OT> TagName;
};

template<class Tag, class OT>
struct awareOf
{
    awareOf(OT& dest)
        : __dest(dest)
    {}

    awareOf<Tag, OT>&
        operator= (const typename TagsDictionary<Tag, OT>::TagName& source)
    {
        __dest = source.__source;
    }

private:
    OT& __dest;
};

template<class Tag<OT>>
const OT&
awareOf(const Tag<OT>& holder)
{
    return std::forward<OT>(holder.__source);
}
*/


#endif // UTILS_H
