summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--number.cpp41
-rw-r--r--number.h7
2 files changed, 48 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
diff --git a/number.h b/number.h
index c508a81..ca5075e 100644
--- a/number.h
+++ b/number.h
@@ -9,6 +9,13 @@ public:
number() = default;
/**
+ * \brief Return the result of the addition of a number and this number.
+ *
+ * \param n The number to add to this number.
+ */
+ number operator+(const number &n) const;
+
+ /**
* \brief Tells whether the number passed as parameter is strictly less
* than this number.
*