* The createSetSym function is an almost exact copy of * createIntSym/createBoolSym. */
| 72 | * createIntSym/createBoolSym. |
| 73 | */ |
| 74 | SymmetryImp<SetView>* createSetSym(Space& home, const SymmetryHandle& s, |
| 75 | VariableMap variableMap) { |
| 76 | VariableSymmetryObject* varref = |
| 77 | dynamic_cast<VariableSymmetryObject*>(s.ref); |
| 78 | ValueSymmetryObject* valref = |
| 79 | dynamic_cast<ValueSymmetryObject*>(s.ref); |
| 80 | VariableSequenceSymmetryObject* varseqref = |
| 81 | dynamic_cast<VariableSequenceSymmetryObject*>(s.ref); |
| 82 | ValueSequenceSymmetryObject* valseqref = |
| 83 | dynamic_cast<ValueSequenceSymmetryObject*>(s.ref); |
| 84 | if (varref) { |
| 85 | int n = varref->nxs; |
| 86 | int* indices = home.alloc<int>(n); |
| 87 | for (int i = 0 ; i < n ; i++) { |
| 88 | VariableMap::const_iterator index = variableMap.find(varref->xs[i]); |
| 89 | if (index == variableMap.end()) |
| 90 | throw |
| 91 | Int::LDSBUnbranchedVariable("VariableSymmetryObject::createSet"); |
| 92 | indices[i] = index->second; |
| 93 | } |
| 94 | return new (home) VariableSymmetryImp<SetView>(home, indices, n); |
| 95 | } |
| 96 | if (valref) { |
| 97 | int n = valref->values.size(); |
| 98 | int *vs = home.alloc<int>(n); |
| 99 | int i = 0; |
| 100 | for (IntSetValues v(valref->values) ; v() ; ++v) { |
| 101 | vs[i] = v.val(); |
| 102 | i++; |
| 103 | } |
| 104 | return new (home) ValueSymmetryImp<SetView>(home, vs, n); |
| 105 | } |
| 106 | if (varseqref) { |
| 107 | int n = varseqref->nxs; |
| 108 | int* indices = home.alloc<int>(n); |
| 109 | for (int i = 0 ; i < n ; i++) { |
| 110 | VariableMap::const_iterator index = |
| 111 | variableMap.find(varseqref->xs[i]); |
| 112 | if (index == variableMap.end()) |
| 113 | throw |
| 114 | Int::LDSBUnbranchedVariable("VariableSequenceSymmetryObject::createSet"); |
| 115 | indices[i] = index->second; |
| 116 | } |
| 117 | return new (home) VariableSequenceSymmetryImp<SetView>(home, indices, n, |
| 118 | varseqref->seq_size); |
| 119 | } |
| 120 | if (valseqref) { |
| 121 | unsigned int n = valseqref->values.size(); |
| 122 | int *vs = home.alloc<int>(n); |
| 123 | for (unsigned int i = 0 ; i < n ; i++) |
| 124 | vs[i] = valseqref->values[i]; |
| 125 | return new (home) ValueSequenceSymmetryImp<SetView>(home, vs, n, |
| 126 | valseqref->seq_size); |
| 127 | } |
| 128 | GECODE_NEVER; |
| 129 | return nullptr; |
| 130 | } |
| 131 | }}} |