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