浏览代码

Combining integral constructors for biginteger.

Samuel Jaffe 8 年之前
父节点
当前提交
e4bf27d708
共有 2 个文件被更改,包括 14 次插入17 次删除
  1. 14 4
      include/biginteger.h
  2. 0 13
      src/biginteger.cpp

+ 14 - 4
include/biginteger.h

@@ -12,6 +12,11 @@
 
 namespace math {
   class biginteger {
+  private:
+    template <typename Int>
+    using is_signed_t = typename std::enable_if<std::numeric_limits<Int>::is_integer && std::numeric_limits<Int>::is_signed, int>::type;
+    template <typename Int>
+    using is_unsigned_t = typename std::enable_if<std::numeric_limits<Int>::is_integer && !std::numeric_limits<Int>::is_signed, int>::type;
   public:
     using data_type = std::vector<int32_t>;
     static biginteger const ZERO, ONE, NEGATIVE_ONE;
@@ -21,10 +26,15 @@ namespace math {
   public:
     // Constructors
     biginteger();
-    biginteger(int32_t);
-    biginteger(uint32_t);
-    biginteger(int64_t);
-    biginteger(uint64_t);
+    
+    template <typename Int>
+    biginteger(Int value, is_signed_t<Int> = 0)
+    : biginteger(value < 0, static_cast<uint64_t>(value < 0 ? -value : value)) {}
+    
+    template <typename Int>
+    biginteger(Int value, is_unsigned_t<Int> = 0)
+    : biginteger(false, static_cast<uint64_t>(value)) {}
+    
     biginteger(char const *);
     // Unary operators
     biginteger operator-() const;

+ 0 - 13
src/biginteger.cpp

@@ -27,21 +27,8 @@ namespace detail {
 biginteger::biginteger()
 : biginteger(false, 0) {}
 
-biginteger::biginteger(int32_t value)
-: biginteger(static_cast<int64_t>(value)) {}
-
-biginteger::biginteger(uint32_t value)
-: biginteger(static_cast<uint64_t>(value)) {}
-
-biginteger::biginteger(int64_t value) :
-biginteger(value < 0, static_cast<uint64_t>(value < 0 ? -value : value)) {}
-
-biginteger::biginteger(uint64_t value)
-: biginteger(false, value) {}
-
 biginteger::biginteger(char const * number)
 : is_negative(number[0] == '-') {
-  // 999,999,996,000,000,005,999,999,996,000,000,001
   if (is_negative) ++number;
   auto len = strlen(number);
   auto elems = len/SEG_DIGITS;