diff --git a/alib2data/src/common/ZeroRunLengthEncoding.hpp b/alib2data/src/common/ZeroRunLengthEncoding.hpp index 04587d2d904a42d191b0e6c6148a15c5e24c5376..af99a57956326a4f491f568a6a76a89e3b5c855e 100644 --- a/alib2data/src/common/ZeroRunLengthEncoding.hpp +++ b/alib2data/src/common/ZeroRunLengthEncoding.hpp @@ -29,6 +29,17 @@ class ZeroRunLengthEncoding { struct element { unsigned run; unsigned word; + + bool operator == ( const element & other ) const { + return run == other.run && word == other.word; + } + + bool operator < ( const element & other ) const { + auto firstTie = std::tie ( run, word ); + auto secondTie = std::tie ( other.run, other.word ); + + return firstTie < secondTie; + } }; std::list < element > m_Data; @@ -129,6 +140,37 @@ public: packData ( ); } + size_t size ( ) const { + return m_Size; + } + + friend bool operator == ( const ZeroRunLengthEncoding & first, const ZeroRunLengthEncoding & second ) { + return first.m_Size == second.m_Size && first.m_Data == second.m_Data; + } + + friend bool operator != ( const ZeroRunLengthEncoding & first, const ZeroRunLengthEncoding & second ) { + return ! ( first == second ); + } + + friend bool operator < ( const ZeroRunLengthEncoding & first, const ZeroRunLengthEncoding & second ) { + auto firstTie = std::tie ( first.m_Size, first.m_Data ); + auto secondTie = std::tie ( second.m_Size, second.m_Data ); + + return firstTie < secondTie; + } + + friend bool operator > ( const ZeroRunLengthEncoding & first, const ZeroRunLengthEncoding & second ) { + return second < first; + } + + friend bool operator <= ( const ZeroRunLengthEncoding & first, const ZeroRunLengthEncoding & second ) { + return ! ( first > second ); + } + + friend bool operator >= ( const ZeroRunLengthEncoding & first, const ZeroRunLengthEncoding & second ) { + return ! ( first < second ); + } + friend ZeroRunLengthEncoding & operator <<= ( ZeroRunLengthEncoding & A, size_t dist ) { if ( A.m_Size == 0 || dist == 0 ) return A;