mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-27 04:23:33 +08:00
Refactored Map<>
This commit is contained in:
@@ -146,7 +146,7 @@ class NodeDiscoverer : TimerBase
|
|||||||
{
|
{
|
||||||
HighestUptimeSearcher searcher;
|
HighestUptimeSearcher searcher;
|
||||||
|
|
||||||
const NodeID* const out = node_map_.findFirstKey<HighestUptimeSearcher&>(searcher);
|
const NodeID* const out = node_map_.find<HighestUptimeSearcher&>(searcher);
|
||||||
(void)out;
|
(void)out;
|
||||||
UAVCAN_ASSERT(out == NULL);
|
UAVCAN_ASSERT(out == NULL);
|
||||||
|
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
listeners_.removeWhere(
|
listeners_.removeAllWhere(
|
||||||
GenericHandlerCaller<const NodeStatusChangeEvent&>(&INodeInfoListener::handleNodeStatusChange, event));
|
GenericHandlerCaller<const NodeStatusChangeEvent&>(&INodeInfoListener::handleNodeStatusChange, event));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,8 +271,8 @@ private:
|
|||||||
entry.uptime_sec = msg.uptime_sec;
|
entry.uptime_sec = msg.uptime_sec;
|
||||||
entry.updated_since_last_attempt = true;
|
entry.updated_since_last_attempt = true;
|
||||||
|
|
||||||
listeners_.removeWhere(GenericHandlerCaller<const ReceivedDataStructure<protocol::NodeStatus>&>(
|
listeners_.removeAllWhere(GenericHandlerCaller<const ReceivedDataStructure<protocol::NodeStatus>&>(
|
||||||
&INodeInfoListener::handleNodeStatusMessage, msg));
|
&INodeInfoListener::handleNodeStatusMessage, msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleGetNodeInfoResponse(const ServiceCallResult<protocol::GetNodeInfo>& result)
|
void handleGetNodeInfoResponse(const ServiceCallResult<protocol::GetNodeInfo>& result)
|
||||||
@@ -287,8 +287,8 @@ private:
|
|||||||
*/
|
*/
|
||||||
entry.uptime_sec = result.getResponse().status.uptime_sec;
|
entry.uptime_sec = result.getResponse().status.uptime_sec;
|
||||||
entry.request_needed = false;
|
entry.request_needed = false;
|
||||||
listeners_.removeWhere(NodeInfoRetrievedHandlerCaller(result.getCallID().server_node_id,
|
listeners_.removeAllWhere(NodeInfoRetrievedHandlerCaller(result.getCallID().server_node_id,
|
||||||
result.getResponse()));
|
result.getResponse()));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -298,8 +298,8 @@ private:
|
|||||||
if (entry.num_attempts_made >= num_attempts_)
|
if (entry.num_attempts_made >= num_attempts_)
|
||||||
{
|
{
|
||||||
entry.request_needed = false;
|
entry.request_needed = false;
|
||||||
listeners_.removeWhere(GenericHandlerCaller<NodeID>(&INodeInfoListener::handleNodeInfoUnavailable,
|
listeners_.removeAllWhere(GenericHandlerCaller<NodeID>(
|
||||||
result.getCallID().server_node_id));
|
&INodeInfoListener::handleNodeInfoUnavailable, result.getCallID().server_node_id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -165,13 +165,13 @@ TransferID* OutgoingTransferRegistry<NumStaticEntries>::accessOrCreate(const Out
|
|||||||
template <int NumStaticEntries>
|
template <int NumStaticEntries>
|
||||||
bool OutgoingTransferRegistry<NumStaticEntries>::exists(DataTypeID dtid, TransferType tt) const
|
bool OutgoingTransferRegistry<NumStaticEntries>::exists(DataTypeID dtid, TransferType tt) const
|
||||||
{
|
{
|
||||||
return NULL != map_.findFirstKey(ExistenceCheckingPredicate(dtid, tt));
|
return NULL != map_.find(ExistenceCheckingPredicate(dtid, tt));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <int NumStaticEntries>
|
template <int NumStaticEntries>
|
||||||
void OutgoingTransferRegistry<NumStaticEntries>::cleanup(MonotonicTime ts)
|
void OutgoingTransferRegistry<NumStaticEntries>::cleanup(MonotonicTime ts)
|
||||||
{
|
{
|
||||||
map_.removeWhere(DeadlineExpiredPredicate(ts));
|
map_.removeAllWhere(DeadlineExpiredPredicate(ts));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ public:
|
|||||||
virtual ~TransferListener()
|
virtual ~TransferListener()
|
||||||
{
|
{
|
||||||
// Map must be cleared before bufmgr is destroyed
|
// Map must be cleared before bufmgr is destroyed
|
||||||
receivers_.removeAll();
|
receivers_.clear();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ private:
|
|||||||
const unsigned num_static_entries_;
|
const unsigned num_static_entries_;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
KVPair* find(const Key& key);
|
KVPair* findKey(const Key& key);
|
||||||
|
|
||||||
#if !UAVCAN_TINY
|
#if !UAVCAN_TINY
|
||||||
void optimizeStorage();
|
void optimizeStorage();
|
||||||
@@ -117,7 +117,7 @@ private:
|
|||||||
|
|
||||||
struct YesPredicate
|
struct YesPredicate
|
||||||
{
|
{
|
||||||
bool operator()(const Key& k, const Value& v) const { (void)k; (void)v; return true; }
|
bool operator()(const Key&, const Value&) const { return true; }
|
||||||
};
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -137,7 +137,7 @@ protected:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Derived class destructor must call removeAll();
|
/// Derived class destructor must call clear();
|
||||||
~MapBase()
|
~MapBase()
|
||||||
{
|
{
|
||||||
UAVCAN_ASSERT(getSize() == 0);
|
UAVCAN_ASSERT(getSize() == 0);
|
||||||
@@ -165,7 +165,7 @@ public:
|
|||||||
* bool (Key& key, Value& value)
|
* bool (Key& key, Value& value)
|
||||||
*/
|
*/
|
||||||
template <typename Predicate>
|
template <typename Predicate>
|
||||||
void removeWhere(Predicate predicate);
|
void removeAllWhere(Predicate predicate);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns first entry where the predicate returns true.
|
* Returns first entry where the predicate returns true.
|
||||||
@@ -173,9 +173,12 @@ public:
|
|||||||
* bool (const Key& key, const Value& value)
|
* bool (const Key& key, const Value& value)
|
||||||
*/
|
*/
|
||||||
template <typename Predicate>
|
template <typename Predicate>
|
||||||
const Key* findFirstKey(Predicate predicate) const;
|
const Key* find(Predicate predicate) const;
|
||||||
|
|
||||||
void removeAll();
|
/**
|
||||||
|
* Removes all items.
|
||||||
|
*/
|
||||||
|
void clear();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a key-value pair located at the specified position from the beginning.
|
* Returns a key-value pair located at the specified position from the beginning.
|
||||||
@@ -185,7 +188,10 @@ public:
|
|||||||
KVPair* getByIndex(unsigned index);
|
KVPair* getByIndex(unsigned index);
|
||||||
const KVPair* getByIndex(unsigned index) const;
|
const KVPair* getByIndex(unsigned index) const;
|
||||||
|
|
||||||
bool isEmpty() const;
|
/**
|
||||||
|
* Complexity is O(1).
|
||||||
|
*/
|
||||||
|
bool isEmpty() const { return find(YesPredicate()) == NULL; }
|
||||||
|
|
||||||
unsigned getSize() const;
|
unsigned getSize() const;
|
||||||
|
|
||||||
@@ -211,7 +217,7 @@ public:
|
|||||||
: MapBase<Key, Value>(static_, NumStaticEntries, allocator)
|
: MapBase<Key, Value>(static_, NumStaticEntries, allocator)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
~Map() { this->removeAll(); }
|
~Map() { this->clear(); }
|
||||||
|
|
||||||
#endif // !UAVCAN_TINY
|
#endif // !UAVCAN_TINY
|
||||||
};
|
};
|
||||||
@@ -229,7 +235,7 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
~Map() { this->removeAll(); }
|
~Map() { this->clear(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -238,7 +244,7 @@ public:
|
|||||||
* MapBase<>
|
* MapBase<>
|
||||||
*/
|
*/
|
||||||
template <typename Key, typename Value>
|
template <typename Key, typename Value>
|
||||||
typename MapBase<Key, Value>::KVPair* MapBase<Key, Value>::find(const Key& key)
|
typename MapBase<Key, Value>::KVPair* MapBase<Key, Value>::findKey(const Key& key)
|
||||||
{
|
{
|
||||||
#if !UAVCAN_TINY
|
#if !UAVCAN_TINY
|
||||||
for (unsigned i = 0; i < num_static_entries_; i++)
|
for (unsigned i = 0; i < num_static_entries_; i++)
|
||||||
@@ -348,7 +354,7 @@ template <typename Key, typename Value>
|
|||||||
Value* MapBase<Key, Value>::access(const Key& key)
|
Value* MapBase<Key, Value>::access(const Key& key)
|
||||||
{
|
{
|
||||||
UAVCAN_ASSERT(!(key == Key()));
|
UAVCAN_ASSERT(!(key == Key()));
|
||||||
KVPair* const kv = find(key);
|
KVPair* const kv = findKey(key);
|
||||||
return kv ? &kv->value : NULL;
|
return kv ? &kv->value : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,7 +364,7 @@ Value* MapBase<Key, Value>::insert(const Key& key, const Value& value)
|
|||||||
UAVCAN_ASSERT(!(key == Key()));
|
UAVCAN_ASSERT(!(key == Key()));
|
||||||
remove(key);
|
remove(key);
|
||||||
|
|
||||||
KVPair* const kv = find(Key());
|
KVPair* const kv = findKey(Key());
|
||||||
if (kv)
|
if (kv)
|
||||||
{
|
{
|
||||||
*kv = KVPair(key, value);
|
*kv = KVPair(key, value);
|
||||||
@@ -379,7 +385,7 @@ template <typename Key, typename Value>
|
|||||||
void MapBase<Key, Value>::remove(const Key& key)
|
void MapBase<Key, Value>::remove(const Key& key)
|
||||||
{
|
{
|
||||||
UAVCAN_ASSERT(!(key == Key()));
|
UAVCAN_ASSERT(!(key == Key()));
|
||||||
KVPair* const kv = find(key);
|
KVPair* const kv = findKey(key);
|
||||||
if (kv)
|
if (kv)
|
||||||
{
|
{
|
||||||
*kv = KVPair();
|
*kv = KVPair();
|
||||||
@@ -392,7 +398,7 @@ void MapBase<Key, Value>::remove(const Key& key)
|
|||||||
|
|
||||||
template <typename Key, typename Value>
|
template <typename Key, typename Value>
|
||||||
template <typename Predicate>
|
template <typename Predicate>
|
||||||
void MapBase<Key, Value>::removeWhere(Predicate predicate)
|
void MapBase<Key, Value>::removeAllWhere(Predicate predicate)
|
||||||
{
|
{
|
||||||
unsigned num_removed = 0;
|
unsigned num_removed = 0;
|
||||||
|
|
||||||
@@ -439,7 +445,7 @@ void MapBase<Key, Value>::removeWhere(Predicate predicate)
|
|||||||
|
|
||||||
template <typename Key, typename Value>
|
template <typename Key, typename Value>
|
||||||
template <typename Predicate>
|
template <typename Predicate>
|
||||||
const Key* MapBase<Key, Value>::findFirstKey(Predicate predicate) const
|
const Key* MapBase<Key, Value>::find(Predicate predicate) const
|
||||||
{
|
{
|
||||||
#if !UAVCAN_TINY
|
#if !UAVCAN_TINY
|
||||||
for (unsigned i = 0; i < num_static_entries_; i++)
|
for (unsigned i = 0; i < num_static_entries_; i++)
|
||||||
@@ -474,9 +480,9 @@ const Key* MapBase<Key, Value>::findFirstKey(Predicate predicate) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename Key, typename Value>
|
template <typename Key, typename Value>
|
||||||
void MapBase<Key, Value>::removeAll()
|
void MapBase<Key, Value>::clear()
|
||||||
{
|
{
|
||||||
removeWhere(YesPredicate());
|
removeAllWhere(YesPredicate());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Key, typename Value>
|
template <typename Key, typename Value>
|
||||||
@@ -525,12 +531,6 @@ const typename MapBase<Key, Value>::KVPair* MapBase<Key, Value>::getByIndex(unsi
|
|||||||
return const_cast<MapBase<Key, Value>*>(this)->getByIndex(index);
|
return const_cast<MapBase<Key, Value>*>(this)->getByIndex(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Key, typename Value>
|
|
||||||
bool MapBase<Key, Value>::isEmpty() const
|
|
||||||
{
|
|
||||||
return getSize() == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Key, typename Value>
|
template <typename Key, typename Value>
|
||||||
unsigned MapBase<Key, Value>::getSize() const
|
unsigned MapBase<Key, Value>::getSize() const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ void TransferListenerBase::handleAnonymousTransferReception(const RxFrame& frame
|
|||||||
|
|
||||||
void TransferListenerBase::cleanup(MonotonicTime ts)
|
void TransferListenerBase::cleanup(MonotonicTime ts)
|
||||||
{
|
{
|
||||||
receivers_.removeWhere(TimedOutReceiverPredicate(ts, bufmgr_));
|
receivers_.removeAllWhere(TimedOutReceiverPredicate(ts, bufmgr_));
|
||||||
UAVCAN_ASSERT(receivers_.isEmpty() ? bufmgr_.isEmpty() : 1);
|
UAVCAN_ASSERT(receivers_.isEmpty() ? bufmgr_.isEmpty() : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-11
@@ -105,18 +105,18 @@ TEST(Map, Basic)
|
|||||||
ASSERT_EQ("D", *map->access("4"));
|
ASSERT_EQ("D", *map->access("4"));
|
||||||
|
|
||||||
// Finding some keys
|
// Finding some keys
|
||||||
ASSERT_EQ("1", *map->findFirstKey(KeyFindPredicate("1")));
|
ASSERT_EQ("1", *map->find(KeyFindPredicate("1")));
|
||||||
ASSERT_EQ("2", *map->findFirstKey(KeyFindPredicate("2")));
|
ASSERT_EQ("2", *map->find(KeyFindPredicate("2")));
|
||||||
ASSERT_EQ("3", *map->findFirstKey(KeyFindPredicate("3")));
|
ASSERT_EQ("3", *map->find(KeyFindPredicate("3")));
|
||||||
ASSERT_EQ("4", *map->findFirstKey(KeyFindPredicate("4")));
|
ASSERT_EQ("4", *map->find(KeyFindPredicate("4")));
|
||||||
ASSERT_FALSE(map->findFirstKey(KeyFindPredicate("nonexistent_key")));
|
ASSERT_FALSE(map->find(KeyFindPredicate("nonexistent_key")));
|
||||||
|
|
||||||
// Finding some values
|
// Finding some values
|
||||||
ASSERT_EQ("1", *map->findFirstKey(ValueFindPredicate("A")));
|
ASSERT_EQ("1", *map->find(ValueFindPredicate("A")));
|
||||||
ASSERT_EQ("2", *map->findFirstKey(ValueFindPredicate("B")));
|
ASSERT_EQ("2", *map->find(ValueFindPredicate("B")));
|
||||||
ASSERT_EQ("3", *map->findFirstKey(ValueFindPredicate("C")));
|
ASSERT_EQ("3", *map->find(ValueFindPredicate("C")));
|
||||||
ASSERT_EQ("4", *map->findFirstKey(ValueFindPredicate("D")));
|
ASSERT_EQ("4", *map->find(ValueFindPredicate("D")));
|
||||||
ASSERT_FALSE(map->findFirstKey(KeyFindPredicate("nonexistent_value")));
|
ASSERT_FALSE(map->find(KeyFindPredicate("nonexistent_value")));
|
||||||
|
|
||||||
// Removing one static
|
// Removing one static
|
||||||
map->remove("1"); // One of dynamics now migrates to the static storage
|
map->remove("1"); // One of dynamics now migrates to the static storage
|
||||||
@@ -176,7 +176,7 @@ TEST(Map, Basic)
|
|||||||
// Removing odd values - nearly half of them
|
// Removing odd values - nearly half of them
|
||||||
ASSERT_EQ(2, map->getNumStaticPairs());
|
ASSERT_EQ(2, map->getNumStaticPairs());
|
||||||
const unsigned num_dynamics_old = map->getNumDynamicPairs();
|
const unsigned num_dynamics_old = map->getNumDynamicPairs();
|
||||||
map->removeWhere(oddValuePredicate);
|
map->removeAllWhere(oddValuePredicate);
|
||||||
ASSERT_EQ(2, map->getNumStaticPairs());
|
ASSERT_EQ(2, map->getNumStaticPairs());
|
||||||
const unsigned num_dynamics_new = map->getNumDynamicPairs();
|
const unsigned num_dynamics_new = map->getNumDynamicPairs();
|
||||||
std::cout << "Num of dynamic pairs reduced from " << num_dynamics_old << " to " << num_dynamics_new << std::endl;
|
std::cout << "Num of dynamic pairs reduced from " << num_dynamics_old << " to " << num_dynamics_new << std::endl;
|
||||||
|
|||||||
Reference in New Issue
Block a user