From 2d973955a9024b41fa253fb25549522bb98e9a37 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Mon, 25 Jun 2018 07:04:55 -0700 Subject: [PATCH] [child/router-table] overload `++` operator to advance iterators (#2828) --- src/core/common/settings.hpp | 14 +++++++++ src/core/thread/address_resolver.cpp | 4 +-- src/core/thread/child_table.hpp | 22 +++++++++++++ src/core/thread/key_manager.cpp | 4 +-- src/core/thread/mesh_forwarder.cpp | 2 +- src/core/thread/mesh_forwarder_ftd.cpp | 14 ++++----- src/core/thread/mle_router.cpp | 39 ++++++++++++------------ src/core/thread/network_diagnostic.cpp | 2 +- src/core/thread/router_table.hpp | 20 ++++++++++++ src/core/thread/src_match_controller.cpp | 2 +- src/core/utils/child_supervision.cpp | 2 +- tests/unit/test_child_table.cpp | 6 ++-- 12 files changed, 92 insertions(+), 39 deletions(-) diff --git a/src/core/common/settings.hpp b/src/core/common/settings.hpp index c7d5ae621..a725d9773 100644 --- a/src/core/common/settings.hpp +++ b/src/core/common/settings.hpp @@ -380,6 +380,20 @@ public: */ void Advance(void); + /** + * This method overloads operator `++` (pre-increment) to advance the iterator to move to the next Child Info + * entry in the list (if any). + * + */ + void operator++(void) { Advance(); } + + /** + * This method overloads operator `++` (post-increment) to advance the iterator to move to the next Child Info + * entry in the list (if any). + * + */ + void operator++(int) { Advance(); } + /** * This method gets the Child Info corresponding to the current iterator entry in the list. * diff --git a/src/core/thread/address_resolver.cpp b/src/core/thread/address_resolver.cpp index baedc6e8b..4808f1efd 100644 --- a/src/core/thread/address_resolver.cpp +++ b/src/core/thread/address_resolver.cpp @@ -561,7 +561,7 @@ void AddressResolver::HandleAddressError(Coap::Header &aHeader, Message &aMessag memcpy(&macAddr, mlIidTlv.GetIid(), sizeof(macAddr)); macAddr.m8[0] ^= 0x2; - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValid); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValid); !iter.IsDone(); iter++) { Child &child = *iter.GetChild(); @@ -634,7 +634,7 @@ void AddressResolver::HandleAddressQuery(Coap::Header &aHeader, Message &aMessag ExitNow(); } - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValid); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValid); !iter.IsDone(); iter++) { Child &child = *iter.GetChild(); diff --git a/src/core/thread/child_table.hpp b/src/core/thread/child_table.hpp index 4f4ea14c3..61fe5782c 100644 --- a/src/core/thread/child_table.hpp +++ b/src/core/thread/child_table.hpp @@ -124,6 +124,26 @@ public: */ void Advance(void); + /** + * This method overloads `++` operator (pre-increment) to advance the iterator. + * + * The iterator is moved to point to the next `Child` entry matching the given state filter in the constructor. + * If there are no more `Child` entries matching the given filter, the iterator becomes empty (i.e., + * `GetChild()` returns `NULL` and `IsDone()` returns `true`). + * + */ + void operator++(void) { Advance(); } + + /** + * This method overloads `++` operator (post-increment) to advance the iterator. + * + * The iterator is moved to point to the next `Child` entry matching the given state filter in the constructor. + * If there are no more `Child` entries matching the given filter, the iterator becomes empty (i.e., + * `GetChild()` returns `NULL` and `IsDone()` returns `true`). + * + */ + void operator++(int) { Advance(); } + /** * This method gets the `Child` entry to which the iterator is currently pointing. * @@ -307,6 +327,8 @@ public: void Reset(void) {} bool IsDone(void) const { return true; } void Advance(void) {} + void operator++(void) {} + void operator++(int) {} Child *GetChild(void) { return NULL; } }; diff --git a/src/core/thread/key_manager.cpp b/src/core/thread/key_manager.cpp index ee5fe81e1..ff8902401 100644 --- a/src/core/thread/key_manager.cpp +++ b/src/core/thread/key_manager.cpp @@ -138,7 +138,7 @@ otError KeyManager::SetMasterKey(const otMasterKey &aKey) routers->SetMleFrameCounter(0); // reset router frame counters - for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter.Advance()) + for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter++) { iter.GetRouter()->SetKeySequence(0); iter.GetRouter()->SetLinkFrameCounter(0); @@ -146,7 +146,7 @@ otError KeyManager::SetMasterKey(const otMasterKey &aKey) } // reset child frame counters - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateAnyExceptInvalid); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateAnyExceptInvalid); !iter.IsDone(); iter++) { iter.GetChild()->SetKeySequence(0); iter.GetChild()->SetLinkFrameCounter(0); diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index a1cebb93f..2e54972bf 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -146,7 +146,7 @@ exit: void MeshForwarder::RemoveMessage(Message &aMessage) { - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateAnyExceptInvalid); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateAnyExceptInvalid); !iter.IsDone(); iter++) { IgnoreReturnValue(RemoveMessageFromSleepyChild(aMessage, *iter.GetChild())); } diff --git a/src/core/thread/mesh_forwarder_ftd.cpp b/src/core/thread/mesh_forwarder_ftd.cpp index cfb1d287c..07f75aa3e 100644 --- a/src/core/thread/mesh_forwarder_ftd.cpp +++ b/src/core/thread/mesh_forwarder_ftd.cpp @@ -79,7 +79,7 @@ otError MeshForwarder::SendMessage(Message &aMessage) { // destined for all sleepy children for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); - iter.Advance()) + iter++) { Child &child = *iter.GetChild(); @@ -94,7 +94,7 @@ otError MeshForwarder::SendMessage(Message &aMessage) { // destined for some sleepy children which subscribed the multicast address. for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); - iter.Advance()) + iter++) { Child &child = *iter.GetChild(); @@ -222,8 +222,7 @@ exit: void MeshForwarder::UpdateIndirectMessages(void) { - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateAnyExceptValidOrRestoing); !iter.IsDone(); - iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateAnyExceptValidOrRestoing); !iter.IsDone(); iter++) { if (iter.GetChild()->GetIndirectMessageCount() == 0) { @@ -351,8 +350,7 @@ void MeshForwarder::RemoveDataResponseMessages(void) if (!(ip6Header.GetDestination().IsMulticast())) { - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateAnyExceptInvalid); !iter.IsDone(); - iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateAnyExceptInvalid); !iter.IsDone(); iter++) { IgnoreReturnValue(RemoveMessageFromSleepyChild(*message, *iter.GetChild())); } @@ -377,7 +375,7 @@ otError MeshForwarder::GetIndirectTransmission(void) UpdateIndirectMessages(); for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring, mIndirectStartingChild); - !iter.IsDone(); iter.Advance()) + !iter.IsDone(); iter++) { Child &child = *iter.GetChild(); @@ -592,7 +590,7 @@ void MeshForwarder::HandleSentFrameToChild(const Mac::Frame &aFrame, otError aEr // through the children list from this child. ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring, mIndirectStartingChild); - iter.Advance(); + iter++; mIndirectStartingChild = iter.GetChild(); switch (aError) diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 834a388bc..664280646 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -311,7 +311,7 @@ otError MleRouter::SetStateRouter(uint16_t aRloc16) mRouterTable.Clear(); // remove children that do not have matching RLOC16 - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter++) { if (GetRouterId(iter.GetChild()->GetRloc16()) != mRouterId) { @@ -352,7 +352,7 @@ otError MleRouter::SetStateLeader(uint16_t aRloc16) netif.GetAddressResolver().Clear(); // remove children that do not have matching RLOC16 - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter++) { if (GetRouterId(iter.GetChild()->GetRloc16()) != mRouterId) { @@ -1482,7 +1482,7 @@ void MleRouter::UpdateRoutes(const RouteTlv &aRoute, uint8_t aRouterId) otLogInfoMle(GetInstance(), "Route table updated"); - for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter.Advance()) + for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter++) { Router &router = *iter.GetRouter(); @@ -1689,7 +1689,7 @@ void MleRouter::HandleStateUpdateTimer(void) } // update children state - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateAnyExceptInvalid); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateAnyExceptInvalid); !iter.IsDone(); iter++) { Child & child = *iter.GetChild(); uint32_t timeout = 0; @@ -1726,7 +1726,7 @@ void MleRouter::HandleStateUpdateTimer(void) } // update router state - for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter.Advance()) + for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter++) { Router & router = *iter.GetRouter(); uint32_t age; @@ -1933,8 +1933,7 @@ otError MleRouter::UpdateChildAddresses(const Message &aMessage, uint16_t aOffse // table is timed out and then trying to register its globally unique // IPv6 address as the new child. - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); - iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter++) { if (iter.GetChild() == &aChild) { @@ -2433,7 +2432,7 @@ void MleRouter::SynchronizeChildNetworkData(void) VerifyOrExit(mRole == OT_DEVICE_ROLE_ROUTER || mRole == OT_DEVICE_ROLE_LEADER); - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValid); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValid); !iter.IsDone(); iter++) { Child & child = *iter.GetChild(); uint8_t version; @@ -3180,7 +3179,7 @@ Neighbor *MleRouter::GetNeighbor(const Ip6::Address &aAddress) context.mContextId = 0xff; } - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter++) { child = iter.GetChild(); @@ -3384,7 +3383,7 @@ void MleRouter::RestoreChildren(void) bool foundDuplicate = false; uint8_t numChildren = 0; - for (Settings::ChildInfoIterator iter(GetInstance()); !iter.IsDone(); iter.Advance()) + for (Settings::ChildInfoIterator iter(GetInstance()); !iter.IsDone(); iter++) { Child * child; const Settings::ChildInfo &childInfo = iter.GetChildInfo(); @@ -3431,7 +3430,7 @@ otError MleRouter::RemoveStoredChild(uint16_t aChildRloc16) { otError error = OT_ERROR_NOT_FOUND; - for (Settings::ChildInfoIterator iter(GetInstance()); !iter.IsDone(); iter.Advance()) + for (Settings::ChildInfoIterator iter(GetInstance()); !iter.IsDone(); iter++) { if (iter.GetChildInfo().mRloc16 == aChildRloc16) { @@ -3473,7 +3472,7 @@ otError MleRouter::RefreshStoredChildren(void) SuccessOrExit(error = GetInstance().GetSettings().DeleteChildInfo()); - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateAnyExceptInvalid); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateAnyExceptInvalid); !iter.IsDone(); iter++) { SuccessOrExit(error = StoreChild(iter.GetChild()->GetRloc16())); } @@ -3860,7 +3859,7 @@ void MleRouter::HandleAddressSolicitResponse(Coap::Header * aHeader, SendLinkRequest(NULL); // send child id responses - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateChildIdRequest); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateChildIdRequest); !iter.IsDone(); iter++) { SendChildIdResponse(*iter.GetChild()); } @@ -4136,7 +4135,7 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv) aTlv.SetActiveRouters(mRouterTable.GetActiveRouterCount()); - for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter.Advance()) + for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter++) { Router &router = *iter.GetRouter(); uint8_t linkQuality; @@ -4243,7 +4242,7 @@ void MleRouter::FillRouteTlv(RouteTlv &aTlv) aTlv.SetRouterIdSequence(mRouterTable.GetRouterIdSequence()); aTlv.ClearRouterIdMask(); - for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter.Advance(), routerCount++) + for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter++, routerCount++) { Router &router = *iter.GetRouter(); @@ -4320,7 +4319,7 @@ bool MleRouter::HasMinDowngradeNeighborRouters(void) uint8_t linkQuality; uint8_t routerCount = 0; - for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter.Advance()) + for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter++) { Router &router = *iter.GetRouter(); @@ -4350,7 +4349,7 @@ bool MleRouter::HasOneNeighborWithComparableConnectivity(const RouteTlv &aRoute, bool rval = true; // process local neighbor routers - for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter.Advance()) + for (RouterTable::Iterator iter(GetInstance()); !iter.IsDone(); iter++) { Router &router = *iter.GetRouter(); uint8_t localLinkQuality = 0; @@ -4435,7 +4434,7 @@ bool MleRouter::HasChildren(void) void MleRouter::RemoveChildren(void) { - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter++) { RemoveNeighbor(*iter.GetChild()); } @@ -4480,7 +4479,7 @@ otError MleRouter::GetMaxChildTimeout(uint32_t &aTimeout) const VerifyOrExit(mRole == OT_DEVICE_ROLE_ROUTER || mRole == OT_DEVICE_ROLE_LEADER, error = OT_ERROR_INVALID_STATE); - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValid); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValid); !iter.IsDone(); iter++) { Child &child = *iter.GetChild(); @@ -4530,7 +4529,7 @@ bool MleRouter::HasSleepyChildrenSubscribed(const Ip6::Address &aAddress) { bool rval = false; - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter++) { Child &child = *iter.GetChild(); diff --git a/src/core/thread/network_diagnostic.cpp b/src/core/thread/network_diagnostic.cpp index e22af31ce..147134503 100644 --- a/src/core/thread/network_diagnostic.cpp +++ b/src/core/thread/network_diagnostic.cpp @@ -245,7 +245,7 @@ otError NetworkDiagnostic::AppendChildTable(Message &aMessage) SuccessOrExit(error = aMessage.Append(&tlv, sizeof(ChildTableTlv))); - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValid); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValid); !iter.IsDone(); iter++) { Child &child = *iter.GetChild(); diff --git a/src/core/thread/router_table.hpp b/src/core/thread/router_table.hpp index d4c69d119..83b697c58 100644 --- a/src/core/thread/router_table.hpp +++ b/src/core/thread/router_table.hpp @@ -82,6 +82,24 @@ public: */ void Advance(void); + /** + * This method overloads `++` operator (pre-increment) to advance the iterator. + * + * The iterator is moved to point to the next entry. If there are no more entries matching the iterator + * becomes empty (i.e., `GetRouter()` returns `NULL` and `IsDone()` returns `true`). + * + */ + void operator++(void) { Advance(); } + + /** + * This method overloads `++` operator (post-increment) to advance the iterator. + * + * The iterator is moved to point to the next entry. If there are no more entries matching the iterator + * becomes empty (i.e., `GetRouter()` returns `NULL` and `IsDone()` returns `true`). + * + */ + void operator++(int) { Advance(); } + /** * This method gets the entry to which the iterator is currently pointing. * @@ -327,6 +345,8 @@ public: void Reset(void) {} bool IsDone(void) const { return true; } void Advance(void) {} + void operator++(void) {} + void operator++(int) {} Router *GetRouter(void) { return NULL; } }; diff --git a/src/core/thread/src_match_controller.cpp b/src/core/thread/src_match_controller.cpp index ea692b20f..95050dee2 100644 --- a/src/core/thread/src_match_controller.cpp +++ b/src/core/thread/src_match_controller.cpp @@ -219,7 +219,7 @@ otError SourceMatchController::AddPendingEntries(void) { otError error = OT_ERROR_NONE; - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValidOrRestoring); !iter.IsDone(); iter++) { if (iter.GetChild()->IsIndirectSourceMatchPending()) { diff --git a/src/core/utils/child_supervision.cpp b/src/core/utils/child_supervision.cpp index a7e1dfd28..71d026454 100644 --- a/src/core/utils/child_supervision.cpp +++ b/src/core/utils/child_supervision.cpp @@ -124,7 +124,7 @@ void ChildSupervisor::HandleTimer(void) { VerifyOrExit(mSupervisionInterval != 0); - for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValid); !iter.IsDone(); iter.Advance()) + for (ChildTable::Iterator iter(GetInstance(), ChildTable::kInStateValid); !iter.IsDone(); iter++) { Child &child = *iter.GetChild(); diff --git a/tests/unit/test_child_table.cpp b/tests/unit/test_child_table.cpp index af5b13e7a..6775ae4ae 100644 --- a/tests/unit/test_child_table.cpp +++ b/tests/unit/test_child_table.cpp @@ -175,14 +175,14 @@ void VerifyChildTableContent(ChildTable &aTable, uint8_t aChildListLength, const VerifyOrQuit(iter.GetChild() == startingChild, "Iterator failed to start from the given child entry"); - iter.Advance(); + iter++; iter.Reset(); VerifyOrQuit(iter.GetChild() == startingChild, "iterator Reset() failed"); } // Use the iterator and verify that each returned `Child` entry is in the expected list. - for (; !iter.IsDone(); iter.Advance()) + for (; !iter.IsDone(); iter++) { Child * child = iter.GetChild(); bool didFind = false; @@ -212,7 +212,7 @@ void VerifyChildTableContent(ChildTable &aTable, uint8_t aChildListLength, const VerifyOrQuit(iter.GetChild() == NULL, "iterator GetChild() failed"); - iter.Advance(); + iter++; VerifyOrQuit(iter.IsDone(), "iterator Advance() (after iterator is done) failed"); VerifyOrQuit(iter.GetChild() == NULL, "iterator GetChild() failed");