Maps#

pw_containers: Generic collections of objects for embedded devices

A map is an associative collection of keys that map to values. Pigweed provides an implementation of a constant “flat” map that can find values by key in constant time. It also provides implementations of dynamic maps that can insert, find, and remove key-value pairs in logarithmic time.

pw::containers::FlatMap#

FlatMap provides a simple, fixed-size associative array with O(log n) lookup by key.

pw::containers::FlatMap contains the same methods and features for looking up data as std::map. However, modification of the underlying data is limited to the mapped values, via .at() (key must exist) and mapped_iterator objects returned by .mapped_begin() and .mapped_end(). mapped_iterator objects are bidirectional iterators that can be dereferenced to access and mutate the mapped value objects.

The underlying array in pw::containers::FlatMap does not need to be sorted. During construction, pw::containers::FlatMap will perform a constexpr insertion sort.

Examples#

A FlatMap can be created in one of several ways. Each of the following examples defines a FlatMap with two items.

 1using pw::containers::FlatMap;
 2using pw::containers::Pair;
 3
 4// Initialized by an initializer list.
 5FlatMap<int, char, 2> my_flat_map1({{
 6    {1, 'a'},
 7    {-3, 'b'},
 8}});
 9
10// Initialized by a std::array of Pair<K, V> objects.
11std::array<Pair<int, char>, 2> my_array{{
12    {1, 'a'},
13    {-3, 'b'},
14}};
15FlatMap my_flat_map2(my_array);
16
17// Initialized by Pair<K, V> objects.
18FlatMap my_flat_map3 = {
19    Pair<int, char>{1, 'a'},
20    Pair<int, char>{-3, 'b'},
21};

pw::IntrusiveMap#

pw::IntrusiveMap provides an embedded-friendly, tree-based, intrusive map implementation. The intrusive aspect of the map is very similar to that of pw::IntrusiveList.

This class is similar to std::map<K, V>. Items to be added must derive from pw::IntrusiveMap<K, V>::Item or an equivalent type.

See also Using items with multiple containers.

Example#

 1struct Book : public pw::IntrusiveMap<uint32_t, Book>::Pair {
 2 private:
 3  using Pair = pw::IntrusiveMap<uint32_t, Book>::Pair;
 4
 5 public:
 6  Book(const char* name, uint32_t oclc) : Pair(oclc), name_(name) {}
 7  const char* name() const { return name_; }
 8
 9 private:
10  const char* name_;
11};
12
13std::array<Book, 8> books = {{
14    {"A Tale of Two Cities", 20848014u},
15    {"The Little Prince", 182537909u},
16    {"The Alchemist", 26857452u},
17    {"Harry Potter and the Philosopher's Stone", 44795766u},
18    {"And Then There Were None", 47032439u},
19    {"Dream of the Red Chamber", 20692970u},
20    {"The Hobbit", 1827184u},
21    {"Alice's Adventures in Wonderland", 5635965u},
22}};
23
24pw::IntrusiveMap<uint32_t, Book> library(books.begin(), books.end());
25
26void VisitLibrary(pw::IntrusiveMap<uint32_t, Book>& book_bag) {
27  // Return any books we previously checked out.
28  library.merge(book_bag);
29
30  // Pick out some new books to read to the kids, but only if they're available.
31  std::array<uint32_t, 3> oclcs = {
32      1827184u,   // The Hobbit
33      11914189u,  // Curious George
34      44795766u,  // Harry Potter
35  };
36  for (uint32_t oclc : oclcs) {
37    auto iter = library.find(oclc);
38    if (iter != library.end()) {
39      Book& book = *iter;
40      library.erase(iter);
41      book_bag.insert(book);
42    }
43  }
44}

If you need to add this item to containers of more than one type, see Using items with multiple containers,

pw::IntrusiveMultiMap#

pw::IntrusiveMultiMap provides an embedded-friendly, tree-based, intrusive multimap implementation. This is very similar to pw::IntrusiveMap, except that the tree may contain multiple items with equivalent keys.

This class is similar to std::multimap<K, V>. Items to be added must derive from pw::IntrusiveMultiMap<K, V>::Item or an equivalent type.

See also Using items with multiple containers.

