From 73de311edc5ef3445ea39815156b2163502a2814 Mon Sep 17 00:00:00 2001 From: Romain Goyet Date: Mon, 21 Sep 2015 12:05:30 +0200 Subject: [PATCH] [poincare] integer comparison --- poincare/include/poincare/integer.h | 2 ++ poincare/src/integer.cpp | 17 ++++++++++++++++- poincare/test/integer.cpp | 8 ++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/poincare/include/poincare/integer.h b/poincare/include/poincare/integer.h index 2655b04ed..6c8e4e690 100644 --- a/poincare/include/poincare/integer.h +++ b/poincare/include/poincare/integer.h @@ -19,6 +19,8 @@ class Integer : public Expression { // Arithmetic Integer operator+(const Integer &other) const; Integer operator*(const Integer &other) const; + + bool operator<(const Integer &other) const; bool operator==(const Integer &other) const; /*virtual Expression ** children(); diff --git a/poincare/src/integer.cpp b/poincare/src/integer.cpp index 6b777f5d8..edc83b5e9 100644 --- a/poincare/src/integer.cpp +++ b/poincare/src/integer.cpp @@ -87,8 +87,23 @@ Integer::~Integer() { Integer::Integer(native_uint_t * digits, uint16_t numberOfDigits) : m_numberOfDigits(numberOfDigits), m_digits(digits) { - } +} +// TODO: factor code with "==", they are very similar +bool Integer::operator<(const Integer &other) const { + if (m_numberOfDigits != other.m_numberOfDigits) { + return (m_numberOfDigits < other.m_numberOfDigits); + } + for (uint16_t i = 0; i < m_numberOfDigits; i++) { + // Digits are stored most-significant last + native_uint_t digit = m_digits[m_numberOfDigits-i-1]; + native_uint_t otherDigit = other.m_digits[m_numberOfDigits-i-1]; + if (digit != otherDigit) { + return (digit < otherDigit); + } + } + return false; +} bool Integer::operator==(const Integer &other) const { if (other.m_numberOfDigits != m_numberOfDigits) { diff --git a/poincare/test/integer.cpp b/poincare/test/integer.cpp index 2a33f541c..f4fee433b 100644 --- a/poincare/test/integer.cpp +++ b/poincare/test/integer.cpp @@ -10,6 +10,14 @@ QUIZ_CASE(poincare_integer) { assert(Integer("0b1011") == Integer(11)); } +QUIZ_CASE(poincare_integer_compare) { + assert(Integer(123) < Integer(456)); + assert(!(Integer(123) < Integer(123))); + assert(Integer(123) < Integer("123456789123456789")); + assert(Integer("123456789123456788") < Integer("123456789123456789")); + assert(!(Integer("123456789123456789") < Integer("123456789123456788"))); +} + QUIZ_CASE(poincare_integer_add) { //assert(Integer((uint32_t)0) + Integer((uint32_t)0) == Integer((uint32_t)0)); assert(Integer(123) + Integer(456) == Integer(579));