#pragma once

#include <vector>
#include <map>
#include <set>
#include <string>

#include "../Distribution/Distribution.h"
#include "../Utils/errors.h"
#include "../GraphLoop/graph_loops.h"
#include "../Utils/types.h"

void createParallelDirectivesNoDist(const std::map<LoopGraph*, std::map<DIST::Array*, ArrayInfo*>>& loopInfos,
                                    const std::vector<ParallelRegion*>& regions,
                                    const std::map<DIST::Array*, std::set<DIST::Array*>>& arrayLinksByFuncCalls,
                                    std::vector<Messages>& messages);

void selectParallelDirectiveForVariantNoDist(File* file, ParallelRegion* currParReg,
                                             DIST::Arrays<int>& allArrays,
                                             const std::vector<LoopGraph*>& loopGraph,
                                             const std::map<int, LoopGraph*>& mapLoopsInFile,
                                             const std::map<std::string, FuncInfo*>& mapFuncInfo,
                                             std::vector<Directive*>& toInsert,
                                             const std::map<DIST::Array*, std::set<DIST::Array*>>& arrayLinksByFuncCalls,
                                             const std::map<LoopGraph*, void*>& depInfoForLoopGraph,
                                             std::vector<Messages>& messages);