Example#

 1struct Book : public pw::IntrusiveMultiMap<uint32_t, Book>::Pair {
 2 private:
 3  using Pair = pw::IntrusiveMultiMap<uint32_t, Book>::Pair;
 4
 5 public:
 6  Book(const char* name, uint32_t oclc) : Pair(oclc), name_(name) {}
 7  const char* name() const { return name_; }
 8
 9 private:
10  const char* name_;
11};
12
13std::array<Book, 12> books = {{
14    {"The Little Prince", 182537909u},
15    {"Harry Potter and the Philosopher's Stone", 44795766u},
16    {"Harry Potter and the Philosopher's Stone", 44795766u},
17    {"Harry Potter and the Philosopher's Stone", 44795766u},
18    {"Harry Potter and the Philosopher's Stone", 44795766u},
19    {"Harry Potter and the Philosopher's Stone", 44795766u},
20    {"The Hobbit", 1827184u},
21    {"The Hobbit", 1827184u},
22    {"The Hobbit", 1827184u},
23    {"The Hobbit", 1827184u},
24    {"Alice's Adventures in Wonderland", 5635965u},
25    {"Alice's Adventures in Wonderland", 5635965u},
26}};
27pw::IntrusiveMultiMap<uint32_t, Book> library(books.begin(), books.end());
28
29void VisitLibrary(pw::IntrusiveMultiMap<uint32_t, Book>& book_bag) {
30  // Pick out some new books to read to the kids, but only if they're available.
31  std::array<uint32_t, 3> oclcs = {
32      1827184u,    // The Hobbit
33      5635965u,    // Alice's Adventures in Wonderland
34      182537909u,  // The Little Prince
35  };
36  for (uint32_t oclc : oclcs) {
37    auto iter = library.find(oclc);
38    if (iter != library.end()) {
39      Book& book = *iter;
40      library.erase(iter);
41      book_bag.insert(book);
42    }
43  }
44}

If you need to add this item to containers of more than one type, see Using items with multiple containers.

API reference#

Moved: pw_containers_maps

Size reports#

The tables below illustrate the following scenarios:

  • Scenarios related to FlatMap:

    • The memory and code size cost incurred by adding another FlatMap

    • The memory and code size cost incurred by adding another FlatMap with different key and value types. As FlatMap is templated on both key and value types, this results in additional code being generated.

  • Scenarios related to IntrusiveMap:

    • The memory and code size cost incurred by a adding a single IntrusiveMap.

    • The memory and code size cost incurred by adding another IntrusiveMap with the same key type, but a different value type. As IntrusiveMap is templated on both key and value types, this results in additional code being generated.

    • The memory and code size cost incurred by adding another IntrusiveMap with the same value type, but a different key type. As IntrusiveMap is templated on both key and value types, this results in additional code being generated.

  • Scenarios related to IntrusiveMultiMap:

    • The memory and code size cost incurred by a adding a single IntrusiveMultiMap.

    • The memory and code size cost incurred by adding another IntrusiveMultiMap with the same key type, but a different value type. As IntrusiveMultiMap is templated on both key and value types, this results in additional code being generated.

    • The memory and code size cost incurred by adding another IntrusiveMultiMap with the same value type, but a different key type. As IntrusiveMultiMap is templated on both key and value types, this results in additional code being generated.

  • The memory and code size cost incurred by a adding both an IntrusiveMap and an IntrusiveMultiMap of the same type. These types reuse code, so the combined sum is less than the sum of its parts.

Label

Segment

Delta

FlatMap

FLASH

+2

pw::allocator::Layout::Of<>()

-8

pw::containers::size_report::Measure()

-4

vClearInterruptMaskFromISR

NEW

+74

pw::containers::FlatMap<>::ConstexprSort()

NEW

+56

_ZNSt3__223__lower_bound_bisectingB8nn210000INS_17_ClassicAlgPolicyENS_11__wrap_iterIPKN2pw10containers4PairIjjEEEEjNS_10__identityEPFbRS7_jEEET0_SE_RKT1_NS_15iterator_traitsISE_E15difference_typeERT3_RT2_

NEW

+56

pw::containers::size_report::MeasureFlatMap<>()

