From fbc12ca08414f3973938e963ded2f884d762d1b4 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 6 Mar 2021 12:58:44 +0000 Subject: [PATCH] Added iterators --- include/etl/message_router_registry.h | 198 +++++++++++++++++++++++++- test/test_message_router_registry.cpp | 64 +++++++-- 2 files changed, 248 insertions(+), 14 deletions(-) diff --git a/include/etl/message_router_registry.h b/include/etl/message_router_registry.h index 455e4916..72f6d21e 100644 --- a/include/etl/message_router_registry.h +++ b/include/etl/message_router_registry.h @@ -37,6 +37,7 @@ SOFTWARE. #include "flat_map.h" #include "exception.h" #include "error_handler.h" +#include "iterator.h" #undef ETL_FILE #define ETL_FILE ETL_MESSAGE_ROUTER_REGISTRY @@ -74,8 +75,203 @@ namespace etl //*************************************************************************** class imessage_router_registry { + private: + + typedef etl::iflat_map IRegistry; + public: + class const_iterator; + + //******************************************** + /// Iterator + //******************************************** + class iterator : etl::iterator + { + public: + + friend class imessage_router_registry; + friend class const_iterator; + + //******************************************** + iterator() + { + } + + //******************************************** + iterator(const iterator& other) + : itr(other.itr) + { + } + + //******************************************** + iterator& operator =(const iterator& other) + { + itr = other.itr; + } + + //******************************************** + etl::imessage_router* operator *() + { + return itr->second; + } + + //******************************************** + const etl::imessage_router* operator *() const + { + return itr->second; + } + + //******************************************** + iterator& operator ++() + { + ++itr; + return *this; + } + + //******************************************** + iterator operator ++(int) + { + iterator temp(*this); + ++itr; + return temp; + } + + //******************************************** + friend bool operator ==(const iterator& lhs, const iterator& rhs) + { + return lhs.itr == rhs.itr; + } + + //******************************************** + friend bool operator !=(const iterator& lhs, const iterator& rhs) + { + return !(lhs == rhs); + } + + private: + + //******************************************** + iterator(typename IRegistry::iterator itr_) + : itr(itr_) + { + } + + typename IRegistry::iterator itr; + }; + + //******************************************** + /// Const Iterator + //******************************************** + class const_iterator : etl::iterator + { + public: + + friend class imessage_router_registry; + + //******************************************** + const_iterator() + { + } + + //******************************************** + const_iterator(const typename imessage_router_registry::iterator& other) + : itr(other.itr) + { + } + + //******************************************** + const_iterator(const const_iterator& other) + : itr(other.itr) + { + } + + //******************************************** + const_iterator& operator =(const const_iterator& other) + { + itr = other.itr; + } + + //******************************************** + const etl::imessage_router* operator *() const + { + return itr->second; + } + + //******************************************** + const_iterator& operator ++() + { + ++itr; + return *this; + } + + //******************************************** + const_iterator operator ++(int) + { + const_iterator temp(*this); + ++itr; + return temp; + } + + //******************************************** + friend bool operator ==(const const_iterator& lhs, const const_iterator& rhs) + { + return lhs.itr == rhs.itr; + } + + //******************************************** + friend bool operator !=(const const_iterator& lhs, const const_iterator& rhs) + { + return !(lhs == rhs); + } + + private: + + //******************************************** + const_iterator(typename IRegistry::const_iterator itr_) + : itr(itr_) + { + } + + typename IRegistry::const_iterator itr; + }; + + //******************************************** + /// Get the beginning of the registry. + //******************************************** + iterator begin() + { + return iterator(registry.begin()); + } + + const_iterator begin() const + { + return const_iterator(registry.cbegin()); + } + + const_iterator cbegin() const + { + return const_iterator(registry.cbegin()); + } + + //******************************************** + /// Get the end of the registry. + //******************************************** + iterator end() + { + return iterator(registry.end()); + } + + const_iterator end() const + { + return const_iterator(registry.cend()); + } + + const_iterator cend() const + { + return const_iterator(registry.cend()); + } + //******************************************** /// Registers a router. /// If the registry is full then an ETL assert is called. @@ -219,8 +415,6 @@ namespace etl protected: - typedef etl::iflat_map IRegistry; - //******************************************** // Constructor. //******************************************** diff --git a/test/test_message_router_registry.cpp b/test/test_message_router_registry.cpp index 5ffef069..aa46a8c6 100644 --- a/test/test_message_router_registry.cpp +++ b/test/test_message_router_registry.cpp @@ -30,7 +30,7 @@ SOFTWARE. #include "etl/message_router.h" #include "etl/message_router_registry.h" -#include "etl/array.h" +#include "etl/vector.h" //*************************************************************************** // The set of messages. @@ -180,9 +180,8 @@ namespace //************************************************************************* TEST(test_iterator_construction) { - etl::array routers{ &router1, &router2, &router3, &router4 }; - - etl::message_router_registry registry(routers.begin(), routers.end()); + etl::imessage_router* routers[] = { &router1, &router2, &router3, &router4 }; + etl::message_router_registry registry(std::begin(routers), std::end(routers)); CHECK(!registry.empty()); CHECK(registry.full()); @@ -194,11 +193,10 @@ namespace //************************************************************************* TEST(test_iterator_construction_excess) { - etl::array routers{ &router1, &router2, &router3, &router4, &router5 }; - + etl::imessage_router* routers[] = { &router1, &router2, &router3, &router4, &router5 }; etl::message_router_registry registry; - CHECK_THROW((registry.add(routers.begin(), routers.end())), etl::message_router_registry_full); + CHECK_THROW((registry.add(std::begin(routers), std::end(routers))), etl::message_router_registry_full); CHECK(!registry.empty()); CHECK(registry.full()); @@ -207,6 +205,7 @@ namespace CHECK_EQUAL(Registry_Size, registry.max_size()); } +#if ETL_USING_STL //************************************************************************* TEST(test_initializer_list_construction) { @@ -230,11 +229,13 @@ namespace CHECK_EQUAL(1U, registry.available()); CHECK_EQUAL(Registry_Size, registry.max_size()); } +#endif //************************************************************************* TEST(test_copy_construction) { - etl::message_router_registry registry = { &router1, &router2, &router3, &router4 }; + etl::imessage_router* routers[] = { &router1, &router2, &router3, &router4 }; + etl::message_router_registry registry(std::begin(routers), std::end(routers)); etl::message_router_registry registry2(registry); CHECK(!registry2.empty()); @@ -247,7 +248,8 @@ namespace //************************************************************************* TEST(test_assignment) { - etl::message_router_registry registry = { &router1, &router2, &router3, &router4 }; + etl::imessage_router* routers[] = { &router1, &router2, &router3, &router4 }; + etl::message_router_registry registry(std::begin(routers), std::end(routers)); etl::message_router_registry registry2; registry2 = registry; @@ -262,7 +264,8 @@ namespace //************************************************************************* TEST(test_registery_contains) { - etl::message_router_registry registry = { &router1, &router2, &router3 }; + etl::imessage_router* routers[] = { &router1, &router2, &router3 }; + etl::message_router_registry registry(std::begin(routers), std::end(routers)); CHECK(registry.contains(ROUTER1)); CHECK(registry.contains(ROUTER2)); @@ -283,7 +286,8 @@ namespace //************************************************************************* TEST(test_get_message_router) { - etl::message_router_registry registry = { &router1, &router2, &router3 }; + etl::imessage_router* routers[] = { &router1, &router2, &router3 }; + etl::message_router_registry registry(std::begin(routers), std::end(routers)); CHECK_EQUAL(&router1, registry.get(ROUTER1)); CHECK_EQUAL(&router2, registry.get(ROUTER2)); @@ -294,7 +298,8 @@ namespace //************************************************************************* TEST(test_unregister_message_router) { - etl::message_router_registry registry = { &router1, &router2, &router3, &router4 }; + etl::imessage_router* routers[] = { &router1, &router2, &router3, &router4 }; + etl::message_router_registry registry(std::begin(routers), std::end(routers)); registry.remove(ROUTER3); @@ -305,5 +310,40 @@ namespace CHECK_EQUAL(nullptr, registry.get(ROUTER3)); CHECK_EQUAL(&router4, registry.get(ROUTER4)); } + + //************************************************************************* + TEST(test_iterators) + { + etl::imessage_router* routers[] = { &router1, &router2, &router3, &router4 }; + etl::message_router_registry registry(std::begin(routers), std::end(routers)); + + etl::message_router_registry::iterator bitr = registry.begin(); + etl::message_router_registry::const_iterator cbitr = registry.begin(); + etl::message_router_registry::const_iterator cbitr2 = registry.cbegin(); + + etl::message_router_registry::iterator eitr = registry.end(); + etl::message_router_registry::const_iterator ceitr = registry.end(); + etl::message_router_registry::const_iterator ceitr2 = registry.cend(); + + CHECK_EQUAL(&router1, *bitr++); + CHECK_EQUAL(&router1, *cbitr++); + CHECK_EQUAL(&router1, *cbitr2++); + + CHECK_EQUAL(&router2, *bitr++); + CHECK_EQUAL(&router2, *cbitr++); + CHECK_EQUAL(&router2, *cbitr2++); + + CHECK_EQUAL(&router3, *bitr++); + CHECK_EQUAL(&router3, *cbitr++); + CHECK_EQUAL(&router3, *cbitr2++); + + CHECK_EQUAL(&router4, *bitr++); + CHECK_EQUAL(&router4, *cbitr++); + CHECK_EQUAL(&router4, *cbitr2++); + + CHECK(bitr == eitr); + CHECK(cbitr == ceitr); + CHECK(cbitr2 == ceitr2); + } }; }