diff --git a/include/xo/object2/StringOps.hpp b/include/xo/object2/StringOps.hpp index a8e231e..96d9da1 100644 --- a/include/xo/object2/StringOps.hpp +++ b/include/xo/object2/StringOps.hpp @@ -19,13 +19,21 @@ namespace xo { using AAllocator = xo::mm::AAllocator; using size_type = DString::size_type; + /** wrapper for DString.empty() **/ template static obj empty(obj mm, size_type cap); + /** wrapper for DString.from_cstr() **/ template static obj from_cstr(obj mm, const char * cstr); + + /** wrapper for DString.clone() **/ + template + static obj clone(obj mm, + obj src); }; template @@ -41,6 +49,13 @@ namespace xo { { return obj(DString::from_cstr(mm, cstr)); } + + template + obj + StringOps::clone(obj mm, obj src) + { + return obj(DString::clone(mm, src.data())); + } } } diff --git a/utest/StringOps.test.cpp b/utest/StringOps.test.cpp index bfd3fbd..2fabb0e 100644 --- a/utest/StringOps.test.cpp +++ b/utest/StringOps.test.cpp @@ -64,6 +64,23 @@ namespace xo { REQUIRE(s.data()->size() == 11); REQUIRE(std::strcmp(s.data()->chars(), cstr) == 0); } + + TEST_CASE("StringOps-clone", "[object2][StringOps]") + { + ArenaConfig cfg { .name_ = "testarena", + .size_ = 4*1024 }; + DArena arena = DArena::map(cfg); + auto alloc = with_facet::mkobj(&arena); + + auto src = StringOps::from_cstr(alloc, "hello world"); + auto copy = StringOps::clone(alloc, src); + + REQUIRE(copy.data() != nullptr); + REQUIRE(copy.data() != src.data()); + REQUIRE(copy.data()->size() == src.data()->size()); + REQUIRE(copy.data()->capacity() == src.data()->capacity()); + REQUIRE(std::strcmp(copy.data()->chars(), src.data()->chars()) == 0); + } } /*namespace ut*/ } /*namespace xo*/