NEW

+42

_ZNSt3__213__upper_boundB8nn210000INS_17_ClassicAlgPolicyEZNK2pw10containers7FlatMapIjjLj10EE11upper_boundERKjEUljRKNS3_4PairIjjEEE_NS_11__wrap_iterIPSA_EESF_jNS_10__identityEEET1_SH_T2_RKT3_OT0_OT4_

NEW

+36

pw::containers::size_report::GetContainer<>()

NEW

+32

pw::containers::FlatMap<>::equal_range()

NEW

+28

pw::containers::FlatMap<>::find()

NEW

+22

_ZNSt3__211lower_boundB8nn210000INS_11__wrap_iterIPKN2pw10containers4PairIjjEEEEjPFbRS6_jEEET_SC_SC_RKT0_T1_

NEW

+22

pw::containers::FlatMap<>::FlatMap()

NEW

+20

_ZNSt3__211upper_boundB8nn210000INS_11__wrap_iterIPKN2pw10containers4PairIjjEEEEjZNKS3_7FlatMapIjjLj10EE11upper_boundERKjEUljRS6_E_EET_SF_SF_RKT0_T1_

NEW

+20

_ZNSt3__213__lower_boundB8nn210000INS_17_ClassicAlgPolicyENS_11__wrap_iterIPKN2pw10containers4PairIjjEEEES9_jNS_10__identityEPFbRS7_jEEET0_SE_T1_RKT2_RT4_RT3_

NEW

+20

pw::containers::FlatMap<>::lower_bound()

NEW

+18

pw::containers::FlatMap<>::contains()

NEW

+14

pw::containers::FlatMap<>::IsItemKeyLessThanGivenKey()

NEW

+14

pw::containers::FlatMap<>::upper_bound()

+464

RAM

+1

__Thumbv6MABSLongThunk_best_effort_wfe_or_timeout

NEW

+84

pw::containers::size_report::GetContainer<>()::container

NEW

+79

pw::containers::size_report::GetPairs<>()::pairs

+164

Additional FlatMap with different key and value types

FLASH

+104

pw::containers::FlatMap<>::ConstexprSort()

+56

pw::containers::size_report::MeasureFlatMap<>()

+36

pw::containers::size_report::GetContainer<>()

+32

pw::containers::FlatMap<>::equal_range()

+28

pw::containers::FlatMap<>::find()

+22

pw::containers::FlatMap<>::FlatMap()

+20

pw::containers::FlatMap<>::lower_bound()

+18

pw::containers::FlatMap<>::contains()

+12

pw::containers::size_report::Measure()

+14

pw::containers::FlatMap<>::IsItemKeyLessThanGivenKey()

+14

pw::containers::FlatMap<>::upper_bound()

+12

vClearInterruptMaskFromISR

NEW

+56

_ZNSt3__223__lower_bound_bisectingB8nn210000INS_17_ClassicAlgPolicyENS_11__wrap_iterIPKN2pw10containers4PairIjyEEEEjNS_10__identityEPFbRS7_jEEET0_SE_RKT1_NS_15iterator_traitsISE_E15difference_typeERT3_RT2_

NEW

+42

_ZNSt3__213__upper_boundB8nn210000INS_17_ClassicAlgPolicyEZNK2pw10containers7FlatMapIjyLj10EE11upper_boundERKjEUljRKNS3_4PairIjyEEE_NS_11__wrap_iterIPSA_EESF_jNS_10__identityEEET1_SH_T2_RKT3_OT0_OT4_

NEW

+22

_ZNSt3__211lower_boundB8nn210000INS_11__wrap_iterIPKN2pw10containers4PairIjyEEEEjPFbRS6_jEEET_SC_SC_RKT0_T1_

NEW

+20

_ZNSt3__211upper_boundB8nn210000INS_11__wrap_iterIPKN2pw10containers4PairIjyEEEEjZNKS3_7FlatMapIjyLj10EE11upper_boundERKjEUljRS6_E_EET_SF_SF_RKT0_T1_

NEW

+20

_ZNSt3__213__lower_boundB8nn210000INS_17_ClassicAlgPolicyENS_11__wrap_iterIPKN2pw10containers4PairIjyEEEES9_jNS_10__identityEPFbRS7_jEEET0_SE_T1_RKT2_RT4_RT3_

