# function.pl options: \$maxargs=${maxargs}
#
-# GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany
+# GiNaC Copyright (C) 1999-2009 Johannes Gutenberg University Mainz, Germany
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
function::function(unsigned ser, ${SEQ1})
: exprseq(${SEQ2}), serial(ser)
{
- tinfo_key = &function::tinfo_static;
}
END_OF_CONSTRUCTORS_IMPLEMENTATION
* Please do not modify it directly, edit the perl script instead!
* function.pl options: \$maxargs=${maxargs}
*
- * GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2009 Johannes Gutenberg University Mainz, Germany
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#ifndef __GINAC_FUNCTION_H__
-#define __GINAC_FUNCTION_H__
+#ifndef GINAC_FUNCTION_H
+#define GINAC_FUNCTION_H
-#include <string>
-#include <vector>
+#include "exprseq.h"
// CINT needs <algorithm> to work properly with <vector>
#include <algorithm>
-
-#include "exprseq.h"
+#include <string>
+#include <vector>
// the following lines have been generated for max. ${maxargs} parameters
$declare_function_macro
return *this;
}
- function_options & set_return_type(unsigned rt, tinfo_t rtt=NULL);
+ function_options & set_return_type(unsigned rt, const return_type_t* rtt = 0);
function_options & do_not_evalf_params();
function_options & remember(unsigned size, unsigned assoc_size=0,
unsigned strategy=remember_strategies::delete_never);
bool use_return_type;
unsigned return_type;
- tinfo_t return_type_tinfo;
+ return_type_t return_type_tinfo;
bool use_remember;
unsigned remember_size;
ex conjugate() const;
ex real_part() const;
ex imag_part() const;
+ void archive(archive_node& n) const;
+ void read_archive(const archive_node& n, lst& syms);
protected:
ex derivative(const symbol & s) const;
bool is_equal_same_type(const basic & other) const;
bool match_same_type(const basic & other) const;
unsigned return_type() const;
- tinfo_t return_type_tinfo() const;
+ return_type_t return_type_tinfo() const;
// new virtual functions which can be overridden by derived classes
// none
static unsigned register_new(function_options const & opt);
static unsigned current_serial;
static unsigned find_function(const std::string &name, unsigned nparams);
+ static std::vector<function_options> get_registered_functions() { return registered_functions(); };
unsigned get_serial() const {return serial;}
std::string get_name() const;
protected:
unsigned serial;
};
+GINAC_DECLARE_UNARCHIVER(function);
// utility functions/macros
} // namespace GiNaC
-#endif // ndef __GINAC_FUNCTION_H__
+#endif // ndef GINAC_FUNCTION_H
END_OF_INTERFACE
* Please do not modify it directly, edit the perl script instead!
* function.pl options: \$maxargs=${maxargs}
*
- * GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2009 Johannes Gutenberg University Mainz, Germany
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <iostream>
-#include <string>
-#include <stdexcept>
-#include <list>
-#include <limits>
-
#include "function.h"
#include "operators.h"
#include "fderivative.h"
#include "inifcns.h"
#include "tostring.h"
#include "utils.h"
+#include "hash_seed.h"
#include "remember.h"
+#include <iostream>
+#include <limits>
+#include <list>
+#include <stdexcept>
+#include <string>
+
namespace GiNaC {
//////////
return *this;
}
-function_options & function_options::set_return_type(unsigned rt, tinfo_t rtt)
+function_options & function_options::set_return_type(unsigned rt, const return_type_t* rtt)
{
use_return_type = true;
return_type = rt;
- return_type_tinfo = rtt;
+ if (rtt != 0)
+ return_type_tinfo = *rtt;
+ else
+ return_type_tinfo = make_return_type_t<function>();
return *this;
}
function::function() : serial(0)
{
- tinfo_key = &function::tinfo_static;
}
//////////
function::function(unsigned ser) : serial(ser)
{
- tinfo_key = &function::tinfo_static;
}
// the following lines have been generated for max. ${maxargs} parameters
function::function(unsigned ser, const exprseq & es) : exprseq(es), serial(ser)
{
- tinfo_key = &function::tinfo_static;
// Force re-evaluation even if the exprseq was already evaluated
// (the exprseq copy constructor copies the flags)
function::function(unsigned ser, const exvector & v, bool discardable)
: exprseq(v,discardable), serial(ser)
{
- tinfo_key = &function::tinfo_static;
}
function::function(unsigned ser, std::auto_ptr<exvector> vp)
: exprseq(vp), serial(ser)
{
- tinfo_key = &function::tinfo_static;
}
//////////
//////////
/** Construct object from archive_node. */
-function::function(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst)
+void function::read_archive(const archive_node& n, lst& sym_lst)
{
+ inherited::read_archive(n, sym_lst);
// Find serial number by function name
std::string s;
if (n.find_string("name", s)) {
throw (std::runtime_error("unnamed function in archive"));
}
-/** Unarchive the object. */
-ex function::unarchive(const archive_node &n, lst &sym_lst)
-{
- return (new function(n, sym_lst))->setflag(status_flags::dynallocated);
-}
-
/** Archive the object. */
void function::archive(archive_node &n) const
{
n.add_string("name", registered_functions()[serial].name);
}
+GINAC_BIND_UNARCHIVER(function);
+
//////////
// functions overriding virtual functions from base classes
//////////
unsigned function::calchash() const
{
- unsigned v = golden_ratio_hash(golden_ratio_hash((p_int)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();
}
}
-tinfo_t function::return_type_tinfo() const
+return_type_t function::return_type_tinfo() const
{
GINAC_ASSERT(serial<registered_functions().size());
const function_options &opt = registered_functions()[serial];
// Default behavior is to use the return type of the first
// argument. Thus, exp() of a matrix behaves like a matrix, etc.
if (seq.empty())
- return this;
+ return make_return_type_t<function>();
else
return seq.begin()->return_type_tinfo();
}