@ -3,8 +3,6 @@
// General includes.
// General includes.
# include "cl_sysdep.h"
# include "cl_sysdep.h"
CL_PROVIDE ( cl_UP_unnamed )
// Specification.
// Specification.
# include "cln/univpoly.h"
# include "cln/univpoly.h"
@ -34,26 +32,46 @@ static bool maygc_htentry (const cl_htentry_from_rcpointer_to_rcpointer& entry)
return false ;
return false ;
}
}
static const cl_wht_from_rcpointer_to_rcpointer univpoly_ring_table = cl_wht_from_rcpointer_to_rcpointer ( maygc_htentry ) ;
class univpoly_ring_cache
{
static cl_wht_from_rcpointer_to_rcpointer * univpoly_ring_table ;
static int count ;
public :
inline cl_univpoly_ring * get_univpoly_ring ( const cl_ring & r )
{
return ( cl_univpoly_ring * ) univpoly_ring_table - > get ( r ) ;
}
inline void store_univpoly_ring ( const cl_univpoly_ring & R )
{
univpoly_ring_table - > put ( R - > basering ( ) , R ) ;
}
univpoly_ring_cache ( ) ;
~ univpoly_ring_cache ( ) ;
} ;
cl_wht_from_rcpointer_to_rcpointer * univpoly_ring_cache : : univpoly_ring_table = 0 ;
int univpoly_ring_cache : : count = 0 ;
static inline cl_univpoly_ring * get_univpoly_ring ( const cl_ring & r )
univpoly_ring_cache : : univpoly_ring_cache ( )
{
{
return ( cl_univpoly_ring * ) univpoly_ring_table . get ( r ) ;
if ( count + + = = 0 )
univpoly_ring_table = new cl_wht_from_rcpointer_to_rcpointer ( maygc_htentry ) ;
}
}
static inline void store_univpoly_ring ( const cl_univpoly_ring & R )
univpoly_ring_cache : : ~ univpoly_ring_cache ( )
{
{
univpoly_ring_table . put ( R - > basering ( ) , R ) ;
if ( - - count = = 0 )
delete univpoly_ring_table ;
}
}
const cl_univpoly_ring find_univpoly_ring ( const cl_ring & r )
const cl_univpoly_ring find_univpoly_ring ( const cl_ring & r )
{
{
var cl_univpoly_ring * ring_in_table = get_univpoly_ring ( r ) ;
static univpoly_ring_cache cache ;
var cl_univpoly_ring * ring_in_table = cache . get_univpoly_ring ( r ) ;
if ( ! ring_in_table ) {
if ( ! ring_in_table ) {
var cl_univpoly_ring R = cl_make_univpoly_ring ( r ) ;
var cl_univpoly_ring R = cl_make_univpoly_ring ( r ) ;
store_univpoly_ring ( R ) ;
ring_in_table = get_univpoly_ring ( r ) ;
cache . store_univpoly_ring ( R ) ;
ring_in_table = cache . get_univpoly_ring ( r ) ;
if ( ! ring_in_table )
if ( ! ring_in_table )
throw runtime_exception ( ) ;
throw runtime_exception ( ) ;
}
}
@ -62,4 +80,3 @@ const cl_univpoly_ring find_univpoly_ring (const cl_ring& r)
} // namespace cln
} // namespace cln
CL_PROVIDE_END ( cl_UP_unnamed )