+528

RAM

+164

pw::containers::size_report::GetContainer<>()::container

+160

pw::containers::size_report::GetPairs<>()::pairs

+324

IntrusiveMap

FLASH

+356

[section .rodata]

+2

pw::containers::size_report::SetBaseline()

+2

pw::allocator::Layout::Of<>()

-2

pw::Allocator::Reallocate()

+4

pw::containers::size_report::Measure()

+2

pw::allocator::LibCAllocator::DoReallocate()

+4

vClearInterruptMaskFromISR

NEW

+188

pw::containers::internal::KeyedAATree<>::InsertImpl()

NEW

+184

pw::containers::internal::AATreeItem::Rebalance()

NEW

+170

_ZN2pw10containers11size_report19MeasureIntrusiveMapIjNS1_7MapPairIjjEETpTnRiJENSt3__211__wrap_iterIPS4_EEEEiT2_SA_j

NEW

+136

pw::containers::internal::AATreeItem::Unmap()

NEW

+98

pw::containers::internal::KeyedAATree<>::insert()

NEW

+90

pw::containers::internal::AATreeItem::Split()

NEW

+86

pw::containers::internal::KeyedAATree<>::GetLowerBoundImpl()

NEW

+84

pw::containers::internal::KeyedAATree<>::GetUpperBoundImpl()

NEW

+84

pw::containers::internal::KeyedAATree<>::find()

NEW

+78

pw::IntrusiveMap<>::IntrusiveMap<>()

NEW

+72

pw::containers::internal::AATreeIterator<>::operator++()

NEW

+68

pw::containers::internal::AATreeItem::Skew()

NEW

+60

fit::internal::target<>::ops

NEW

+60

pw::containers::internal::AATree<>::AATree()

NEW

+56

pw::containers::internal::GenericAATree::erase_one()

NEW

+56

pw::containers::internal::KeyedAATree<>::KeyedAATree()

NEW

+56

pw::containers::internal::KeyedAATree<>::merge()

NEW

+46

pw::containers::size_report::MeasureContainer<>()

NEW

+44

pw::PackedPtr<>::set()

NEW

+44

pw::PackedPtr<>::set_packed_value()

NEW

+44

pw::containers::internal::KeyedAATree<>::count()

NEW

+42

pw::containers::internal::AATreeItem::GetPredecessor()

NEW

+42

pw::containers::internal::AATreeItem::GetSuccessor()

NEW

+42

pw::containers::internal::AATreeItem::IsMapped()

NEW

+42

pw::containers::internal::GenericAATree::end()

NEW

+40

pw::containers::internal::AATreeItem::GetTreeSize()

NEW

+40

pw::containers::internal::AATreeItem::SetLevel()

NEW

+40

pw::containers::internal::CheckIntrusiveContainerIsEmpty()

NEW

+38

_ZNSt3__210__distanceB8nn210000IN2pw10containers8internal14AATreeIteratorINS3_10AATreeItemEEEEENS_15iterator_traitsIT_E15difference_typeES8_S8_NS_18input_iterator_tagE

NEW

+38

pw::containers::internal::AATreeItem::Replace()

NEW

+36

pw::containers::internal::KeyedAATree<>::equal_range()

NEW

+36

pw::containers::size_report::GetContainer<>()

NEW

+34

pw::containers::internal::KeyedAATree<>::lower_bound()

NEW

+34

pw::containers::internal::KeyedAATree<>::upper_bound()

NEW

+32

pw::containers::internal::KeyedAATree<>::~KeyedAATree()

NEW

+30

fit::internal::target<>::invoke()

NEW

+30

pw::IntrusiveMap<>::equal_range()

NEW

+30

pw::containers::internal::AATreeItem::SetRight()

NEW

+28

_ZNSt3__28distanceB8nn210000IN2pw10containers8internal14AATreeIteratorINS3_10AATreeItemEEEEENS_15iterator_traitsIT_E15difference_typeES8_S8_

NEW

+28

pw::containers::internal::AATreeItem::SetLeft()

NEW

+28

pw::containers::internal::KeyedAATree<>::insert<>()

