]> www.ginac.de Git - ginac.git/blobdiff - ginac/ex.h
[PATCH] Make ex::operator[] const dispatch to basic::operator[] const.
[ginac.git] / ginac / ex.h
index 37b94d2baa379e5c5d1b0e4eb5268b1c9c2745cc..6c9d429c7a6403e0b620a73c7ea31da0b5a9c433 100644 (file)
@@ -3,7 +3,7 @@
  *  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
@@ -43,7 +43,7 @@ namespace GiNaC {
  *  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 */
@@ -87,6 +87,8 @@ public:
        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
@@ -132,8 +134,8 @@ public:
        // 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);
@@ -236,6 +238,8 @@ private:
        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();
@@ -290,6 +294,18 @@ ex::ex(unsigned long i) : bp(construct_from_ulong(i))
        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))
 {
@@ -962,6 +978,26 @@ inline void swap(GiNaC::ex &a, GiNaC::ex &b)
        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