From 7060dc7f00dc9a70e2f8c48f337e6b5a96ede26d Mon Sep 17 00:00:00 2001 From: rob tillaart Date: Sun, 16 Nov 2014 18:51:03 +0100 Subject: [PATCH] + 0.1.01 refactor (archive only) --- libraries/set/set.cpp | 154 +++++++++++++++++++++++++++++------------- libraries/set/set.h | 44 ++++++------ 2 files changed, 132 insertions(+), 66 deletions(-) diff --git a/libraries/set/set.cpp b/libraries/set/set.cpp index dbc170df..ff159517 100644 --- a/libraries/set/set.cpp +++ b/libraries/set/set.cpp @@ -1,12 +1,13 @@ // // FILE: set.cpp // AUTHOR: Rob Tillaart -// VERSION: 0.1.00 +// VERSION: 0.1.01 // PURPOSE: SET library for Arduino // URL: // // HISTORY: -// 0.1.00 by Rob Tillaart 09/11/2014 +// 0.1.01 extending/refactor etc (09/11/2014) +// 0.1.00 initial version by Rob Tillaart (09/11/2014) // // Released to the public domain // @@ -15,11 +16,9 @@ ///////////////////////////////////////////////////// // -// PUBLIC +// CONSTRUCTORS // - -//////////////////////////// -set::set() +set::set() // TODO size param { clr(); } @@ -32,9 +31,10 @@ set::set(set &t) } } - -//////////////////////////// - +///////////////////////////////////////////////////// +// +// METHODS +// void set::add(uint8_t v) { uint8_t mask = 1 << (v & 7); @@ -49,13 +49,6 @@ void set::sub(uint8_t v) _mem[idx] &= ~mask; } -bool set::has(uint8_t v) -{ - uint8_t mask = 1 << (v & 7); - uint8_t idx = v / 8; - return (_mem[idx] & mask) > 0; -} - void set::invert(uint8_t v) { uint8_t mask = 1 << (v & 7); @@ -63,8 +56,12 @@ void set::invert(uint8_t v) _mem[idx] ^= mask; } - -//////////////////////////////////// +bool set::has(uint8_t v) +{ + uint8_t mask = 1 << (v & 7); + uint8_t idx = v / 8; + return (_mem[idx] & mask) > 0; +} // TODO OPTIMIZE COUNT uint8_t set::count() @@ -77,11 +74,6 @@ uint8_t set::count() return cnt; } -uint8_t set::size() -{ - return 256; // TODO _size; -} - void set::clr() { for (int i=0; i<32; i++) @@ -98,9 +90,76 @@ void set::invert() } } +int set::first() +{ + for (int i = 0; i < 256; i++) + { + if (has(i)) + { + _current = i; + return _current; + } + } + _current = -1; + return _current; +} -/////////////////////////////////////////////////// -void set::operator = (set &t) +int set::next() +{ + if (_current != -1) + { + _current++; + for (int i = _current; i < 256; i++) + { + if (has(i)) + { + _current = i; + return _current; + } + } + } + _current = -1; + return _current; +} + +int set::prev() +{ + if (_current != -1) + { + _current--; + for (int i = _current; i > -1; --i) + { + if (has(i)) + { + _current = i; + return _current; + } + } + } + _current = -1; + return _current; +} + +int set::last() +{ + _current = -1; + for (int i = 255; i >-1; --i) + { + if (has(i)) + { + _current = i; + break; + } + } + return _current; +} + + +///////////////////////////////////////////////////// +// +// OPERATORS +// +void set::operator = (set &t) // assign { for (int i=0; i<32; i++) { @@ -108,23 +167,7 @@ void set::operator = (set &t) } } -void set::operator -= (set &t) -{ - for (int i=0; i<32; i++) - { - _mem[i] &= ~t._mem[i]; - } -} - -void set::operator &= (set &t) -{ - for (int i=0; i<32; i++) - { - _mem[i] &= t._mem[i]; - } -} - -void set::operator |= (set &t) +void set::operator += (set &t) // union { for (int i=0; i<32; i++) { @@ -132,15 +175,23 @@ void set::operator |= (set &t) } } -void set::operator ^= (set &t) +void set::operator -= (set &t) // diff { for (int i=0; i<32; i++) { - _mem[i] ^= t._mem[i]; + _mem[i] &= ~t._mem[i]; } } -bool set::operator == (set &t) +void set::operator &= (set &t) // intersection +{ + for (int i=0; i<32; i++) + { + _mem[i] &= t._mem[i]; + } +} + +bool set::operator == (set &t) // equal { for (int i=0; i<32; i++) { @@ -149,11 +200,20 @@ bool set::operator == (set &t) return true; } -bool set::operator < (set &t) +bool set::operator != (set &t) // not equal { for (int i=0; i<32; i++) { - if (_mem[i] ^= t._mem[i]) return false; + if (_mem[i] != t._mem[i]) return true; + } + return false; +} + +bool set::operator <= (set &t) // subset +{ + for (int i=0; i<256; i++) + { + if ( has(i) && !t.has(i) ) return false; } return true; } diff --git a/libraries/set/set.h b/libraries/set/set.h index b473a7df..01d9caf2 100644 --- a/libraries/set/set.h +++ b/libraries/set/set.h @@ -1,7 +1,7 @@ // // FILE: set.h // AUTHOR: Rob Tillaart -// VERSION: 0.1.00 +// VERSION: 0.1.01 // PURPOSE: SET library for Arduino // URL: // @@ -18,47 +18,53 @@ #include #endif -#define SET_LIB_VERSION "0.1.00" +#define SET_LIB_VERSION "0.1.01" class set { public: - set(); // TODO size + set(); set(set&); - void add(uint8_t); - void sub(uint8_t); - bool has(uint8_t); - - void invert(uint8_t); - void clr(); void invert(); uint8_t count(); - uint8_t size(); - // uint8_t max(); - // uint8_t min(); - - // inline bool empty() { return count() == 0; }; - // inline bool full() { return count() == 256; }; + void add(uint8_t); + void sub(uint8_t); + void invert(uint8_t); + bool has(uint8_t); void operator = (set &t); // assign + void operator += (set &t); void operator -= (set &t); void operator &= (set &t); - void operator |= (set &t); bool operator == (set&); bool operator != (set&); - bool operator < (set&); + bool operator <= (set&); + int first(); + int next(); + int prev(); + int last(); + // TODO + // set(uint8_t*, uint8_t); // constructor from uint8_t array + // uint8_t size(); + // iterator - begin, next - // iterator + // uint8_t max(); + // uint8_t min(); + // inline bool empty() { return count() == 0; }; + // inline bool full() { return count() == 256; }; private: - uint8_t _mem[32]; // TODO SIZE PARAM enough to hold 0..255 + uint8_t _mem[32]; // can hold 0..255 // uint8_t _cnt; + // uint8_t _size; + int _current; + }; #endif //