NEW

+26

fit::internal::inline_trivial_target_move<>()

NEW

+26

pw::containers::internal::GenericAATree::begin()

NEW

+24

pw::IntrusiveMap<>::insert()

NEW

+22

pw::containers::internal::AATree<>::~AATree()

NEW

+22

pw::containers::internal::AATreeItem::GetLevel()

NEW

+20

pw::IntrusiveMap<>::find()

NEW

+18

pw::IntrusiveMap<>::begin()

NEW

+18

pw::IntrusiveMap<>::end()

NEW

+18

pw::IntrusiveMap<>::erase()

NEW

+18

pw::containers::internal::GenericAATree::size()

NEW

+18

pw::containers::internal::GenericAATree::~GenericAATree()

NEW

+16

pw::containers::internal::GenericAATree::SetRoot()

NEW

+14

pw::containers::internal::AATreeItem::GetLeftmost()

NEW

+14

pw::containers::internal::AATreeItem::GetRightmost()

NEW

+14

pw::containers::internal::AATreeItem::GetRoot()

NEW

+10

pw::containers::internal::AATreeItem::Reset()

NEW

+10

pw::containers::internal::GenericAATree::swap()

NEW

+8

pw::IntrusiveMap<>::IntrusiveMap()

NEW

+2

fit::internal::inline_target_get()

+3,200

RAM

+8

[section .data]

+1

__Thumbv6MABSLongThunk_best_effort_wfe_or_timeout

NEW

+199

pw::containers::size_report::GetPairs<>()::pairs

NEW

+36

pw::containers::size_report::GetContainer<>()::container

+244

Additional IntrusiveMap with different key type

(ALL)

0

Additional IntrusiveMap with different key and value types

FLASH

-2

pw::containers::size_report::SetBaseline()

+78

pw::IntrusiveMap<>::IntrusiveMap<>()

+40

fit::internal::target<>::ops

+60

pw::containers::internal::AATree<>::AATree()

+46

pw::containers::size_report::MeasureContainer<>()

+36

pw::containers::size_report::GetContainer<>()

+18

fit::internal::target<>::invoke()

+30

pw::IntrusiveMap<>::equal_range()

+28

pw::containers::internal::KeyedAATree<>::insert<>()

+20

pw::containers::size_report::Measure()

+24

pw::IntrusiveMap<>::insert()

-2

pw::allocator::LibCAllocator::DoReallocate()

+22

pw::containers::internal::AATree<>::~AATree()

+20

pw::IntrusiveMap<>::find()

+18

pw::IntrusiveMap<>::begin()

+18

pw::IntrusiveMap<>::end()

+18

pw::IntrusiveMap<>::erase()

+2

pw::containers::internal::GenericAATree::~GenericAATree()

-4

vClearInterruptMaskFromISR

+8

pw::IntrusiveMap<>::IntrusiveMap()

NEW

+170

_ZN2pw10containers11size_report19MeasureIntrusiveMapIjNS1_7MapPairIjyEETpTnRiJENSt3__211__wrap_iterIPS4_EEEEiT2_SA_j

+648

RAM

+240

pw::containers::size_report::GetPairs<>()::pairs

+36

pw::containers::size_report::GetContainer<>()::container

+276

IntrusiveMultiMap

FLASH

+356

[section .rodata]

+2

pw::containers::size_report::SetBaseline()

+2

pw::allocator::Layout::Of<>()

-2

pw::Allocator::Reallocate()

+4

pw::containers::size_report::Measure()

+2

pw::allocator::LibCAllocator::DoReallocate()

+8

vClearInterruptMaskFromISR

NEW

+188

pw::containers::internal::KeyedAATree<>::InsertImpl()

NEW

+184

pw::containers::internal::AATreeItem::Rebalance()

NEW

+170

_ZN2pw10containers11size_report24MeasureIntrusiveMultiMapIjNS1_12MultiMapPairIjjEETpTnRiJENSt3__211__wrap_iterIPS4_EEEEiT2_SA_j

NEW

+136

pw::containers::internal::AATreeItem::Unmap()

NEW

+98

pw::containers::internal::KeyedAATree<>::insert()

NEW

+90

