* Implementation of relations between expressions */
/*
- * GiNaC Copyright (C) 1999-2003 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
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <iostream>
-#include <stdexcept>
-
#include "relational.h"
#include "operators.h"
#include "numeric.h"
#include "archive.h"
#include "utils.h"
+#include "hash_seed.h"
+
+#include <iostream>
+#include <stdexcept>
namespace GiNaC {
GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(relational, basic,
print_func<print_context>(&relational::do_print).
- print_func<print_tree>(&basic::do_print_tree).
+ print_func<print_tree>(&relational::do_print_tree).
print_func<print_python_repr>(&relational::do_print_python_repr))
//////////
// default constructor
//////////
-relational::relational() : basic(TINFO_relational) {}
+relational::relational() { }
//////////
// other constructors
// public
-relational::relational(const ex & lhs, const ex & rhs, operators oper) : basic(TINFO_relational), lh(lhs), rh(rhs), o(oper) {}
+relational::relational(const ex & lhs, const ex & rhs, operators oper) :
+ lh(lhs), rh(rhs), o(oper) { }
//////////
// archiving
//////////
-relational::relational(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst)
+void relational::read_archive(const archive_node& n, lst& sym_lst)
{
+ inherited::read_archive(n, sym_lst);
unsigned int opi;
if (!(n.find_unsigned("op", opi)))
throw (std::runtime_error("unknown relational operator in archive"));
n.find_ex("lh", lh, sym_lst);
n.find_ex("rh", rh, sym_lst);
}
+GINAC_BIND_UNARCHIVER(relational);
void relational::archive(archive_node &n) const
{
n.add_unsigned("op", o);
}
-DEFAULT_UNARCHIVE(relational)
-
//////////
// functions overriding virtual functions from base classes
//////////
ex relational::map(map_function & f) const
{
- return (new relational(f(lh), f(rh), o))->setflag(status_flags::dynallocated);
+ const ex &mapped_lh = f(lh);
+ const ex &mapped_rh = f(rh);
+
+ if (!are_ex_trivially_equal(lh, mapped_lh)
+ || !are_ex_trivially_equal(rh, mapped_rh))
+ return (new relational(mapped_lh, mapped_rh, o))->setflag(status_flags::dynallocated);
+ else
+ return *this;
}
ex relational::eval(int level) const
return lh.return_type();
}
-unsigned relational::return_type_tinfo() const
+return_type_t relational::return_type_tinfo() const
{
GINAC_ASSERT(lh.return_type_tinfo()==rh.return_type_tinfo());
return lh.return_type_tinfo();
unsigned relational::calchash() const
{
- unsigned v = golden_ratio_hash(tinfo());
+ unsigned v = make_hash_seed(typeid(*this));
unsigned lhash = lh.gethash();
unsigned rhash = rh.gethash();
case not_equal:
return make_safe_bool(!ex_to<numeric>(df).is_zero());
case less:
- return make_safe_bool(ex_to<numeric>(df)<_num0);
+ return make_safe_bool(ex_to<numeric>(df)<(*_num0_p));
case less_or_equal:
- return make_safe_bool(ex_to<numeric>(df)<=_num0);
+ return make_safe_bool(ex_to<numeric>(df)<=(*_num0_p));
case greater:
- return make_safe_bool(ex_to<numeric>(df)>_num0);
+ return make_safe_bool(ex_to<numeric>(df)>(*_num0_p));
case greater_or_equal:
- return make_safe_bool(ex_to<numeric>(df)>=_num0);
+ return make_safe_bool(ex_to<numeric>(df)>=(*_num0_p));
default:
throw(std::logic_error("invalid relational operator"));
}