/** @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, BinaryOp cmplt) : multiply_{multiply}, divide_{divide}, add_{add}, subtract_{subtract}, cmpeq_{cmpeq}, cmpne_{cmpne}, cmplt_{cmplt} {} BinaryOp multiply_ = nullptr; BinaryOp divide_ = nullptr; BinaryOp add_ = nullptr; BinaryOp subtract_ = nullptr; /** compare numerics (==) **/ BinaryOp cmpeq_ = nullptr; /** compare numerics (!=) **/ BinaryOp cmpne_ = nullptr; /** compare numerics (<) **/ BinaryOp cmplt_ = 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, BinaryOp_Impl cmplt) { return AnonymizedNumericOps(reinterpret_cast(multiply), reinterpret_cast(divide), reinterpret_cast(add), reinterpret_cast(subtract), reinterpret_cast(cmpeq), reinterpret_cast(cmpne), reinterpret_cast(cmplt)); } }; } /*namespace scm*/ } /*namespace xo*/ /* end NumericOps.hpp */