26 namespace catapult {
namespace cache {
29 template<
typename TGroupedSet,
typename TGroupingKey,
typename TIdentifier>
31 if (!groupedSet.contains(key))
32 groupedSet.insert(
typename TGroupedSet::ElementType(key));
34 auto groupIter = groupedSet.find(key);
35 auto* pGroup = groupIter.get();
36 pGroup->add(identifier);
40 template<
typename TSet,
typename TGroupedSet,
typename TGroupingKey,
typename TAction>
42 auto groupIter = groupedSet.find(key);
43 const auto* pGroup = groupIter.get();
47 for (
const auto& identifier : pGroup->identifiers()) {
48 auto valueIter = set.find(identifier);
49 auto* pValue = valueIter.get();
56 template<
typename TGroupedSet,
typename TGroupingKey,
typename TIdentifier>
58 auto groupIter = groupedSet.find(key);
59 auto* pGroup = groupIter.get();
63 pGroup->remove(identifier);
65 groupedSet.remove(key);
69 template<
typename TSet,
typename TGroupedSet,
typename TGroupingKey>
71 auto groupIter = groupedSet.find(key);
72 const auto* pGroup = groupIter.get();
76 for (
const auto& identifier : pGroup->identifiers())
77 set.remove(identifier);
79 groupedSet.remove(key);
83 template<
typename TSet,
typename TGroupedSet,
typename TIdentifiers =
typename TGroupedSet::ElementType::Identifiers>
85 auto groupIter = groupedSet.find(height);
86 const auto* pGroup = groupIter.get();
90 TIdentifiers identifiers;
91 for (
const auto& identifier : pGroup->identifiers()) {
92 auto valueIter = set.find(identifier);
93 auto* pValue = valueIter.get();
94 if (pValue && !pValue->isActive(height) && pValue->isActive(height -
Height(1)))
95 identifiers.emplace(identifier);