/* 
 * File:   InstructionsAdvanced.h
 * Author: pgess
 *
 * Created on June 26, 2016, 6:00 PM
 */

#ifndef INSTRUCTIONSADVANCED_H
#define INSTRUCTIONSADVANCED_H

#include "ast.h"
#include "llvmlayer.h"
#include "pass/compilepass.h"

#include <vector>

namespace xreate {
    namespace compilation {

class Advanced {
public:
    Advanced(compilation::Context ctx);
    llvm::Value* compileArrayIndex(llvm::Value* aggregate, std::vector<llvm::Value *> indexes, std::string ident = "");
    llvm::Value* compileStructIndex(llvm::Value* aggregate, const ExpandedType& t, const std::string& idx);
        /*
        *    - map Computation -> Llvm_Array: Prohibited, we do not know a result size
        *    - map Llvm_Array -> Computation: considered in `compileGetElement`
        *    - map Llvm_Array -> Llvm_Array considered by this method
        */
    llvm::Value* compileMapSolidOutput(const Expression &expr, const std::string hintRetVar = "");
    llvm::Value* compileFold(const Expression& fold, const std::string& ident="");
    llvm::Value* compileFoldInf(const Expression& fold, const std::string& ident="");
    
    //DISABLEDFEATURE Context Loop
    llvm::Value* compileLoopContext(const Expression& expression, const std::string& hintRetVar);
    llvm::Value* compileIf(const Expression& exprIf, const std::string& ident);
    llvm::Value* compileSwitch(const Expression& exprSwitch, const std::string& hintRetVar);
    llvm::Value* compileConstantStringAsPChar(const std::string &data, const std::string& hintRetVar);
    llvm::Value* compileListAsSolidArray(const Expression &expr, const std::string&  hintRetVar="");

private:
    compilation::Context context;
    llvm::IntegerType* const tyNum;
};

}}

#endif /* INSTRUCTIONSADVANCED_H */

