74 using ElemPtr = ElemType*;
75 using KeyType = std::vector<std::string>;
76 using KeyTypeIterator =
typename KeyType::iterator;
77 using ValueType = std::pair<int, ElemPtr>;
78 using MapType =
typename std::map<KeyType, ValueType>;
79 using MapTypeIterator =
typename std::map<KeyType, ValueType>::iterator;
80 using value_type =
typename MapType::value_type;
81 using MutableValues =
typename std::vector<int>;
83 TypeContainer() : index_(0) {}
85 ~TypeContainer() { Utils::deletePointers(data_); }
87 bool add(KeyType& keys, ElemPtr elem) {
88 assert(keys.size() == SIZE);
90 return data_.insert(value_type(keys, std::make_pair(index_++, elem)))
94 bool replace(KeyType& keys, ElemPtr elem) {
95 assert(keys.size() == SIZE);
100 if (i != data_.end()) {
101 data_[keys] = std::make_pair((i->second).first, elem);
104 return data_.insert(value_type(keys, std::make_pair(index_++, elem)))
111 assert(keys.size() == SIZE);
114 i = data_.find(keys);
115 if (i != data_.end()) {
return (i->second).second; }
117 KeyType reversedKeys = keys;
118 std::reverse(reversedKeys.begin(), reversedKeys.end());
120 i = data_.find(reversedKeys);
121 if (i != data_.end()) {
122 return (i->second).second;
128 ElemPtr permutedFindSkippingFirstElement(KeyType& keys) {
129 assert(keys.size() == SIZE);
132 KeyType permutedKeys = keys;
135 KeyTypeIterator start;
136 start = permutedKeys.begin();
139 std::sort(start, permutedKeys.end());
142 i = data_.find(permutedKeys);
143 if (i != data_.end()) {
return (i->second).second; }
144 }
while (std::next_permutation(start, permutedKeys.end()));
152 ElemPtr
find(KeyType& keys,
const std::string& wildCard) {
153 assert(keys.size() == SIZE);
155 std::vector<KeyTypeIterator> iterCont;
158 std::vector<ValueType> foundTypes;
161 i = data_.find(replacedKey);
162 if (i != data_.end()) { foundTypes.push_back(i->second); }
166 KeyType reversedKeys = keys;
167 std::reverse(reversedKeys.begin(), reversedKeys.end());
170 if (reversedKeys != keys) {
176 i = data_.find(replacedKey);
177 if (i != data_.end()) { foundTypes.push_back(i->second); }
182 KeyType allWildCards(SIZE, wildCard);
183 i = data_.find(allWildCards);
184 if (i != data_.end()) { foundTypes.push_back(i->second); }
187 typename std::vector<ValueType>::iterator j;
188 j = std::min_element(foundTypes.begin(), foundTypes.end());
189 return j == foundTypes.end() ? NULL : j->second;
192 ElemPtr permutedFindSkippingFirstElement(KeyType& keys,
193 const std::string& wildCard) {
194 assert(keys.size() == SIZE);
197 std::vector<KeyTypeIterator> iterCont;
198 std::vector<std::string> replacedKeys;
199 std::vector<ValueType> foundTypes;
201 while (replaceWithWildCardSkippingFirstElement(iterCont, keys,
202 replacedKeys, wildCard)) {
203 KeyType permutedKeys = replacedKeys;
205 KeyTypeIterator start;
206 start = permutedKeys.begin();
208 std::sort(start, permutedKeys.end());
210 i2 = data_.find(permutedKeys);
211 if (i2 != data_.end()) { foundTypes.push_back(i2->second); }
212 }
while (std::next_permutation(start, permutedKeys.end()));
218 KeyType allWildCards(SIZE, wildCard);
220 allWildCards[0] = keys[0];
221 KeyTypeIterator start;
222 start = allWildCards.begin();
224 std::sort(start, allWildCards.end());
226 i2 = data_.find(allWildCards);
227 if (i2 != data_.end()) { foundTypes.push_back(i2->second); }
228 }
while (std::next_permutation(start, allWildCards.end()));
230 typename std::vector<ValueType>::iterator j;
231 j = std::min_element(foundTypes.begin(), foundTypes.end());
232 return j == foundTypes.end() ? NULL : j->second;
235 size_t size() {
return data_.size(); }
237 ElemPtr beginType(MapTypeIterator& i) {
239 return i != data_.end() ? (i->second).second : NULL;
242 ElemPtr nextType(MapTypeIterator& i) {
244 return i != data_.end() ? (i->second).second : NULL;
247 KeyType getKeys(MapTypeIterator& i) {
return i->first; }