50 template <
typename KeyT,
typename ValueT>
51 typename std::map<KeyT, ValueT>::const_iterator
53 const std::function<std::optional<KeyT>(KeyT&)>& prefixFunc,
56 std::optional<KeyT> curKey = key;
58 typename std::map<KeyT, ValueT>::const_iterator result = keyValMap.end();
61 auto iterator = keyValMap.find(curKey.value());
62 if (iterator != keyValMap.end())
68 curKey = prefixFunc(curKey.value());
70 }
while (result == keyValMap.end() and curKey.has_value());
92 template <
typename KeyT,
typename ValueT>
93 typename std::map<KeyT, ValueT>::const_iterator
95 const std::map<KeyT, ValueT>& keyValMap,
96 const std::function<std::optional<KeyT>(KeyT&)>& prefixFunc,
98 const std::function<
bool(
const KeyT&,
const ValueT&)>& predicate)
100 std::optional<KeyT> curKey = key;
102 typename std::map<KeyT, ValueT>::const_iterator result = keyValMap.end();
105 auto iterator = keyValMap.find(curKey.value());
106 if (iterator != keyValMap.end() and predicate(iterator->first, iterator->second))
112 curKey = prefixFunc(curKey.value());
114 }
while (result == keyValMap.end() and curKey.has_value());
134 template <
typename KeyT,
typename ValueT,
typename AccumulateT>
137 const std::map<KeyT, ValueT>& keyValMap,
138 const std::function<std::optional<KeyT>(
const KeyT&)>& prefixFunc,
139 const std::function<
void(AccumulateT&,
const ValueT&)> accumulateFunc,
142 std::optional<KeyT> curKey = key;
146 const auto nextEntry =
147 findEntryWithLongestPrefix<KeyT, ValueT>(keyValMap, prefixFunc, curKey.value());
148 if (nextEntry != keyValMap.end())
150 curKey = prefixFunc(nextEntry->first);
151 accumulateFunc(
values, nextEntry->second);
157 }
while (curKey.has_value());
173 template <
typename KeyT,
typename ValueT>
176 const std::function<std::optional<KeyT>(
const KeyT&)>& prefixFunc,
179 return accumulateFromPrefixes<KeyT, ValueT, std::vector<ValueT>>(
182 [](std::vector<ValueT>&
values,
const ValueT& val) {
values.push_back(val); },
197 template <
typename KeyT,
typename ValueT>
200 const std::function<std::optional<KeyT>(
const KeyT&)>& prefixFunc,
203 return accumulateFromPrefixes<KeyT, std::vector<ValueT>, std::vector<ValueT>>(
206 [](std::vector<ValueT>&
values,
const std::vector<ValueT>& val)
207 {
values.insert(
values.end(), val.begin(), val.end()); },
229 template <
typename ValueT>
230 typename std::map<MemoryID, ValueT>::const_iterator
233 return detail::findEntryWithLongestPrefix<MemoryID, ValueT>(idMap, &
getMemoryIDParent,
id);
243 template <
typename ValueT>
244 typename std::map<MemoryID, ValueT>::const_iterator
246 const std::map<MemoryID, ValueT>& idMap,
248 const std::function<
bool(
const MemoryID&,
const ValueT&)>& predicate)
250 return detail::findEntryWithLongestPrefixAnd<MemoryID, ValueT>(
259 template <
typename ValueT>
263 return detail::accumulateFromPrefixes<MemoryID, ValueT>(idMap, &
getMemoryIDParent,
id);
271 template <
typename ValueT>
276 return detail::accumulateFromPrefixes<MemoryID, ValueT>(idMap, &
getMemoryIDParent, key);