pw::containers::internal::AATreeItem::Split()

NEW

+86

pw::containers::internal::KeyedAATree<>::GetLowerBoundImpl()

NEW

+84

pw::containers::internal::KeyedAATree<>::GetUpperBoundImpl()

NEW

+84

pw::containers::internal::KeyedAATree<>::find()

NEW

+78

pw::IntrusiveMultiMap<>::IntrusiveMultiMap<>()

NEW

+72

pw::containers::internal::AATreeIterator<>::operator++()

NEW

+68

pw::containers::internal::AATreeItem::Skew()

NEW

+60

fit::internal::target<>::ops

NEW

+60

pw::containers::internal::AATree<>::AATree()

NEW

+56

pw::containers::internal::GenericAATree::erase_one()

NEW

+56

pw::containers::internal::KeyedAATree<>::KeyedAATree()

NEW

+56

pw::containers::internal::KeyedAATree<>::merge()

NEW

+46

pw::containers::size_report::MeasureContainer<>()

NEW

+44

pw::PackedPtr<>::set()

NEW

+44

pw::PackedPtr<>::set_packed_value()

NEW

+44

pw::containers::internal::KeyedAATree<>::count()

NEW

+42

pw::containers::internal::AATreeItem::GetPredecessor()

NEW

+42

pw::containers::internal::AATreeItem::GetSuccessor()

NEW

+42

pw::containers::internal::AATreeItem::IsMapped()

NEW

+42

pw::containers::internal::GenericAATree::end()

NEW

+40

pw::containers::internal::AATreeItem::GetTreeSize()

NEW

+40

pw::containers::internal::AATreeItem::SetLevel()

NEW

+40

pw::containers::internal::CheckIntrusiveContainerIsEmpty()

NEW

+38

_ZNSt3__210__distanceB8nn210000IN2pw10containers8internal14AATreeIteratorINS3_10AATreeItemEEEEENS_15iterator_traitsIT_E15difference_typeES8_S8_NS_18input_iterator_tagE

NEW

+38

pw::containers::internal::AATreeItem::Replace()

NEW

+36

pw::containers::internal::KeyedAATree<>::equal_range()

NEW

+36

pw::containers::size_report::GetContainer<>()

NEW

+34

pw::containers::internal::KeyedAATree<>::lower_bound()

NEW

+34

pw::containers::internal::KeyedAATree<>::upper_bound()

NEW

+32

pw::containers::internal::KeyedAATree<>::~KeyedAATree()

NEW

+30

fit::internal::target<>::invoke()

NEW

+30

pw::IntrusiveMultiMap<>::equal_range()

NEW

+30

pw::containers::internal::AATreeItem::SetRight()

NEW

+28

_ZNSt3__28distanceB8nn210000IN2pw10containers8internal14AATreeIteratorINS3_10AATreeItemEEEEENS_15iterator_traitsIT_E15difference_typeES8_S8_

NEW

+28

pw::containers::internal::AATreeItem::SetLeft()

NEW

+28

pw::containers::internal::KeyedAATree<>::insert<>()

NEW

+26

fit::internal::inline_trivial_target_move<>()

NEW

+26

pw::containers::internal::GenericAATree::begin()

NEW

+22

pw::containers::internal::AATree<>::~AATree()

NEW

+22

pw::containers::internal::AATreeItem::GetLevel()

NEW

+20

pw::IntrusiveMultiMap<>::find()

NEW

+20

pw::IntrusiveMultiMap<>::insert()

NEW

+18

pw::IntrusiveMultiMap<>::begin()

NEW

+18

pw::IntrusiveMultiMap<>::end()

NEW

+18

pw::IntrusiveMultiMap<>::erase()

NEW

+18

pw::containers::internal::GenericAATree::size()

NEW

+18

pw::containers::internal::GenericAATree::~GenericAATree()

NEW

+16

pw::containers::internal::GenericAATree::SetRoot()

NEW

+14

pw::containers::internal::AATreeItem::GetLeftmost()

NEW

+14

pw::containers::internal::AATreeItem::GetRightmost()

NEW

+14

pw::containers::internal::AATreeItem::GetRoot()

NEW

+10

