1 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 2 3 /* 4 * Main authors: 5 * Guido Tack <guido.tack@monash.edu> 6 */ 7 8 /* This Source Code Form is subject to the terms of the Mozilla Public 9 * License, v. 2.0. If a copy of the MPL was not distributed with this 10 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 11 12 #pragma once 13 14 #include <minizinc/model.hh> 15 16 namespace MiniZinc { 17 18 class CopyMap { 19 protected: 20 typedef std::unordered_map<Model*, Model*> ModelMap; 21 ModelMap _modelMap; 22 23 ASTNodeWeakMap _nodeMap; 24 25 public: 26 void insert(Expression* e0, Expression* e1); 27 Expression* find(Expression* e); 28 void insert(Item* e0, Item* e1); 29 Item* find(Item* e); 30 void insert(Model* e0, Model* e1); 31 Model* find(Model* e); 32 void insert(IntSetVal* e0, IntSetVal* e1); 33 IntSetVal* find(IntSetVal* e); 34 void insert(FloatSetVal* e0, FloatSetVal* e1); 35 FloatSetVal* find(FloatSetVal* e); 36 template <class T> insert(ASTExprVec<T> e0,ASTExprVec<T> e1)37 void insert(ASTExprVec<T> e0, ASTExprVec<T> e1) { 38 _nodeMap.insert(e0.vec(), e1.vec()); 39 } 40 template <class T> find(ASTExprVec<T> e)41 ASTExprVecO<T*>* find(ASTExprVec<T> e) { 42 ASTNode* n = _nodeMap.find(e.vec()); 43 return static_cast<ASTExprVecO<T*>*>(n); 44 } clear()45 void clear() { 46 _modelMap.clear(); 47 _nodeMap.clear(); 48 } 49 }; 50 51 /// Create a deep copy of expression \a e 52 Expression* copy(EnvI& env, Expression* e, bool followIds = false, bool copyFundecls = false, 53 bool isFlatModel = false); 54 /// Create a deep copy of item \a i 55 Item* copy(EnvI& env, Item* i, bool followIds = false, bool copyFundecls = false, 56 bool isFlatModel = false); 57 /// Create a deep copy of model \a m 58 Model* copy(EnvI& env, Model* m); 59 60 /// Create a deep copy of expression \a e 61 Expression* copy(EnvI& env, CopyMap& map, Expression* e, bool followIds = false, 62 bool copyFundecls = false, bool isFlatModel = false); 63 /// Create a deep copy of item \a i 64 Item* copy(EnvI& env, CopyMap& map, Item* i, bool followIds = false, bool copyFundecls = false, 65 bool isFlatModel = false); 66 /// Create a deep copy of model \a m 67 Model* copy(EnvI& env, CopyMap& cm, Model* m, bool isFlatModel = false); 68 69 } // namespace MiniZinc 70