#include "inifcns.h"
#include "tostring.h"
#include "utils.h"
+#include "hash_seed.h"
#include "remember.h"
#include <iostream>
function::function(unsigned ser, const exvector & v, bool discardable)
: exprseq(v,discardable), serial(ser)
{
+ if ( ser >= registered_functions().size() ) {
+ throw std::runtime_error("function does not exist");
+ }
}
function::function(unsigned ser, std::auto_ptr<exvector> vp)
unsigned function::calchash() const
{
- const void* this_tinfo = (const void*)typeid(*this).name();
- unsigned v = golden_ratio_hash(golden_ratio_hash((p_int)this_tinfo) ^ serial);
+ unsigned v = golden_ratio_hash(make_hash_seed(typeid(*this)) ^ serial);
for (size_t i=0; i<nops(); i++) {
v = rotate_left(v);
v ^= this->op(i).gethash();
/** Return the print name of the function. */
std::string function::get_name() const
{
- GINAC_ASSERT(serial<registered_functions().size());
+ if ( serial >= registered_functions().size() ) {
+ throw std::runtime_error("unknown function");
+ }
return registered_functions()[serial].name;
}