pw::containers::internal::AATreeItem::Reset()

NEW

+10

pw::containers::internal::GenericAATree::swap()

NEW

+8

pw::IntrusiveMultiMap<>::IntrusiveMultiMap()

NEW

+2

fit::internal::inline_target_get()

+3,200

RAM

+8

[section .data]

+1

__Thumbv6MABSLongThunk_best_effort_wfe_or_timeout

NEW

+199

pw::containers::size_report::GetPairs<>()::pairs

NEW

+36

pw::containers::size_report::GetContainer<>()::container

+244

Additional IntrusiveMultiMap with different key type

(ALL)

0

Additional IntrusiveMultiMap with different key and value types

FLASH

-2

pw::containers::size_report::SetBaseline()

+78

pw::IntrusiveMultiMap<>::IntrusiveMultiMap<>()

+40

fit::internal::target<>::ops

+60

pw::containers::internal::AATree<>::AATree()

+46

pw::containers::size_report::MeasureContainer<>()

+36

pw::containers::size_report::GetContainer<>()

+18

fit::internal::target<>::invoke()

+30

pw::IntrusiveMultiMap<>::equal_range()

+16

pw::containers::size_report::Measure()

-2

pw::allocator::LibCAllocator::DoReallocate()

+22

pw::containers::internal::AATree<>::~AATree()

+20

pw::IntrusiveMultiMap<>::find()

+20

pw::IntrusiveMultiMap<>::insert()

+18

pw::IntrusiveMultiMap<>::begin()

+18

pw::IntrusiveMultiMap<>::end()

+18

pw::IntrusiveMultiMap<>::erase()

+2

pw::containers::internal::GenericAATree::~GenericAATree()

+8

pw::IntrusiveMultiMap<>::IntrusiveMultiMap()

NEW

+170

_ZN2pw10containers11size_report24MeasureIntrusiveMultiMapIjNS1_12MultiMapPairIjyEETpTnRiJENSt3__211__wrap_iterIPNS3_IjjEEEEEEiT2_SB_j

+616

RAM

+36

pw::containers::size_report::GetContainer<>()::container

+36

IntrusiveMap and IntrusiveMultiMap

FLASH

+356

[section .rodata]

+2

pw::allocator::Layout::Of<>()

-2

pw::Allocator::Reallocate()

+24

pw::containers::size_report::Measure()

+4

vClearInterruptMaskFromISR

NEW

+188

pw::containers::internal::KeyedAATree<>::InsertImpl()

NEW

+184

pw::containers::internal::AATreeItem::Rebalance()

NEW

+170

_ZN2pw10containers11size_report19MeasureIntrusiveMapIjNS1_7MapPairIjjEETpTnRiJENSt3__211__wrap_iterIPS4_EEEEiT2_SA_j

NEW

+170

_ZN2pw10containers11size_report24MeasureIntrusiveMultiMapIjNS1_12MultiMapPairIjjEETpTnRiJENSt3__211__wrap_iterIPS4_EEEEiT2_SA_j

NEW

+136

pw::containers::internal::AATreeItem::Unmap()

NEW

+120

pw::containers::internal::AATree<>::AATree()

NEW

+100

fit::internal::target<>::ops

NEW

+98

pw::containers::internal::KeyedAATree<>::insert()

NEW

+92

pw::containers::size_report::MeasureContainer<>()

NEW

+90

pw::containers::internal::AATreeItem::Split()

NEW

+86

pw::containers::internal::KeyedAATree<>::GetLowerBoundImpl()

NEW

+84

pw::containers::internal::KeyedAATree<>::GetUpperBoundImpl()

NEW

+84

pw::containers::internal::KeyedAATree<>::find()

NEW

+78

pw::IntrusiveMap<>::IntrusiveMap<>()

NEW

+78

pw::IntrusiveMultiMap<>::IntrusiveMultiMap<>()

NEW

+72

pw::containers::internal::AATreeIterator<>::operator++()

NEW

+72

pw::containers::size_report::GetContainer<>()

NEW

+68

pw::containers::internal::AATreeItem::Skew()

NEW

+56

pw::containers::internal::GenericAATree::erase_one()

NEW

+56

pw::containers::internal::KeyedAATree<>::KeyedAATree()

