summaryrefslogtreecommitdiff
path: root/number.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'number.cpp')
-rw-r--r--number.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/number.cpp b/number.cpp
index e942cf2..f6f445c 100644
--- a/number.cpp
+++ b/number.cpp
@@ -1,5 +1,46 @@
#include "number.h"
+/* Operations {{{ */
+
+number
+number::operator+(const number &n) const
+{
+ /* We make sure our object is greater than or equal to n. */
+ if (*this < n) {
+ return n.operator+(*this);
+ }
+
+ number result;
+
+ auto it = _operands.cbegin();
+ auto it_n = n._operands.cbegin();
+
+ bool carry = false;
+
+ while (it != _operands.cend()) {
+ const auto n1 = *it;
+ const auto n2 = *it_n;
+
+ result._operands.push_back(n1 + n2 + (carry ? 1 : 0));
+
+ if (carry && (n1 == UINT64_MAX)) {
+ carry = true;
+ } else {
+ carry = ((UINT64_MAX - n1 - (carry ? 1 : 0)) < n2);
+ }
+
+ ++it;
+ ++it_n;
+ }
+
+ if (carry) {
+ result._operands.push_back(1);
+ }
+
+ return result;
+}
+
+/* }}} */
/* Comparison operators {{{ */
bool