//
// Created by pgess on 3/14/15.
//

#ifndef _XREATE_CONTAINERSQUERY_H_
#define _XREATE_CONTAINERSQUERY_H_

#include "passmanager.h"

namespace xreate {
namespace containers {

    enum Implementation{
        LLVM_ARRAY, LLVM_CONST_ARRAY, ON_THE_FLY
    };

    struct ImplementationData {
        Implementation impl;
        union {
            unsigned int size; //valid in case of LLVM_ARRAY impl.
            struct {
                Symbol range;
            };
        };
        ImplementationData(Symbol var);
        ImplementationData(Symbol var, std::string implSerialized, const ImplementationData& implPrototype);
        std::pair<Expression, Expression> getRange();
    };

    class Query : public xreate::IQuery {
    public:
        static ImplementationData queryImplementation(xreate::Symbol const &s);
        void init(ClaspLayer* clasp);

        ~Query(){}
    private:
        bool flagIsDataLoaded = false;
        PassManager *man;
    };
}

    template<>
    struct AttachmentsDictionary<containers::ImplementationData> {
        typedef containers::ImplementationData Data;
        static const unsigned int key = 1;
    };
}

#endif //_XREATE_CONTAINERSQUERY_H_