NEW

+56

pw::containers::internal::KeyedAATree<>::insert<>()

NEW

+56

pw::containers::internal::KeyedAATree<>::merge()

NEW

+48

fit::internal::target<>::invoke()

NEW

+44

pw::PackedPtr<>::set()

NEW

+44

pw::PackedPtr<>::set_packed_value()

NEW

+44

pw::containers::internal::AATree<>::~AATree()

NEW

+44

pw::containers::internal::KeyedAATree<>::count()

NEW

+42

pw::containers::internal::AATreeItem::GetPredecessor()

NEW

+42

pw::containers::internal::AATreeItem::GetSuccessor()

NEW

+42

pw::containers::internal::AATreeItem::IsMapped()

NEW

+42

pw::containers::internal::GenericAATree::end()

NEW

+40

pw::containers::internal::AATreeItem::GetTreeSize()

NEW

+40

pw::containers::internal::AATreeItem::SetLevel()

NEW

+40

pw::containers::internal::CheckIntrusiveContainerIsEmpty()

NEW

+38

_ZNSt3__210__distanceB8nn210000IN2pw10containers8internal14AATreeIteratorINS3_10AATreeItemEEEEENS_15iterator_traitsIT_E15difference_typeES8_S8_NS_18input_iterator_tagE

NEW

+38

pw::containers::internal::AATreeItem::Replace()

NEW

+36

pw::containers::internal::KeyedAATree<>::equal_range()

NEW

+34

pw::containers::internal::KeyedAATree<>::lower_bound()

NEW

+34

pw::containers::internal::KeyedAATree<>::upper_bound()

NEW

+32

pw::containers::internal::KeyedAATree<>::~KeyedAATree()

NEW

+30

pw::IntrusiveMap<>::equal_range()

NEW

+30

pw::IntrusiveMultiMap<>::equal_range()

NEW

+30

pw::containers::internal::AATreeItem::SetRight()

NEW

+28

_ZNSt3__28distanceB8nn210000IN2pw10containers8internal14AATreeIteratorINS3_10AATreeItemEEEEENS_15iterator_traitsIT_E15difference_typeES8_S8_

NEW

+28

pw::containers::internal::AATreeItem::SetLeft()

NEW

+26

fit::internal::inline_trivial_target_move<>()

NEW

+26

pw::containers::internal::GenericAATree::begin()

NEW

+24

pw::IntrusiveMap<>::insert()

NEW

+22

pw::containers::internal::AATreeItem::GetLevel()

NEW

+20

pw::IntrusiveMap<>::find()

NEW

+20

pw::IntrusiveMultiMap<>::find()

NEW

+20

pw::IntrusiveMultiMap<>::insert()

NEW

+20

pw::containers::internal::GenericAATree::~GenericAATree()

NEW

+18

pw::IntrusiveMap<>::begin()

NEW

+18

pw::IntrusiveMap<>::end()

NEW

+18

pw::IntrusiveMap<>::erase()

NEW

+18

pw::IntrusiveMultiMap<>::begin()

NEW

+18

pw::IntrusiveMultiMap<>::end()

NEW

+18

pw::IntrusiveMultiMap<>::erase()

NEW

+18

pw::containers::internal::GenericAATree::size()

NEW

+16

pw::containers::internal::GenericAATree::SetRoot()

NEW

+14

pw::containers::internal::AATreeItem::GetLeftmost()

NEW

+14

pw::containers::internal::AATreeItem::GetRightmost()

NEW

+14

pw::containers::internal::AATreeItem::GetRoot()

NEW

+10

pw::containers::internal::AATreeItem::Reset()

NEW

+10

pw::containers::internal::GenericAATree::swap()

NEW

+8

pw::IntrusiveMap<>::IntrusiveMap()

NEW

+8

pw::IntrusiveMultiMap<>::IntrusiveMultiMap()

NEW

+2

fit::internal::inline_target_get()

+3,848

RAM

+1

__Thumbv6MABSLongThunk_best_effort_wfe_or_timeout

NEW

+399

pw::containers::size_report::GetPairs<>()::pairs

NEW

+72

pw::containers::size_report::GetContainer<>()::container

+472