[PATCH] numeric, ex: added constructors taking `long long`. Fixes MinGW64 build.
authorAlexey Sheplyakov <asheplyakov@altlinux.org>
Thu, 12 Dec 2019 07:38:18 +0000 (08:38 +0100)
committerRichard Kreckel <kreckel@ginac.de>
Thu, 12 Dec 2019 07:38:18 +0000 (08:38 +0100)
On 64-bit windows std::size_t is `unsigned long long` (64 bit).
However there is no ex constructor taking (unsigned) long long.

This patch adds ex and numeric constructors taking `long long`
and `unsigned long long`.

ginac/ex.cpp
ginac/ex.h
ginac/numeric.cpp
ginac/numeric.h

index 73a3ba79239e7b8b34ba111416110c6b66f8430d..11ae077eb0fa66975b71f3ce20c1acc0f7708d72 100644 (file)
@@ -530,7 +530,25 @@ basic & ex::construct_from_ulong(unsigned long i)
                return dynallocate<numeric>(i);
        }
 }
-       
+
+basic & ex::construct_from_longlong(long long i)
+{
+       if (i >= -12 && i <= 12) {
+               return construct_from_int(static_cast<int>(i));
+       } else {
+               return dynallocate<numeric>(i);
+       }
+}
+
+basic & ex::construct_from_ulonglong(unsigned long long i)
+{
+       if (i <= 12) {
+               return construct_from_uint(static_cast<unsigned>(i));
+       } else {
+               return dynallocate<numeric>(i);
+       }
+}
+
 basic & ex::construct_from_double(double d)
 {
        return dynallocate<numeric>(d);
index dd3cfe0530ae51f33e72db25bde99fac7760f2e2..abef5ecfb32f3a3e052a9dc54c4af5790b835271 100644 (file)
@@ -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
@@ -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))
 {
index 4cfd7e4a6949da20f6470d23e6753c356e4f57e9..1f87f422b05ccf9371119a0345083b9338084001 100644 (file)
@@ -141,6 +141,17 @@ numeric::numeric(unsigned long i)
        setflag(status_flags::evaluated | status_flags::expanded);
 }
 
+numeric::numeric(long long i)
+{
+       value = cln::cl_I(i);
+       setflag(status_flags::evaluated | status_flags::expanded);
+}
+
+numeric::numeric(unsigned long long i)
+{
+       value = cln::cl_I(i);
+       setflag(status_flags::evaluated | status_flags::expanded);
+}
 
 /** Constructor for rational numerics a/b.
  *
index da41bd32fb3b5ec1cae346fd0c802a8ea9b4805d..654926d825e3d47e72243d7d64b1a71ecbba9c70 100644 (file)
@@ -90,6 +90,8 @@ public:
        numeric(unsigned int i);
        numeric(long i);
        numeric(unsigned long i);
+       numeric(long long i);
+       numeric(unsigned long long i);
        numeric(long numer, long denom);
        numeric(double d);
        numeric(const char *);