diff --git a/include/xo/expression2/StringTable.hpp b/include/xo/expression2/StringTable.hpp index 471fbc0d..b55c48ee 100644 --- a/include/xo/expression2/StringTable.hpp +++ b/include/xo/expression2/StringTable.hpp @@ -21,6 +21,7 @@ namespace xo { class StringTable { public: using DArena = xo::mm::DArena; + using MemorySizeInfo = xo::mm::MemorySizeInfo; using StringMap = xo::map::DArenaHashMap; using size_type = StringMap::size_type; @@ -45,6 +46,9 @@ namespace xo { **/ bool verify_ok(verify_policy p = verify_policy::throw_only()) const; + std::size_t _n_store() const noexcept; + MemorySizeInfo _store_info(std::size_t i) const noexcept; + private: /** allocate string storage in this arena; use DString to represent each string. * Can't use DArenaVector b/c DString has variable size diff --git a/src/expression2/StringTable.cpp b/src/expression2/StringTable.cpp index f59bb24d..79a17067 100644 --- a/src/expression2/StringTable.cpp +++ b/src/expression2/StringTable.cpp @@ -10,6 +10,7 @@ namespace xo { using xo::mm::ArenaConfig; using xo::mm::AAllocator; + using xo::mm::MemorySizeInfo; using xo::facet::with_facet; using xo::facet::obj; @@ -159,6 +160,24 @@ namespace xo { return true; } + std::size_t + StringTable::_n_store() const noexcept + { + return 1 + map_._n_store(); + } + + MemorySizeInfo + StringTable::_store_info(std::size_t i) const noexcept + { + if (i == 0) + return strings_._store_info(); + + if (i+1 < map_._n_store()) + return map_._store_info(i-1); + + return MemorySizeInfo::sentinel(); + } + } /*namespace scm*/ } /*namespace xo*/