From 87ddccd7172bac60a211d011294aa95750479420 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 16 Jan 2026 13:05:58 -0500 Subject: [PATCH] xo-expression2: + DUniqueString, use in StringTable --- include/xo/object2/DString.hpp | 23 ++++++++++++++++++++++- src/object2/DString.cpp | 30 ++++++++++++++++++++++++++---- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/include/xo/object2/DString.hpp b/include/xo/object2/DString.hpp index 2092f7d..f35fe44 100644 --- a/include/xo/object2/DString.hpp +++ b/include/xo/object2/DString.hpp @@ -73,11 +73,18 @@ namespace xo { const char * cstr); /** create string containing a copy of @p sv. - * Use memory from allocator @p mm + * Use memory from allocator @p mm. **/ static DString * from_view(obj mm, std::string_view sv); + /** create string containing a copy of @p sv. + * Use memory from allocator @p mm via sub_alloc. + * (load-bearing for StringTable) + **/ + static DString * from_view_suballoc(obj mm, + std::string_view sv); + /** clone existing string **/ static DString * clone(obj mm, const DString * src); @@ -244,6 +251,20 @@ namespace xo { ///@} + private: + /** @defgroup dstring-impl-methods implementation methods **/ + ///@{ + + /** create instance from view @p sv, using memory from @p mm. + * @p suballoc_flag chooses whether to use alloc() or suballoc(). + * Load-bearing for StringTable + **/ + static DString * _from_view_aux(obj mm, + std::string_view sv, + bool suballoc_flag); + + ///@} + private: /** @defgroup dstring-instance-variables instance variables **/ ///@{ diff --git a/src/object2/DString.cpp b/src/object2/DString.cpp index 93bdf5b..ee9885b 100644 --- a/src/object2/DString.cpp +++ b/src/object2/DString.cpp @@ -58,16 +58,24 @@ namespace xo { } DString * - DString::from_view(obj mm, - std::string_view sv) + DString::_from_view_aux(obj mm, + std::string_view sv, + bool suballoc_flag) { size_type len = sv.size(); size_type cap = len + 1; - void * mem = mm.alloc(typeseq::id(), - sizeof(DString) + cap); + auto tseq = typeseq::id(); + void * mem = nullptr; + size_type mem_z = sizeof(DString) + cap; + + if (suballoc_flag) + mem = mm.sub_alloc(mem_z, false /*!complete_flag*/); + else + mem = mm.alloc(tseq, mem_z); DString * result = new (mem) DString(); + result->capacity_ = cap; result->size_ = len; std::memcpy(result->chars_, sv.data(), len); @@ -76,6 +84,20 @@ namespace xo { return result; } + DString * + DString::from_view(obj mm, + std::string_view sv) + { + return _from_view_aux(mm, sv, false /*!suballoc_flag*/); + } + + DString * + DString::from_view_suballoc(obj mm, + std::string_view sv) + { + return _from_view_aux(mm, sv, true /*suballoc_flag*/); + } + DString * DString::clone(obj mm, const DString * src) {