From 51a3493a599646fa9f20cfc117627f30438bf297 Mon Sep 17 00:00:00 2001 From: rob tillaart Date: Tue, 28 Dec 2021 10:38:33 +0100 Subject: [PATCH] 0.2.5 Set --- libraries/Set/.arduino-ci.yml | 6 +- .../.github/workflows/arduino_test_runner.yml | 10 +- libraries/Set/LICENSE | 2 +- libraries/Set/README.md | 28 +++-- libraries/Set/Set.cpp | 102 +++++++++--------- libraries/Set/Set.h | 33 +++--- libraries/Set/examples/allTest/allTest.ino | 30 ++++-- .../Set/examples/equalTest/equalTest.ino | 6 +- .../interSectionTest/interSectionTest.ino | 6 +- .../examples/iterationTest/iterationTest.ino | 6 +- .../examples/randomFromSet/randomFromSet.ino | 5 +- .../Set/examples/subsetTest/subsetTest.ino | 5 +- .../Set/examples/timingTest/timingTest.ino | 6 +- libraries/Set/keywords.txt | 10 +- libraries/Set/library.json | 5 +- libraries/Set/library.properties | 2 +- libraries/Set/test/unit_test_001.cpp | 12 +-- 17 files changed, 166 insertions(+), 108 deletions(-) diff --git a/libraries/Set/.arduino-ci.yml b/libraries/Set/.arduino-ci.yml index ff5659b9..3e496624 100644 --- a/libraries/Set/.arduino-ci.yml +++ b/libraries/Set/.arduino-ci.yml @@ -2,6 +2,10 @@ compile: # Choosing to run compilation tests on 2 different Arduino platforms platforms: - uno - - leonardo - due - zero + - leonardo + - m4 + - esp32 + - esp8266 + - mega2560 diff --git a/libraries/Set/.github/workflows/arduino_test_runner.yml b/libraries/Set/.github/workflows/arduino_test_runner.yml index 476456bb..096b975b 100644 --- a/libraries/Set/.github/workflows/arduino_test_runner.yml +++ b/libraries/Set/.github/workflows/arduino_test_runner.yml @@ -4,10 +4,14 @@ name: Arduino CI on: [push, pull_request] jobs: - arduino_ci: + runTest: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: Arduino-CI/action@master - # Arduino-CI/action@v0.1.1 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.6 + - run: | + gem install arduino_ci + arduino_ci.rb diff --git a/libraries/Set/LICENSE b/libraries/Set/LICENSE index 0637a28b..4feba6f8 100644 --- a/libraries/Set/LICENSE +++ b/libraries/Set/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2014-2021 Rob Tillaart +Copyright (c) 2014-2022 Rob Tillaart Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/libraries/Set/README.md b/libraries/Set/README.md index 850e6ac3..fd16000a 100644 --- a/libraries/Set/README.md +++ b/libraries/Set/README.md @@ -1,8 +1,11 @@ [![Arduino CI](https://github.com/RobTillaart/SET/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci) +[![Arduino-lint](https://github.com/RobTillaart/SET/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/SET/actions/workflows/arduino-lint.yml) +[![JSON check](https://github.com/RobTillaart/SET/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/SET/actions/workflows/jsoncheck.yml) [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/SET/blob/master/LICENSE) [![GitHub release](https://img.shields.io/github/release/RobTillaart/SET.svg?maxAge=3600)](https://github.com/RobTillaart/SET/releases) + # SET Arduino library to implement a simple SET data structure. @@ -13,7 +16,7 @@ Arduino library to implement a simple SET data structure. The set library implements the set data structure for integers 0..255. This limit is chosen because of the memory limitations of an Arduino UNO, however these numbers can be used as indices to a table of strings or other -datatypes. +data types. ## Interface @@ -29,7 +32,7 @@ datatypes. - **clear()** empty the set. - **invert()** flip all elements in the set. -- **addAll(n)** add all 256 elements to the set. +- **addAll()** add all 256 elements to the set. - **count()** returns the number of elements. - **isEmpty()** idem - **isFull()** idem @@ -37,10 +40,10 @@ datatypes. ### Element level -- **add(n)** add element n to the Set. -- **sub(n)** remove element n from the Set. -- **invert(n)** flip element n in the Set. -- **has(n)** check if element n is in the Set. +- **add(uint8_t value)** add element n to the Set. +- **sub(uint8_t value)** remove element n from the Set. +- **invert(uint8_t value)** flip element n in the Set. +- **has(uint8_t value)** check if element n is in the Set. ### Operators @@ -65,11 +68,20 @@ all iterator-functions returns the current element or -1 if not exist. - **setCurrent(n)** if n is in the Set, n will be the current - **first()** find the first element -- **next()** find the next element. Will not wrap zround when 'end' of the set is reached. -- **prev()** find the previous element. Will not wrap zround when 'begin' of the set is reached. +- **next()** find the next element. Will not wrap around when 'end' of the set is reached. +- **prev()** find the previous element. Will not wrap around when 'begin' of the set is reached. - **last()** find the last element. - **getNth(n)** find the Nth element in a set if it exist. + ## Operational See examples + + +## Future + +- update documentation +- separate releaseNotes.md + + diff --git a/libraries/Set/Set.cpp b/libraries/Set/Set.cpp index 83f5e75f..8cb2ad93 100644 --- a/libraries/Set/Set.cpp +++ b/libraries/Set/Set.cpp @@ -1,21 +1,22 @@ // // FILE: set.cpp // AUTHOR: Rob Tillaart -// VERSION: 0.2.4 +// VERSION: 0.2.5 // DATE: 2014-09-11 // PURPOSE: SET library for Arduino // URL: https://github.com/RobTillaart/SET // // HISTORY: -// 0.2.4 2021-05-06 getNth(n) -// 0.2.3 2021-05-05 Add addAll (256 elements) + setCurrent -// 0.2.2 2021-01-07 Arduino-CI, unit test -// 0.2.1 2020-06-19 fix library.json -// 0.2.0 2020-05-02 refactored, removed pre 1.0 support -// 0.1.11 2017-07-16 fix count() --> 16 bit when set is full ! -// 0.1.10 2017-07-16 performance refactor. isEmpty() -// 0.1.09 2015-07-12 const + constructor -// 0.1.08 memset for clr() +// 0.2.5 2021-12-28 update library.json, readme, license, minor edits +// 0.2.4 2021-05-06 getNth(n) +// 0.2.3 2021-05-05 Add addAll (256 elements) + setCurrent +// 0.2.2 2021-01-07 Arduino-CI, unit test +// 0.2.1 2020-06-19 fix library.json +// 0.2.0 2020-05-02 refactored, removed pre 1.0 support +// 0.1.11 2017-07-16 fix count() --> 16 bit when set is full ! +// 0.1.10 2017-07-16 performance refactor. isEmpty() +// 0.1.09 2015-07-12 const + constructor +// 0.1.08 memset for clr() // 0.1.07 faster first/next/last/prev; interface // 0.1.06 added flag to constructor to optimize +,-,*, // set -> Set @@ -30,6 +31,7 @@ #include "set.h" + ///////////////////////////////////////////////////// // // CONSTRUCTORS @@ -58,24 +60,24 @@ Set::Set(const Set &t) // // METHODS // -void Set::add(const uint8_t v) +void Set::add(const uint8_t value) { - uint8_t idx = v / 8; - _mem[idx] |= masks[v & 7]; + uint8_t idx = value / 8; + _mem[idx] |= _masks[value & 7]; } -void Set::sub(const uint8_t v) +void Set::sub(const uint8_t value) { - uint8_t idx = v / 8; - _mem[idx] &= ~masks[v & 7]; + uint8_t idx = value / 8; + _mem[idx] &= ~_masks[value & 7]; } -void Set::invert(const uint8_t v) +void Set::invert(const uint8_t value) { - uint8_t idx = v / 8; - _mem[idx] ^= masks[v & 7]; + uint8_t idx = value / 8; + _mem[idx] ^= _masks[value & 7]; } @@ -85,21 +87,21 @@ void Set::addAll() } -bool Set::has(const uint8_t v) +bool Set::has(const uint8_t value) { - uint8_t idx = v / 8; - return (_mem[idx] & masks[v & 7]) > 0; + uint8_t idx = value / 8; + return (_mem[idx] & _masks[value & 7]) > 0; } uint16_t Set::count() const { uint16_t cnt = 0; - + uint8_t i = 32; do { - // kerningham bit count trick + // Kerningham bit count trick uint8_t b = _mem[--i]; for (; b; cnt++) { @@ -123,7 +125,7 @@ void Set::invert() do { _mem[--i] ^= 0xFF; - } + } while (i != 0); } @@ -134,7 +136,7 @@ bool Set::isEmpty() do { if (_mem[--i] > 0) return false; - } + } while (i != 0); return true; } @@ -142,26 +144,26 @@ bool Set::isEmpty() bool Set::isFull() { - // check two elements per loop + // check two elements per loop // is faster for full sets but slower for empty set. - // footprint is ~25 bytese larger - // overal performance gain + // footprint is ~25 bytes larger + // overall performance gain uint8_t i = 32; do { if ((_mem[--i]) != 255) return false; - } + } while (i != 0); return true; } -int Set::setCurrent(const uint8_t cur) +int Set::setCurrent(const uint8_t current) { _current = -1; - if (has(cur)) + if (has(current)) { - _current = cur; + _current = current; } return _current; } @@ -191,13 +193,13 @@ int Set::next() // needs investigation. // int Set::findNext(const uint8_t p, const uint8_t q) // { - // uint8_t * pp = &_mem[p]; - // uint8_t mask = 1 << q; - // uint8_t j = q; - // do - // { - // if (*pp != 0) - // { + // uint8_t * pp = &_mem[p]; + // uint8_t mask = 1 << q; + // uint8_t j = q; + // do + // { + // if (*pp != 0) + // { // while (j < 8) // { // if (*pp & mask) @@ -206,14 +208,14 @@ int Set::next() // return _current; // } // mask <<= 1; - // j++; - // } - // } - // j = 0; - // mask = 1; - // pp++; - // } - // while (pp != &_mem[31]); + // j++; + // } + // } + // j = 0; + // mask = 1; + // pp++; + // } + // while (pp != &_mem[31]); // _current = -1; // return _current; // } @@ -226,7 +228,7 @@ int Set::findNext(const uint8_t p, uint8_t q) uint8_t b = _mem[i]; if (b != 0) { - uint8_t mask = 1 << q; // masks[q] + uint8_t mask = 1 << q; // _masks[q] for (uint8_t j = q; j < 8; j++) { if (b & mask) @@ -401,4 +403,6 @@ bool Set::operator <= (const Set &t) const // subSet return true; } + // -- END OF FILE -- + diff --git a/libraries/Set/Set.h b/libraries/Set/Set.h index 277abefe..a297e613 100644 --- a/libraries/Set/Set.h +++ b/libraries/Set/Set.h @@ -2,7 +2,7 @@ // // FILE: set.h // AUTHOR: Rob Tillaart -// VERSION: 0.2.4 +// VERSION: 0.2.5 // DATE: 2014-09-11 // PURPOSE: SET library for Arduino // URL: https://github.com/RobTillaart/SET @@ -11,7 +11,7 @@ #include "Arduino.h" -#define SET_LIB_VERSION (F("0.2.4")) +#define SET_LIB_VERSION (F("0.2.5")) class Set @@ -29,10 +29,10 @@ public: bool isFull(); - void add(const uint8_t); // add element to the Set - void sub(const uint8_t); // remove element from Set - void invert(const uint8_t); // flip element in Set - bool has(const uint8_t); // element is in Set + void add(const uint8_t value); // add element to the Set + void sub(const uint8_t value); // remove element from Set + void invert(const uint8_t value); // flip element in Set + bool has(const uint8_t value); // element is in Set Set operator + (const Set &); // union @@ -54,20 +54,23 @@ public: // iterating through the Set // returns value or -1 if not exist - int setCurrent(const uint8_t); // set element as current - int first(); // find first element - int next(); // find next element - int prev(); // find previous element - int last(); // find last element - int getNth(const uint8_t n); // find Nth element in a set (from start) + int setCurrent(const uint8_t current); // set element as current + int first(); // find first element + int next(); // find next element + int prev(); // find previous element + int last(); // find last element + int getNth(const uint8_t n); // find Nth element in a set (from start) + private: uint8_t _mem[32]; // can hold 0..255 - uint8_t masks[8] = {1, 2, 4, 8, 16, 32, 64, 128}; + uint8_t _masks[8] = {1, 2, 4, 8, 16, 32, 64, 128}; int _current = -1; - int findNext(const uint8_t, const uint8_t); // helper for first, next - int findPrev(const uint8_t, const uint8_t); // helper for last, prev + int findNext(const uint8_t p, const uint8_t q); // helper for first, next + int findPrev(const uint8_t p, const uint8_t q); // helper for last, prev }; + // -- END OF FILE -- + diff --git a/libraries/Set/examples/allTest/allTest.ino b/libraries/Set/examples/allTest/allTest.ino index 9b29811e..75ec3a97 100644 --- a/libraries/Set/examples/allTest/allTest.ino +++ b/libraries/Set/examples/allTest/allTest.ino @@ -1,7 +1,6 @@ // // FILE: allTest.ino // AUTHOR: Rob Tillaart -// VERSION: 0.2.2 // PURPOSE: demo/test Set class // DATE: 2014-11-16 // URL: https://github.com/RobTillaart/SET @@ -33,10 +32,12 @@ void setup() Serial.println(); } + void loop() { } + void timingTest() { Set myset; @@ -202,13 +203,13 @@ void timingTest() int n = setA.first(); stop = micros(); Serial.println(stop - start); - + Serial.print("next:\t"); start = micros(); n = setA.next(); stop = micros(); - Serial.println(stop - start); - + Serial.println(stop - start); + Serial.print("100x first + next until -1 :\t"); start = micros(); for (uint8_t i = 0; i < 100; i++) @@ -220,8 +221,8 @@ void timingTest() } } stop = micros(); - Serial.println(stop - start); - + Serial.println(stop - start); + Serial.print("100x last + prev until -1 :\t"); start = micros(); for (uint8_t i = 0; i < 100; i++) @@ -233,12 +234,13 @@ void timingTest() } } stop = micros(); - Serial.println(stop - start); + Serial.println(stop - start); Serial.println(); - + Serial.println(); } + void equalTest() { Serial.println("EQUAL TEST"); @@ -266,6 +268,7 @@ void equalTest() Serial.println(); } + void intersectionTest() { Serial.println("INTERSECTION TEST"); @@ -315,6 +318,7 @@ void intersectionTest() Serial.println(); } + void intersection2Test() { Serial.println("INTERSECTION2 TEST"); @@ -348,6 +352,7 @@ void intersection2Test() Serial.println(); } + void subsetTest() { Serial.println("SUBSET TEST"); @@ -373,6 +378,7 @@ void subsetTest() Serial.println(); } + void iterationTest() { Serial.println("10x ITERATE OVER SET TEST"); @@ -397,9 +403,9 @@ void iterationTest() } stop = micros(); Serial.println(); - Serial.println(stop - start); + Serial.println(stop - start); Serial.println(); - + start = micros(); for (int i = 0; i < 10; i++) { @@ -414,8 +420,10 @@ void iterationTest() } stop = micros(); Serial.println(); - Serial.println(stop - start); + Serial.println(stop - start); Serial.println(); } + // -- END OF FILE -- + diff --git a/libraries/Set/examples/equalTest/equalTest.ino b/libraries/Set/examples/equalTest/equalTest.ino index 1be32437..9ca4cc18 100644 --- a/libraries/Set/examples/equalTest/equalTest.ino +++ b/libraries/Set/examples/equalTest/equalTest.ino @@ -1,7 +1,6 @@ // // FILE: equalTest.ino // AUTHOR: Rob Tillaart -// VERSION: 0.2.2 // PURPOSE: demo equality operators // DATE: 2014-11-09 // URL: https://github.com/RobTillaart/SET @@ -13,6 +12,7 @@ Set setA, setB; volatile bool b; + void setup() { Serial.begin(115200); @@ -46,7 +46,11 @@ void setup() Serial.println(); } + void loop() { } + +// -- END OF FILE -- + diff --git a/libraries/Set/examples/interSectionTest/interSectionTest.ino b/libraries/Set/examples/interSectionTest/interSectionTest.ino index 94d9695a..f1fd37ce 100644 --- a/libraries/Set/examples/interSectionTest/interSectionTest.ino +++ b/libraries/Set/examples/interSectionTest/interSectionTest.ino @@ -1,7 +1,6 @@ // // FILE: set_demo.ino // AUTHOR: Rob Tillaart -// VERSION: 0.2.2 // PURPOSE: demo set intersection union and diff // DATE: 2014-11-09 // URL: https://github.com/RobTillaart/SET @@ -13,6 +12,7 @@ Set setA, setB; volatile bool b; + void setup() { Serial.begin(115200); @@ -95,7 +95,11 @@ void setup() Serial.println(); } + void loop() { } + +// -- END OF FILE -- + diff --git a/libraries/Set/examples/iterationTest/iterationTest.ino b/libraries/Set/examples/iterationTest/iterationTest.ino index 43df963f..45dba469 100644 --- a/libraries/Set/examples/iterationTest/iterationTest.ino +++ b/libraries/Set/examples/iterationTest/iterationTest.ino @@ -1,7 +1,6 @@ // // FILE: iterationTest.ino // AUTHOR: Rob Tillaart -// VERSION: 0.2.2 // PURPOSE: demo first, next, last, prev // DATE: 2014-11-09 // URL: https://github.com/RobTillaart/SET @@ -15,6 +14,7 @@ Set setA, setB; volatile bool b; + void setup() { Serial.begin(115200); @@ -52,7 +52,11 @@ void setup() Serial.println(); } + void loop() { } + +// -- END OF FILE -- + diff --git a/libraries/Set/examples/randomFromSet/randomFromSet.ino b/libraries/Set/examples/randomFromSet/randomFromSet.ino index 1fc3a8f5..95346c17 100644 --- a/libraries/Set/examples/randomFromSet/randomFromSet.ino +++ b/libraries/Set/examples/randomFromSet/randomFromSet.ino @@ -1,12 +1,10 @@ // // FILE: randomFromSet.ino // AUTHOR: Rob Tillaart -// VERSION: 0.1.0 // PURPOSE: demo random playlist with set // DATE: 2021-05-04 // URL: https://github.com/RobTillaart/SET // https://github.com/RobTillaart/Prandom/issues/3 -// #include "set.h" @@ -18,6 +16,7 @@ int SONGS = 15; uint32_t start, stop ; + void setup() { Serial.begin(115200); @@ -69,4 +68,6 @@ int getRandomSong() return rv; } + // -- END OF FILE -- + diff --git a/libraries/Set/examples/subsetTest/subsetTest.ino b/libraries/Set/examples/subsetTest/subsetTest.ino index 28732527..c73e1c24 100644 --- a/libraries/Set/examples/subsetTest/subsetTest.ino +++ b/libraries/Set/examples/subsetTest/subsetTest.ino @@ -1,7 +1,6 @@ // // FILE: subsetTest.ino // AUTHOR: Rob Tillaart -// VERSION: 0.2.2 // PURPOSE: demo // DATE: 2014-11-09 // URL: https://github.com/RobTillaart/SET @@ -43,7 +42,11 @@ void setup() Serial.println(); } + void loop() { } + +// -- END OF FILE -- + diff --git a/libraries/Set/examples/timingTest/timingTest.ino b/libraries/Set/examples/timingTest/timingTest.ino index d7569a59..462ef642 100644 --- a/libraries/Set/examples/timingTest/timingTest.ino +++ b/libraries/Set/examples/timingTest/timingTest.ino @@ -1,7 +1,6 @@ // // FILE: timingTest.ino // AUTHOR: Rob Tillaart -// VERSION: 0.2.2 // PURPOSE: timing test for set class methods // DATE: 2014-11-09 // URL: https://github.com/RobTillaart/SET @@ -18,6 +17,7 @@ uint32_t stop; volatile bool b; + void setup() { Serial.begin(115200); @@ -74,7 +74,11 @@ void setup() Serial.println(); } + void loop() { } + +// -- END OF FILE -- + diff --git a/libraries/Set/keywords.txt b/libraries/Set/keywords.txt index 4ee0aaf1..ad99e791 100644 --- a/libraries/Set/keywords.txt +++ b/libraries/Set/keywords.txt @@ -1,12 +1,15 @@ -# Syntax Coloring Map For Set +# Syntax Colouring Map For Set -# Datatypes (KEYWORD1) + +# Data types (KEYWORD1) Set KEYWORD1 + # Methods and Functions (KEYWORD2) clear KEYWORD2 invert KEYWORD2 addAll KEYWORD2 + count KEYWORD2 isEmpty KEYWORD2 isFull KEYWORD2 @@ -22,5 +25,8 @@ prev KEYWORD2 last KEYWORD2 getNth KEYWORD2 + # Constants (LITERAL1) SET_LIB_VERSION LITERAL1 + + diff --git a/libraries/Set/library.json b/libraries/Set/library.json index 75449aa7..bedf2f4f 100644 --- a/libraries/Set/library.json +++ b/libraries/Set/library.json @@ -15,8 +15,9 @@ "type": "git", "url": "https://github.com/RobTillaart/SET.git" }, - "version": "0.2.4", + "version": "0.2.5", "license": "MIT", "frameworks": "arduino", - "platforms": "*" + "platforms": "*", + "headers": "set.h" } diff --git a/libraries/Set/library.properties b/libraries/Set/library.properties index 3328ec90..3626743e 100644 --- a/libraries/Set/library.properties +++ b/libraries/Set/library.properties @@ -1,5 +1,5 @@ name=SET -version=0.2.4 +version=0.2.5 author=Rob Tillaart maintainer=Rob Tillaart sentence=Arduino library to implement simple SET datastructure. diff --git a/libraries/Set/test/unit_test_001.cpp b/libraries/Set/test/unit_test_001.cpp index b9af4d5e..3b6f82dc 100644 --- a/libraries/Set/test/unit_test_001.cpp +++ b/libraries/Set/test/unit_test_001.cpp @@ -38,8 +38,10 @@ unittest_setup() { + fprintf(stderr, "SET_LIB_VERSION: %s\n", (char *) SET_LIB_VERSION); } + unittest_teardown() { } @@ -47,8 +49,6 @@ unittest_teardown() unittest(test_constructor) { - fprintf(stderr, "VERSION: %s\n", SET_LIB_VERSION); - Set A; assertTrue(A.isEmpty()); @@ -79,8 +79,6 @@ unittest(test_constructor) unittest(test_count_has) { - fprintf(stderr, "VERSION: %s\n", SET_LIB_VERSION); - Set A; A.clear(); @@ -107,8 +105,6 @@ unittest(test_count_has) unittest(test_operator) { - fprintf(stderr, "VERSION: %s\n", SET_LIB_VERSION); - Set A; Set B; Set C; @@ -150,8 +146,6 @@ unittest(test_operator) unittest(test_iterator) { - fprintf(stderr, "VERSION: %s\n", SET_LIB_VERSION); - Set A; A.clear(); @@ -189,6 +183,8 @@ unittest(test_iterator) } + unittest_main() + // --------