/** @file numeric_register_primitives.cpp * * @author Roland Conybeare, Mar 2026 **/ #include "numeric_register_primitives.hpp" #include "NumericPrimitives.hpp" #include "NumericDispatch.hpp" #include #include namespace xo { using xo::mm::AAllocator; using xo::scope; namespace scm { namespace { bool install_aux(InstallSink sink, DPrimitive_gco_2_gco_gco * pm, InstallFlags flags) { if (flags != InstallFlags::f_none) { return sink(pm->name(), pm->fn_td(), obj(pm), flags); } else { return true; } } bool install_aux(InstallSink sink, obj mm, std::string_view name, obj (*impl)(obj rcx, obj x, obj y), InstallFlags flags) { if (flags != InstallFlags::f_none) { auto pm = DPrimitive_gco_2_gco_gco::_make(mm, name, impl); return install_aux(sink, pm, flags); } else { return true; } } } bool numeric_register_primitives(obj mm, InstallSink sink, InstallFlags flags) { scope log(XO_DEBUG(true)); bool ok = true; ok = ok & install_aux(sink, NumericPrimitives::make_multiply_pm(mm), flags & InstallFlags::f_essential); ok = ok & install_aux(sink, NumericPrimitives::make_divide_pm(mm), flags & InstallFlags::f_essential); ok = ok & install_aux(sink, mm, "_add", &NumericDispatch::add, flags & InstallFlags::f_essential); ok = ok & install_aux(sink, mm, "_sub", &NumericDispatch::subtract, flags & InstallFlags::f_essential); ok = ok & install_aux(sink, mm, "_cmpeq", &NumericDispatch::cmp_equal, flags & InstallFlags::f_essential); ok = ok & install_aux(sink, mm, "_cmpne", &NumericDispatch::cmp_notequal, flags & InstallFlags::f_essential); ok = ok & install_aux(sink, mm, "_cmplt", &NumericDispatch::cmp_less, flags & InstallFlags::f_essential); return ok; } } } /*namespace xo*/ /* end numeric_register_primitives.cpp */