* Interface to GiNaC's light-weight expression handles. */
/*
- * GiNaC Copyright (C) 1999-2018 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2021 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);
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))
{
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