42#ifndef _DWMIPV4ADDRMAP_HH_
43#define _DWMIPV4ADDRMAP_HH_
47#include <shared_mutex>
48#include <unordered_map>
64 using MapType = std::unordered_map<ipv4addr_t,T>;
72 _map.max_load_factor(0.15);
78 void Add(
const Ipv4Address & addr,
const T & value)
80 std::unique_lock lck(_mtx);
81 return Add(lck, addr, value);
87 void Add(std::unique_lock<std::shared_mutex> & lck,
88 const Ipv4Address & addr,
const T & value)
90 assert((lck.mutex() == &_mtx) && lck.owns_lock());
91 _map[addr.Raw()] = value;
98 bool Find(
const Ipv4Address & addr, T & value)
const
100 std::shared_lock lck(_mtx);
101 return Find(lck, addr, value);
107 bool Find(std::shared_lock<std::shared_mutex> & lck,
108 const Ipv4Address & addr, T & value)
const
110 assert((lck.mutex() == &_mtx) && lck.owns_lock());
111 auto iter = _map.find(addr.Raw());
112 if (iter != _map.end()) {
113 value = iter->second;
122 bool Find(std::unique_lock<std::shared_mutex> & lck,
123 const Ipv4Address & addr, T & value)
125 assert((lck.mutex() == &_mtx) && lck.owns_lock());
126 auto iter = _map.find(addr.Raw());
127 if (iter != _map.end()) {
128 value = iter->second;
137 bool Remove(
const Ipv4Address & addr)
139 std::unique_lock lck(_mtx);
140 return Remove(lck, addr);
146 bool Remove(std::unique_lock<std::shared_mutex> & lck,
147 const Ipv4Address & addr)
149 assert((lck.mutex() == &_mtx) && lck.owns_lock());
151 auto it = _map.find(addr.Raw());
152 if (it != _map.end()) {
164 std::shared_lock lck(_mtx);
171 bool Empty(std::shared_lock<std::shared_mutex> & lck)
const
173 assert((lck.mutex() == &_mtx) && lck.owns_lock());
180 bool Empty(std::unique_lock<std::shared_mutex> & lck)
182 assert((lck.mutex() == &_mtx) && lck.owns_lock());
189 const MapType & Map(std::shared_lock<std::shared_mutex> & lck)
const
191 assert((lck.mutex() == &_mtx) && lck.owns_lock());
198 MapType & Map(std::unique_lock<std::shared_mutex> & lck)
200 assert((lck.mutex() == &_mtx) && lck.owns_lock());
209 std::unique_lock lck(_mtx);
217 void Clear(std::unique_lock<std::shared_mutex> & lck)
219 assert((lck.mutex() == &_mtx) && lck.owns_lock());
227 std::shared_lock<std::shared_mutex> SharedLock()
const
229 return std::shared_lock(_mtx);
235 std::unique_lock<std::shared_mutex> UniqueLock()
const
237 return std::unique_lock(_mtx);
241 mutable std::shared_mutex _mtx;
Dwm::Ipv4Address class definition.