/** @file NumericOps.hpp * * @author Roland Conybeare, Feb 2026 **/ #pragma once #include #include #include #include namespace xo { namespace scm { class AnonymizedNumericOps { public: using ARuntimeContext = xo::scm::ARuntimeContext; using AGCObject = xo::mm::AGCObject; using BinaryOp = obj (*)(obj mm, void * x, void * y); public: /** note: null ctor load-bearing for membership in DArenaHashTable **/ AnonymizedNumericOps() = default; /** @p multiply to multiply (x,y); allocate from mm **/ explicit AnonymizedNumericOps(BinaryOp multiply, BinaryOp divide, BinaryOp add, BinaryOp subtract, BinaryOp cmpeq, BinaryOp cmpne) : multiply_{multiply}, divide_{divide}, add_{add}, subtract_{subtract}, cmpeq_{cmpeq}, cmpne_{cmpne} {} BinaryOp multiply_ = nullptr; BinaryOp divide_ = nullptr; BinaryOp add_ = nullptr; BinaryOp subtract_ = nullptr; /** compare numerics for equality **/ BinaryOp cmpeq_ = nullptr; /** compare numerics for inequality **/ BinaryOp cmpne_ = nullptr; }; template class NumericOps { public: using ARuntimeContext = xo::scm::ARuntimeContext; using AGCObject = xo::mm::AGCObject; using BinaryOp_Impl = obj (*)(obj rcx, DRepr1 * x, DRepr2 * y); using BinaryOp_Anon = AnonymizedNumericOps::BinaryOp; public: static AnonymizedNumericOps make(BinaryOp_Impl multiply, BinaryOp_Impl divide, BinaryOp_Impl add, BinaryOp_Impl subtract, BinaryOp_Impl cmpeq, BinaryOp_Impl cmpne) { return AnonymizedNumericOps(reinterpret_cast(multiply), reinterpret_cast(divide), reinterpret_cast(add), reinterpret_cast(subtract), reinterpret_cast(cmpeq), reinterpret_cast(cmpne)); } }; } /*namespace scm*/ } /*namespace xo*/ /* end NumericOps.hpp */