// General includes.
#include "cl_sysdep.h"
-CL_PROVIDE(cl_UP_named)
-
// Specification.
#include "cln/univpoly.h"
return false;
}
-static const cl_wht_from_rcpointer2_to_rcpointer univpoly_ring_table = cl_wht_from_rcpointer2_to_rcpointer(maygc_htentry);
+class named_univpoly_ring_cache
+{
+ static cl_wht_from_rcpointer2_to_rcpointer* univpoly_ring_table;
+ static int count;
+public:
+ named_univpoly_ring_cache();
+ ~named_univpoly_ring_cache();
+
+ inline cl_univpoly_ring* get_univpoly_ring(const cl_ring& r, const cl_symbol& v)
+ {
+ return (cl_univpoly_ring*) univpoly_ring_table->get(r,v);
+ }
+ inline void store_univpoly_ring(const cl_univpoly_ring& R)
+ {
+ univpoly_ring_table->put(R->basering(),
+ ((cl_varname_property*)(R->get_property(cl_univpoly_varname_key)))->varname,
+ R);
+ }
+};
-static inline cl_univpoly_ring* get_univpoly_ring (const cl_ring& r, const cl_symbol& v)
+cl_wht_from_rcpointer2_to_rcpointer* named_univpoly_ring_cache::univpoly_ring_table = 0;
+int named_univpoly_ring_cache::count = 0;
+
+named_univpoly_ring_cache::named_univpoly_ring_cache()
{
- return (cl_univpoly_ring*) univpoly_ring_table.get(r,v);
+ if (count++ == 0)
+ univpoly_ring_table = new cl_wht_from_rcpointer2_to_rcpointer(maygc_htentry);
}
-static inline void store_univpoly_ring (const cl_univpoly_ring& R)
+
+named_univpoly_ring_cache::~named_univpoly_ring_cache()
{
- univpoly_ring_table.put(R->basering(), ((cl_varname_property*)(R->get_property(cl_univpoly_varname_key)))->varname,
- R);
+ if (--count == 0)
+ delete univpoly_ring_table;
}
-
const cl_univpoly_ring find_univpoly_ring (const cl_ring& r, const cl_symbol& varname)
{
- var cl_univpoly_ring* ring_in_table = get_univpoly_ring(r,varname);
+ static named_univpoly_ring_cache cache;
+ var cl_univpoly_ring* ring_in_table = cache.get_univpoly_ring(r,varname);
if (!ring_in_table) {
var cl_univpoly_ring R = cl_make_univpoly_ring(r,varname);
- store_univpoly_ring(R);
- ring_in_table = get_univpoly_ring(r,varname);
+ cache.store_univpoly_ring(R);
+ ring_in_table = cache.get_univpoly_ring(r,varname);
if (!ring_in_table)
throw runtime_exception();
}
} // namespace cln
-CL_PROVIDE_END(cl_UP_named)