From 2f40959a01a6693b9fbd9e3aa5584f783b052684 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Mon, 26 Jan 2026 18:15:17 -0500 Subject: [PATCH] xo-procedure2: + printable support for Primitive --- xo-procedure2/CMakeLists.txt | 13 ++++ .../IPrintable_DPrimitive_gco_2_gco_gco.json5 | 19 ++++++ .../include/xo/procedure2/DPrimitive.hpp | 38 +++++++++++- .../IPrintable_DPrimitive_gco_2_gco_gco.hpp | 62 +++++++++++++++++++ xo-procedure2/src/procedure2/CMakeLists.txt | 1 + .../IPrintable_DPrimitive_gco_2_gco_gco.cpp | 28 +++++++++ .../procedure2/procedure2_register_facets.cpp | 4 ++ xo-procedure2/utest/DPrimitive.test.cpp | 27 ++++++++ 8 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 xo-procedure2/idl/IPrintable_DPrimitive_gco_2_gco_gco.json5 create mode 100644 xo-procedure2/include/xo/procedure2/detail/IPrintable_DPrimitive_gco_2_gco_gco.hpp create mode 100644 xo-procedure2/src/procedure2/IPrintable_DPrimitive_gco_2_gco_gco.cpp diff --git a/xo-procedure2/CMakeLists.txt b/xo-procedure2/CMakeLists.txt index 04751f1d..ad8673d1 100644 --- a/xo-procedure2/CMakeLists.txt +++ b/xo-procedure2/CMakeLists.txt @@ -55,6 +55,7 @@ xo_add_genfacetimpl( # ---------------------------------------------------------------- +# note: manual target; generated code committed to git xo_add_genfacetimpl( TARGET xo-procedure2-facetimpl-procedure-primitive_gco_2_gco_gco FACET_PKG xo_procedure2 @@ -78,6 +79,18 @@ xo_add_genfacetimpl( OUTPUT_CPP_DIR src/procedure2 ) +# note: manual target; generated code committed to git +xo_add_genfacetimpl( + TARGET xo-procedure2-facetimpl-printable-primitive_gco_2_gco_gco + FACET_PKG xo_printable2 + FACET Printable + REPR Primitive_gco_2_gco_gco + INPUT idl/IPrintable_DPrimitive_gco_2_gco_gco.json5 + OUTPUT_HPP_DIR include/xo/procedure2 + OUTPUT_IMPL_SUBDIR detail + OUTPUT_CPP_DIR src/procedure2 +) + add_subdirectory(src/procedure2) add_subdirectory(utest) diff --git a/xo-procedure2/idl/IPrintable_DPrimitive_gco_2_gco_gco.json5 b/xo-procedure2/idl/IPrintable_DPrimitive_gco_2_gco_gco.json5 new file mode 100644 index 00000000..15cff1b4 --- /dev/null +++ b/xo-procedure2/idl/IPrintable_DPrimitive_gco_2_gco_gco.json5 @@ -0,0 +1,19 @@ +{ + mode: "implementation", + includes: [ + "", + "", +// "", +// "", +// "", +// "", + ], + local_types: [ ], + namespace1: "xo", + namespace2: "scm", + facet_idl: "idl/Printable.json5", + brief: "provide APrintable interface for DPrimitive (gco x gco) -> gco", + using_doxygen: true, + repr: "DPrimitive_gco_2_gco_gco", + doc: [ "implement APrintable for DPrimitive (gco x gco) -> gco" ], +} diff --git a/xo-procedure2/include/xo/procedure2/DPrimitive.hpp b/xo-procedure2/include/xo/procedure2/DPrimitive.hpp index c225246d..90fdba50 100644 --- a/xo-procedure2/include/xo/procedure2/DPrimitive.hpp +++ b/xo-procedure2/include/xo/procedure2/DPrimitive.hpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -58,14 +59,22 @@ namespace xo { template class Primitive { public: + using Traits = detail::PmFnTraits; + using ACollector = xo::mm::ACollector; using AAllocator = xo::mm::AAllocator; using AGCObject = xo::mm::AGCObject; using DArray = xo::scm::DArray; - using Traits = detail::PmFnTraits; + using Reflect = xo::reflect::Reflect; + using TypeDescr = xo::reflect::TypeDescr; + using ppindentinfo = xo::print::ppindentinfo; public: - Primitive(std::string_view name, Fn fn) : name_{name}, fn_{fn} {} + Primitive(std::string_view name, Fn fn) : name_{name}, + fn_td_{Reflect::require()}, + fn_{fn} {} + + TypeDescr fn_td() const noexcept { return fn_td_; } bool is_nary() const noexcept { return false; } static constexpr std::int32_t n_args() noexcept { return Traits::n_args; } @@ -75,6 +84,12 @@ namespace xo { std::make_index_sequence{}); } + /** @defgroup scm-primitive-printable-facet **/ + ///@{ + + bool pretty(const ppindentinfo & ppii) const; + + ///@} /** @defgroup scm-primitive-gcobject-facet **/ ///@{ std::size_t shallow_size() const noexcept; @@ -107,10 +122,29 @@ namespace xo { private: /** name of this primitive **/ std::string_view name_; + + /** type description for function + * Note that this type description will have additional first argument + * for obj + **/ + TypeDescr fn_td_; + /** function implementation **/ Fn fn_; }; /*Primitive*/ + template + bool + Primitive::pretty(const ppindentinfo & ppii) const + { + return ppii.pps()->pretty_struct + (ppii, + "Primitive", + refrtag("name", name_), + refrtag("td", fn_td_), + refrtag("fn", fn_)); + } + template std::size_t Primitive::shallow_size() const noexcept { diff --git a/xo-procedure2/include/xo/procedure2/detail/IPrintable_DPrimitive_gco_2_gco_gco.hpp b/xo-procedure2/include/xo/procedure2/detail/IPrintable_DPrimitive_gco_2_gco_gco.hpp new file mode 100644 index 00000000..b6b0a9c5 --- /dev/null +++ b/xo-procedure2/include/xo/procedure2/detail/IPrintable_DPrimitive_gco_2_gco_gco.hpp @@ -0,0 +1,62 @@ +/** @file IPrintable_DPrimitive_gco_2_gco_gco.hpp + * + * Generated automagically from ingredients: + * 1. code generator: + * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * arguments: + * --input [idl/IPrintable_DPrimitive_gco_2_gco_gco.json5] + * 2. jinja2 template for abstract facet .hpp file: + * [iface_facet_repr.hpp.j2] + * 3. idl for facet methods + * [idl/IPrintable_DPrimitive_gco_2_gco_gco.json5] + **/ + +#pragma once + +#include "Printable.hpp" +#include +#include +#include "DPrimitive_gco_2_gco_gco.hpp" + +namespace xo { namespace scm { class IPrintable_DPrimitive_gco_2_gco_gco; } } + +namespace xo { + namespace facet { + template <> + struct FacetImplementation + { + using ImplType = xo::print::IPrintable_Xfer + ; + }; + } +} + +namespace xo { + namespace scm { + /** @class IPrintable_DPrimitive_gco_2_gco_gco + **/ + class IPrintable_DPrimitive_gco_2_gco_gco { + public: + /** @defgroup scm-printable-dprimitive_gco_2_gco_gco-type-traits **/ + ///@{ + using ppindentinfo = xo::print::APrintable::ppindentinfo; + using Copaque = xo::print::APrintable::Copaque; + using Opaque = xo::print::APrintable::Opaque; + ///@} + /** @defgroup scm-printable-dprimitive_gco_2_gco_gco-methods **/ + ///@{ + // const methods + /** Pretty-printing support for this object. +See [xo-indentlog/xo/indentlog/pretty.hpp] **/ + static bool pretty(const DPrimitive_gco_2_gco_gco & self, const ppindentinfo & ppii); + + // non-const methods + ///@} + }; + + } /*namespace scm*/ +} /*namespace xo*/ + +/* end */ \ No newline at end of file diff --git a/xo-procedure2/src/procedure2/CMakeLists.txt b/xo-procedure2/src/procedure2/CMakeLists.txt index 8ecbc329..92685afb 100644 --- a/xo-procedure2/src/procedure2/CMakeLists.txt +++ b/xo-procedure2/src/procedure2/CMakeLists.txt @@ -12,6 +12,7 @@ set(SELF_SRCS DPrimitive.cpp IGCObject_DPrimitive_gco_2_gco_gco.cpp IProcedure_DPrimitive_gco_2_gco_gco.cpp + IPrintable_DPrimitive_gco_2_gco_gco.cpp # Add source files here, e.g.: # procedure2.cpp ) diff --git a/xo-procedure2/src/procedure2/IPrintable_DPrimitive_gco_2_gco_gco.cpp b/xo-procedure2/src/procedure2/IPrintable_DPrimitive_gco_2_gco_gco.cpp new file mode 100644 index 00000000..2c791324 --- /dev/null +++ b/xo-procedure2/src/procedure2/IPrintable_DPrimitive_gco_2_gco_gco.cpp @@ -0,0 +1,28 @@ +/** @file IPrintable_DPrimitive_gco_2_gco_gco.cpp + * + * Generated automagically from ingredients: + * 1. code generator: + * [/home/roland/proj/xo-umbrella2-claude1/xo-facet/codegen/genfacet] + * arguments: + * --input [idl/IPrintable_DPrimitive_gco_2_gco_gco.json5] + * 2. jinja2 template for abstract facet .hpp file: + * [iface_facet_any.hpp.j2] + * 3. idl for facet methods + * [idl/IPrintable_DPrimitive_gco_2_gco_gco.json5] +**/ + +#include "detail/IPrintable_DPrimitive_gco_2_gco_gco.hpp" + +namespace xo { + namespace scm { + auto + IPrintable_DPrimitive_gco_2_gco_gco::pretty(const DPrimitive_gco_2_gco_gco & self, const ppindentinfo & ppii) -> bool + { + return self.pretty(ppii); + } + + + } /*namespace scm*/ +} /*namespace xo*/ + +/* end IPrintable_DPrimitive_gco_2_gco_gco.cpp */ \ No newline at end of file diff --git a/xo-procedure2/src/procedure2/procedure2_register_facets.cpp b/xo-procedure2/src/procedure2/procedure2_register_facets.cpp index c22b8049..5b84b4dd 100644 --- a/xo-procedure2/src/procedure2/procedure2_register_facets.cpp +++ b/xo-procedure2/src/procedure2/procedure2_register_facets.cpp @@ -8,14 +8,17 @@ #include "DPrimitive_gco_2_gco_gco.hpp" #include "detail/IGCObject_DPrimitive_gco_2_gco_gco.hpp" +#include "detail/IPrintable_DPrimitive_gco_2_gco_gco.hpp" #include +#include #include #include namespace xo { using xo::facet::FacetRegistry; using xo::facet::typeseq; + using xo::print::APrintable; namespace scm { bool @@ -26,6 +29,7 @@ namespace xo { FacetRegistry::register_impl(); FacetRegistry::register_impl(); + FacetRegistry::register_impl(); log && log(xtag("DSimpleRcx.tseq", typeseq::id())); log && log(xtag("DPrimitive_gco_2_gco_gco.tseq", typeseq::id())); diff --git a/xo-procedure2/utest/DPrimitive.test.cpp b/xo-procedure2/utest/DPrimitive.test.cpp index b3775e62..73e807fd 100644 --- a/xo-procedure2/utest/DPrimitive.test.cpp +++ b/xo-procedure2/utest/DPrimitive.test.cpp @@ -7,13 +7,17 @@ #include #include #include +#include #include #include #include #include #include #include +#include +#include #include +#include namespace xo { using xo::scm::Primitives; @@ -22,12 +26,17 @@ namespace xo { using xo::scm::DFloat; using xo::scm::DInteger; using xo::scm::DArray; + using xo::scm::DPrimitive_gco_2_gco_gco; using xo::mm::AAllocator; using xo::mm::AGCObject; using xo::mm::DArena; using xo::mm::ArenaConfig; + using xo::print::APrintable; + using xo::print::ppstate_standalone; + using xo::print::ppconfig; using xo::facet::with_facet; using xo::facet::obj; + using xo::scope; namespace ut { static InitEvidence s_init = InitSubsys::require(); @@ -111,6 +120,24 @@ namespace xo { REQUIRE(result_float.data()->value() == 21.0); } + TEST_CASE("DPrimitive-pretty", "[procedure2][DPrimitive][pp]") + { + scope log(XO_DEBUG(false)); + + std::stringstream ss; + ppconfig ppc; + ppstate_standalone pps(&ss, 0, &ppc); + + obj prim_pr(&Primitives::s_mul_gco_gco_pm); + pps.pretty(prim_pr); + + std::string output = ss.str(); + + log && log(output); + + CHECK(output.find("_mul") != std::string::npos); + } + } /*namespace ut*/ } /*namespace xo*/