From 78e7548e530bd803335ddce20913438590067b00 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 14 Jan 2026 14:37:44 -0500 Subject: [PATCH] xo-object2 xo-gc xo-facet: codegen updates + IGCObject_DString --- CMakeLists.txt | 12 +++++ idl/IGCObject_DString.json5 | 14 +++++ include/xo/object2/DString.hpp | 44 +++++++++++++++- include/xo/object2/IGCObject_DString.hpp | 66 ++++++++++++++++++++++++ src/object2/CMakeLists.txt | 1 + src/object2/DString.cpp | 42 +++++++++++++++ src/object2/IGCObject_DString.cpp | 39 ++++++++++++++ src/object2/object2_register_facets.cpp | 6 +++ utest/DString.test.cpp | 17 ++++++ 9 files changed, 240 insertions(+), 1 deletion(-) create mode 100644 idl/IGCObject_DString.json5 create mode 100644 include/xo/object2/IGCObject_DString.hpp create mode 100644 src/object2/IGCObject_DString.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4dfdf4d..556e6d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,18 @@ xo_add_genfacetimpl( OUTPUT_CPP_DIR src/object2 ) +# note: manual target; generated code committed to git +xo_add_genfacetimpl( + TARGET xo-object2-facetimpl-gcobject-string + FACET_PKG xo_gc + FACET GCObject + REPR String + INPUT idl/IGCObject_DString.json5 + OUTPUT_HPP_DIR include/xo/object2 + OUTPUT_IMPL_SUBDIR string + OUTPUT_CPP_DIR src/object2 +) + # ---------------------------------------------------------------- # must complete definition of expression lib before configuring examples diff --git a/idl/IGCObject_DString.json5 b/idl/IGCObject_DString.json5 new file mode 100644 index 0000000..b8fcfba --- /dev/null +++ b/idl/IGCObject_DString.json5 @@ -0,0 +1,14 @@ +{ + mode: "implementation", + includes: [ "", + "" + ], + local_types: [ ], + namespace1: "xo", + namespace2: "scm", + facet_idl: "idl/GCObject.json5", + brief: "provide AGCObject interface for DString", + using_doxygen: true, + repr: "DString", + doc: [ "implement AGCObject for DString" ], +} diff --git a/include/xo/object2/DString.hpp b/include/xo/object2/DString.hpp index 7f8e1ee..accdd96 100644 --- a/include/xo/object2/DString.hpp +++ b/include/xo/object2/DString.hpp @@ -6,7 +6,9 @@ #pragma once #include +#include #include +#include #include #include @@ -38,11 +40,22 @@ namespace xo { using const_iterator = const char *; /** xo allocator **/ using AAllocator = xo::mm::AAllocator; - + /** garbage collector **/ + using ACollector = xo::mm::ACollector; + /** ppindentinfo for APrintable **/ + using ppindentinfo = xo::print::ppindentinfo; ///@} /** @defgroup dstring-ctors constructors **/ ///@{ + /** default ctor **/ + DString() = default; + + /** not simply copyable, because of flexible array. + * Need allocator + **/ + DString(const DString &) = delete; + /** create empty string with space for @cap chars * (including null terminator). * Use memory from allocator @p mm @@ -56,6 +69,17 @@ namespace xo { static DString * from_cstr(obj mm, const char * cstr); + /** clone existing string **/ + static DString * clone(obj mm, + const DString * src); + +#ifdef NOT_YET + /** **/ + static DString * concat(obj mm, + DString * s1, + DString * s2); +#endif + ///@} /** @defgroup dstring-access access methods **/ ///@{ @@ -141,6 +165,24 @@ namespace xo { operator const char * () const noexcept { return &(chars_[0]); } ///@} + /** @defgroup dstring-printable-methods printable facet methods **/ + ///@{ + + bool pretty(const ppindentinfo & ppii) const; + + ///@} + /** @defgroup dstring-gcobject-methods gcobject facet methods **/ + ///@{ + + size_type shallow_size() const noexcept; + + /** clone string, using memory from allocator @p mm **/ + DString * shallow_copy(obj mm) const noexcept; + + /** fixup child pointers (trivial for DString, no children) **/ + size_type forward_children(obj gc) noexcept; + + ///@} private: /** @defgroup dstring-instance-variables instance variables **/ diff --git a/include/xo/object2/IGCObject_DString.hpp b/include/xo/object2/IGCObject_DString.hpp new file mode 100644 index 0000000..ad12cb8 --- /dev/null +++ b/include/xo/object2/IGCObject_DString.hpp @@ -0,0 +1,66 @@ +/** @file IGCObject_DString.hpp + * + * Generated automagically from ingredients: + * 1. code generator: + * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * arguments: + * --input [idl/IGCObject_DString.json5] + * 2. jinja2 template for abstract facet .hpp file: + * [iface_facet_any.hpp.j2] + * 3. idl for facet methods + * [idl/IGCObject_DString.json5] + **/ + +#pragma once + +#include +#include +#include "DString.hpp" + +namespace xo { namespace scm { class IGCObject_DString; } } + +namespace xo { + namespace facet { + template <> + struct FacetImplementation + { + using ImplType = xo::mm::IGCObject_Xfer + ; + }; + } +} + +namespace xo { + namespace scm { + /** @class IGCObject_DString + **/ + class IGCObject_DString { + public: + /** @defgroup scm-gcobject-dstring-type-traits **/ + ///@{ + using size_type = xo::mm::AGCObject::size_type; + using AAllocator = xo::mm::AGCObject::AAllocator; + using ACollector = xo::mm::AGCObject::ACollector; + using Copaque = xo::mm::AGCObject::Copaque; + using Opaque = xo::mm::AGCObject::Opaque; + ///@} + /** @defgroup scm-gcobject-dstring-methods **/ + ///@{ + // const methods + /** memory consumption for this instance **/ + static size_type shallow_size(const DString & self) noexcept; + /** copy instance using allocator **/ + static Opaque shallow_copy(const DString & self, obj mm) noexcept; + + // non-const methods + /** during GC: forward immdiate children **/ + static size_type forward_children(DString & self, obj gc) noexcept; + ///@} + }; + + } /*namespace scm*/ +} /*namespace xo*/ + +/* end */ \ No newline at end of file diff --git a/src/object2/CMakeLists.txt b/src/object2/CMakeLists.txt index a365892..4c74529 100644 --- a/src/object2/CMakeLists.txt +++ b/src/object2/CMakeLists.txt @@ -5,6 +5,7 @@ set(SELF_SRCS IGCObject_DFloat.cpp IGCObject_DInteger.cpp IGCObject_DList.cpp + IGCObject_DString.cpp ISequence_Any.cpp ISequence_DList.cpp IPrintable_DList.cpp diff --git a/src/object2/DString.cpp b/src/object2/DString.cpp index c173d10..3278d25 100644 --- a/src/object2/DString.cpp +++ b/src/object2/DString.cpp @@ -52,6 +52,22 @@ namespace xo { return result; } + DString * + DString::clone(obj mm, const DString * src) + { + size_type cap = src->capacity_; + + void * mem = mm.alloc(typeseq::id(), + sizeof(DString) + cap); + + DString * result = new (mem) DString(); + result->capacity_ = cap; + result->size_ = src->size_; + std::memcpy(result->chars_, src->chars_, cap); + + return result; + } + DString & DString::assign(const DString & other) { @@ -71,6 +87,32 @@ namespace xo { return this->size_; } + auto + DString::shallow_size() const noexcept -> size_type + { + return sizeof(DString) + capacity_; + } + + DString * + DString::shallow_copy(obj mm) const noexcept + { + DString * copy = (DString *)mm.alloc_copy((std::byte *)this); + + if (copy) { + copy->capacity_ = capacity_; + copy->size_ = size_; + ::memcpy(copy->chars_, chars_, capacity_); + } + + return copy; + } + + auto + DString::forward_children(obj) noexcept -> size_type + { + return shallow_size(); + } + } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/object2/IGCObject_DString.cpp b/src/object2/IGCObject_DString.cpp new file mode 100644 index 0000000..72a8124 --- /dev/null +++ b/src/object2/IGCObject_DString.cpp @@ -0,0 +1,39 @@ +/** @file IGCObject_DString.cpp + * + * Generated automagically from ingredients: + * 1. code generator: + * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * arguments: + * --input [idl/IGCObject_DString.json5] + * 2. jinja2 template for abstract facet .hpp file: + * [iface_facet_any.hpp.j2] + * 3. idl for facet methods + * [idl/IGCObject_DString.json5] +**/ + +#include "IGCObject_DString.hpp" + +namespace xo { + namespace scm { + auto + IGCObject_DString::shallow_size(const DString & self) noexcept -> size_type + { + return self.shallow_size(); + } + + auto + IGCObject_DString::shallow_copy(const DString & self, obj mm) noexcept -> Opaque + { + return self.shallow_copy(mm); + } + + auto + IGCObject_DString::forward_children(DString & self, obj gc) noexcept -> size_type + { + return self.forward_children(gc); + } + + } /*namespace scm*/ +} /*namespace xo*/ + +/* end IGCObject_DString.cpp */ \ No newline at end of file diff --git a/src/object2/object2_register_facets.cpp b/src/object2/object2_register_facets.cpp index 210fb7c..c33b063 100644 --- a/src/object2/object2_register_facets.cpp +++ b/src/object2/object2_register_facets.cpp @@ -4,9 +4,11 @@ **/ #include "object2_register_facets.hpp" + #include #include #include +#include #include #include @@ -23,6 +25,7 @@ namespace xo { using xo::mm::AGCObject; using xo::scm::DList; using xo::scm::DFloat; + using xo::scm::DString; using xo::facet::FacetRegistry; using xo::facet::typeseq; @@ -41,9 +44,12 @@ namespace xo { FacetRegistry::register_impl(); FacetRegistry::register_impl(); + FacetRegistry::register_impl(); + log && log(xtag("DList.tseq", typeseq::id())); log && log(xtag("DFloat.tseq", typeseq::id())); log && log(xtag("DInteger.tseq", typeseq::id())); + log && log(xtag("DString.tseq", typeseq::id())); log && log(xtag("AAllocator.tseq", typeseq::id())); log && log(xtag("APrintable.tseq", typeseq::id())); diff --git a/utest/DString.test.cpp b/utest/DString.test.cpp index c6d217f..b5f70f1 100644 --- a/utest/DString.test.cpp +++ b/utest/DString.test.cpp @@ -243,6 +243,23 @@ namespace xo { REQUIRE(std::strcmp(s->chars(), "HELLO") == 0); } + + TEST_CASE("DString-clone", "[object2][DString]") + { + ArenaConfig cfg { .name_ = "testarena", + .size_ = 4*1024 }; + DArena arena = DArena::map(cfg); + auto alloc = with_facet::mkobj(&arena); + + DString * src = DString::from_cstr(alloc, "hello world"); + DString * copy = DString::clone(alloc, src); + + REQUIRE(copy != nullptr); + REQUIRE(copy != src); + REQUIRE(copy->size() == src->size()); + REQUIRE(copy->capacity() == src->capacity()); + REQUIRE(std::strcmp(copy->chars(), src->chars()) == 0); + } } /*namespace ut*/ } /*namespace xo*/