| 2157 | } |
| 2158 | |
| 2159 | void EnumDef::RemoveDuplicates() { |
| 2160 | // This method depends form SymbolTable implementation! |
| 2161 | // 1) vals.vec - owner (raw pointer) |
| 2162 | // 2) vals.dict - access map |
| 2163 | auto first = vals.vec.begin(); |
| 2164 | auto last = vals.vec.end(); |
| 2165 | if (first == last) return; |
| 2166 | auto result = first; |
| 2167 | while (++first != last) { |
| 2168 | if ((*result)->value != (*first)->value) { |
| 2169 | *(++result) = *first; |
| 2170 | } else { |
| 2171 | auto ev = *first; |
| 2172 | for (auto it = vals.dict.begin(); it != vals.dict.end(); ++it) { |
| 2173 | if (it->second == ev) it->second = *result; // reassign |
| 2174 | } |
| 2175 | delete ev; // delete enum value |
| 2176 | *first = nullptr; |
| 2177 | } |
| 2178 | } |
| 2179 | vals.vec.erase(++result, last); |
| 2180 | } |
| 2181 | |
| 2182 | template<typename T> void EnumDef::ChangeEnumValue(EnumVal *ev, T new_value) { |
| 2183 | ev->value = static_cast<int64_t>(new_value); |
no test coverage detected