* Interface to GiNaC's light-weight expression handles. */
/*
- * GiNaC Copyright (C) 1999-2016 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2022 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
* of this class in every object file that makes use of our flyweights in
* order to guarantee proper initialization. Hence we put it into this
* file which is included by every relevant file anyways. This is modeled
- * after section 27.4.2.1.6 of the C++ standard, where cout and friends are
+ * after section [ios::Init] of the C++ standard, where cout and friends are
* set up.
*
* @see utils.cpp */
ex(unsigned int i);
ex(long i);
ex(unsigned long i);
+ ex(long long i);
+ ex(unsigned long long i);
ex(double const d);
/** Construct ex from string and a list of symbols. The input grammar is
// operand access
size_t nops() const { return bp->nops(); }
ex op(size_t i) const { return bp->op(i); }
- ex operator[](const ex & index) const { return (*bp)[index]; }
- ex operator[](size_t i) const { return (*bp)[i]; }
+ ex operator[](const ex & index) const { return (const_cast<const basic&>(*bp))[index]; }
+ ex operator[](size_t i) const { return (const_cast<const basic&>(*bp))[i]; }
ex & let_op(size_t i);
ex & operator[](const ex & index);
ex & operator[](size_t i);
ex series(const ex & r, int order, unsigned options = 0) const;
// rational functions
- ex normal(int level = 0) const;
+ ex normal() const;
ex to_rational(exmap & repl) const;
- ex to_rational(lst & repl_lst) const;
ex to_polynomial(exmap & repl) const;
- ex to_polynomial(lst & repl_lst) const;
ex numer() const;
ex denom() const;
ex numer_denom() const;
static basic & construct_from_uint(unsigned int i);
static basic & construct_from_long(long i);
static basic & construct_from_ulong(unsigned long i);
+ static basic & construct_from_longlong(long long i);
+ static basic & construct_from_ulonglong(unsigned long long i);
static basic & construct_from_double(double d);
static ptr<basic> construct_from_string_and_lst(const std::string &s, const ex &l);
void makewriteable();
GINAC_ASSERT(bp->flags & status_flags::dynallocated);
}
+inline
+ex::ex(long long i) : bp(construct_from_longlong(i))
+{
+ GINAC_ASSERT(bp->flags & status_flags::dynallocated);
+}
+
+inline
+ex::ex(unsigned long long i) : bp(construct_from_ulonglong(i))
+{
+ GINAC_ASSERT(bp->flags & status_flags::dynallocated);
+}
+
inline
ex::ex(double const d) : bp(construct_from_double(d))
{
}
/* Function objects for STL sort() etc. */
-struct ex_is_less : public std::binary_function<ex, ex, bool> {
+struct ex_is_less {
bool operator() (const ex &lh, const ex &rh) const { return lh.compare(rh) < 0; }
};
-struct ex_is_equal : public std::binary_function<ex, ex, bool> {
+struct ex_is_equal {
bool operator() (const ex &lh, const ex &rh) const { return lh.is_equal(rh); }
};
-struct op0_is_equal : public std::binary_function<ex, ex, bool> {
+struct op0_is_equal {
bool operator() (const ex &lh, const ex &rh) const { return lh.op(0).is_equal(rh.op(0)); }
};
-struct ex_swap : public std::binary_function<ex, ex, void> {
+struct ex_swap {
void operator() (ex &lh, ex &rh) const { lh.swap(rh); }
};
inline ex numer_denom(const ex & thisex)
{ return thisex.numer_denom(); }
-inline ex normal(const ex & thisex, int level=0)
-{ return thisex.normal(level); }
-
-inline ex to_rational(const ex & thisex, lst & repl_lst)
-{ return thisex.to_rational(repl_lst); }
+inline ex normal(const ex & thisex)
+{ return thisex.normal(); }
inline ex to_rational(const ex & thisex, exmap & repl)
{ return thisex.to_rational(repl); }
inline ex to_polynomial(const ex & thisex, exmap & repl)
{ return thisex.to_polynomial(repl); }
-inline ex to_polynomial(const ex & thisex, lst & repl_lst)
-{ return thisex.to_polynomial(repl_lst); }
-
inline ex collect(const ex & thisex, const ex & s, bool distributed = false)
{ return thisex.collect(s, distributed); }
a.swap(b);
}
+/** Specialization of std::hash() for ex objects. */
+template<>
+struct hash<GiNaC::ex>
+{
+ std::size_t operator()(const GiNaC::ex & e) const noexcept
+ {
+ return e.gethash();
+ }
+};
+
+/** Specialization of std::equal_to() for ex objects. */
+template<>
+struct equal_to<GiNaC::ex>
+{
+ bool operator()(const GiNaC::ex &e1, const GiNaC::ex &e2) const noexcept
+ {
+ return e1.is_equal(e2);
+ }
+};
+
} // namespace std
#endif // ndef GINAC_EX_H