/** @file StringOps.hpp * * @author Roland Conybeare, Jan 2026 **/ #pragma once #include "string/IGCObject_DString.hpp" #include "DString.hpp" namespace xo { namespace scm { /** @brief string functions * * note: separate from DString **/ struct StringOps { using AGCObject = xo::mm::AGCObject; 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); /** wrapper for DString.printf() **/ template static obj printf(obj mm, size_type cap, const char * fmt, Args&&... args); }; template obj StringOps::empty(obj mm, size_type cap) { return obj(DString::empty(mm, cap)); } template obj StringOps::from_cstr(obj mm, const char * cstr) { return obj(DString::from_cstr(mm, cstr)); } template obj StringOps::clone(obj mm, obj src) { return obj(DString::clone(mm, src.data())); } template obj StringOps::printf(obj mm, size_type cap, const char * fmt, Args&&... args) { return obj(DString::printf(mm, cap, fmt, std::forward(args)...)); } } } /* end StringOps.hpp */