* Implementation of relations between expressions */
/*
- * GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2020 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 <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 {
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);
+ return dynallocate<relational>(mapped_lh, mapped_rh, o);
else
return *this;
}
-ex relational::eval(int level) const
-{
- if (level==1)
- return this->hold();
-
- if (level == -max_recursion_level)
- throw(std::runtime_error("max recursion level reached"));
-
- return (new relational(lh.eval(level-1),rh.eval(level-1),o))->setflag(status_flags::dynallocated | status_flags::evaluated);
-}
-
ex relational::subs(const exmap & m, unsigned options) const
{
const ex & subsed_lh = lh.subs(m, options);
GINAC_ASSERT(lh.return_type()==rh.return_type());
return lh.return_type();
}
-
+
return_type_t relational::return_type_tinfo() const
{
GINAC_ASSERT(lh.return_type_tinfo()==rh.return_type_tinfo());
unsigned relational::calchash() const
{
- const void* this_tinfo = (const void*)typeid(*this).name();
- unsigned v = golden_ratio_hash((p_int)this_tinfo);
+ unsigned v = make_hash_seed(typeid(*this));
unsigned lhash = lh.gethash();
unsigned rhash = rh.gethash();
break;
case greater:
case greater_or_equal:
- v ^= lhash;
+ v ^= lhash;
lhash = rhash;
break;
}
// new virtual functions which can be overridden by derived classes
//////////
-/** Left hand side of relational. */
-ex relational::lhs() const
-{
- return lh;
-}
-
-/** Right hand side of relational. */
-ex relational::rhs() const
-{
- return rh;
-}
+// none
//////////
// non-virtual functions in this class
relational::safe_bool relational::make_safe_bool(bool cond) const
{
- return cond? &safe_bool_helper::nonnull : 0;
+ return cond? &safe_bool_helper::nonnull : nullptr;
}
-/** Cast the relational into a boolean, mainly for evaluation within an
+/** Cast the relational into a Boolean, mainly for evaluation within an
* if-statement. Note that (a<b) == false does not imply (a>=b) == true in
* the general symbolic case. A false result means the comparison is either
* false or undecidable (except of course for !=, where true means either