X-Git-Url: https://ginac.de/CLN/cln.git//cln.git?a=blobdiff_plain;f=src%2Finteger%2Fring%2Fcl_I_ring.cc;h=bdbedf71bcd8e3555dc1bc4fb88054fa4b2be5ba;hb=3af2cde18b3aabed4c808b0113daa81c2263b0bd;hp=817715f63138a5514d658f9cef26abdd079312ab;hpb=dd9e0f894eec7e2a8cf85078330ddc0a6639090b;p=cln.git diff --git a/src/integer/ring/cl_I_ring.cc b/src/integer/ring/cl_I_ring.cc index 817715f..bdbedf7 100644 --- a/src/integer/ring/cl_I_ring.cc +++ b/src/integer/ring/cl_I_ring.cc @@ -1,30 +1,32 @@ // Ring of integers. // General includes. -#include "cl_sysdep.h" - -CL_PROVIDE(cl_I_ring) +#include "base/cl_sysdep.h" // Specification. -#include "cl_integer_ring.h" +#include "cln/integer_ring.h" // Implementation. -#include "cl_integer.h" -#include "cl_integer_io.h" -#include "cl_I.h" +#include "cln/integer.h" +#include "cln/integer_io.h" +#define zerop zerop_inline +#include "integer/cl_I.h" +#undef zerop + +namespace cln { -static void I_fprint (cl_heap_ring* R, cl_ostream stream, const _cl_ring_element& x) +static void I_fprint (cl_heap_ring* R, std::ostream& stream, const _cl_ring_element& x) { - unused R; + cl_unused R; fprint(stream,The(cl_I)(x)); } -static cl_boolean I_equal (cl_heap_ring* R, const _cl_ring_element& x, const _cl_ring_element& y) +static bool I_equal (cl_heap_ring* R, const _cl_ring_element& x, const _cl_ring_element& y) { - unused R; - return cl_equal(The(cl_I)(x),The(cl_I)(y)); + cl_unused R; + return equal(The(cl_I)(x),The(cl_I)(y)); } static const _cl_ring_element I_zero (cl_heap_ring* R) @@ -32,10 +34,10 @@ static const _cl_ring_element I_zero (cl_heap_ring* R) return _cl_ring_element(R, (cl_I)0); } -static cl_boolean I_zerop (cl_heap_ring* R, const _cl_ring_element& x) +static bool CL_FLATTEN I_zerop (cl_heap_ring* R, const _cl_ring_element& x) { - unused R; - return zerop(The(cl_I)(x)); + cl_unused R; + return zerop_inline(The(cl_I)(x)); } static const _cl_ring_element I_plus (cl_heap_ring* R, const _cl_ring_element& x, const _cl_ring_element& y) @@ -78,13 +80,11 @@ static const _cl_ring_element I_expt_pos (cl_heap_ring* R, const _cl_ring_elemen return _cl_ring_element(R, expt_pos(The(cl_I)(x),y)); } -static cl_boolean cl_I_p (const cl_number& x) +static bool cl_I_p (const cl_number& x) { - return (cl_boolean) - (!x.pointer_p() + return (!x.pointer_p() ? x.nonpointer_tag() == cl_FN_tag - : x.pointer_type() == &cl_class_bignum - ); + : x.pointer_type() == &cl_class_bignum); } static cl_ring_setops I_setops = { @@ -108,7 +108,7 @@ static cl_ring_mulops I_mulops = { static cl_number_ring_ops I_ops = { cl_I_p, - cl_equal, + equal, zerop, operator+, operator-, @@ -137,20 +137,39 @@ static void cl_integer_ring_destructor (cl_heap* pointer) static void cl_integer_ring_dprint (cl_heap* pointer) { - unused pointer; + cl_unused pointer; fprint(cl_debugout, "(cl_integer_ring) cl_I_ring"); } -cl_class cl_class_integer_ring = { - cl_integer_ring_destructor, - cl_class_flags_number_ring, - cl_integer_ring_dprint -}; +cl_class cl_class_integer_ring; +static cl_heap_integer_ring* cl_heap_integer_ring_instance; // Constructor. +template <> inline cl_integer_ring::cl_specialized_number_ring () - : cl_number_ring (new cl_heap_integer_ring()) {} + : cl_number_ring(cl_heap_integer_ring_instance) {} + +const cl_integer_ring cl_I_ring = cl_I_ring; + +int cl_I_ring_init_helper::count = 0; + +cl_I_ring_init_helper::cl_I_ring_init_helper() +{ + if (count++ == 0) { + cl_class_integer_ring.destruct = cl_integer_ring_destructor; + cl_class_integer_ring.flags = cl_class_flags_number_ring; + cl_class_integer_ring.dprint = cl_integer_ring_dprint; + cl_heap_integer_ring_instance = new cl_heap_integer_ring(); + new ((void *)&cl_I_ring) cl_integer_ring(); + } +} + +cl_I_ring_init_helper::~cl_I_ring_init_helper() +{ + if (--count == 0) { + delete cl_heap_integer_ring_instance; + } +} -const cl_integer_ring cl_I_ring; +} // namespace cln -CL_PROVIDE_END(cl_I_ring)