42#ifndef _DWMIPV6ADDRMAP_HH_
43#define _DWMIPV6ADDRMAP_HH_
46#include <shared_mutex>
47#include <unordered_map>
63 struct OurIpv6AddressHash
75 template <
typename T,
typename Hash = OurIpv6AddressHash>
85 _map.max_load_factor(0.25);
93 std::unique_lock lck(_mtx);
101 void Add(std::unique_lock<std::shared_mutex> & lck,
104 assert((lck.mutex() == &_mtx) && lck.owns_lock());
112 bool Find(
const Ipv6Address & addr, T & value)
const
114 std::shared_lock lck(_mtx);
115 return Find(lck, addr, value);
121 bool Find(std::shared_lock<std::shared_mutex> & lck,
124 assert((lck.mutex() == &_mtx) && lck.owns_lock());
125 return FindNoLock(addr, value);
131 bool Find(std::unique_lock<std::shared_mutex> & lck,
134 assert((lck.mutex() == &_mtx) && lck.owns_lock());
135 return FindNoLock(addr, value);
143 std::unique_lock lck(_mtx);
144 return Remove(lck, addr);
150 bool Remove(std::unique_lock<std::shared_mutex> & lck,
154 assert((lck.mutex() == &_mtx) && lck.owns_lock());
155 auto it = _map.find(addr);
156 if (it != _map.end()) {
168 std::shared_lock lck(_mtx);
175 bool Empty(std::shared_lock<std::shared_mutex> & lck)
const
177 assert((lck.mutex() == &_mtx) && lck.owns_lock());
184 bool Empty(std::unique_lock<std::shared_mutex> & lck)
const
186 assert((lck.mutex() == &_mtx) && lck.owns_lock());
195 std::unique_lock lck(_mtx);
202 void Clear(std::unique_lock<std::shared_mutex> & lck)
204 assert((lck.mutex() == &_mtx) && lck.owns_lock());
212 std::istream &
Read(std::istream & is)
214 std::unique_lock lck(_mtx);
221 std::ostream &
Write(std::ostream & os)
const
223 std::shared_lock lck(_mtx);
233 std::unique_lock lck(_mtx);
243 std::shared_lock lck(_mtx);
253 std::unique_lock lck(_mtx);
263 std::shared_lock lck(_mtx);
275 std::unique_lock lck(_mtx);
287 std::shared_lock lck(_mtx);
299 std::unique_lock lck(_mtx);
311 std::shared_lock lck(_mtx);
321 std::shared_lock lck(_mtx);
329 bool Read(boost::asio::ip::tcp::socket & s,
330 boost::system::error_code & ec)
332 std::unique_lock lck(_mtx);
340 bool Write(boost::asio::ip::tcp::socket & s,
341 boost::system::error_code & ec)
const
343 std::shared_lock lck(_mtx);
351 bool Read(boost::asio::local::stream_protocol::socket & s,
352 boost::system::error_code & ec)
354 std::unique_lock lck(_mtx);
362 bool Write(boost::asio::local::stream_protocol::socket & s,
363 boost::system::error_code & ec)
const
365 std::shared_lock lck(_mtx);
373 bool Read(boost::asio::generic::stream_protocol::socket & s,
374 boost::system::error_code & ec)
376 std::unique_lock lck(_mtx);
384 bool Write(boost::asio::generic::stream_protocol::socket & s,
385 boost::system::error_code & ec)
const
387 std::shared_lock lck(_mtx);
394 std::shared_lock<std::shared_mutex> SharedLock()
const
396 return std::shared_lock(_mtx);
402 std::unique_lock<std::shared_mutex> UniqueLock()
404 return std::unique_lock(_mtx);
408 mutable std::shared_mutex _mtx;
409 std::unordered_map<Ipv6Address,T,Hash> _map;
414 bool FindNoLock(
const Ipv6Address & addr, T & value)
const
416 auto iter = _map.find(addr);
417 if (iter != _map.end()) {
418 value = iter->second;
Dwm::ASIO class declaration.
Dwm::BZ2IO class declaration.
Dwm::DescriptorIO class declaration.
Dwm::FileIO class declaration.
Dwm::GZIO class definition.
Dwm::IOUtils class declaration and implementation.
Dwm::Ipv6Address class definition.
Dwm::StreamIO class declaration.
static bool Write(boost::asio::ip::tcp::socket &s, uint8_t value, boost::system::error_code &ec)
Write value to the given socket s.
static bool Read(boost::asio::ip::tcp::socket &s, uint8_t &value, boost::system::error_code &ec)
Reads value from the given socket s.
static int BZRead(BZFILE *bzf, char &c)
Reads from bzf.
static int BZWrite(BZFILE *bzf, char c)
Writes c to bzf.
static ssize_t Write(int fd, char c)
Writes c to fd.
static ssize_t Read(int fd, char &c)
Reads c from fd.
static size_t Write(FILE *f, char c)
Writes c to f.
static size_t Read(FILE *f, char &c)
Reads c from f.
static int Write(gzFile gzf, char c)
Writes c to gzf.
static int Read(gzFile gzf, char &c)
Reads from gzf.
static uint64_t StreamedLength(char c)
Returns the number of bytes that would be written if we called Write() for a char.
Definition DwmIOUtils.hh:85
A thin wrapper around std::unordered_map<Ipv6Address,T,Hash>.
Definition DwmIpv6AddrMap.hh:77
std::istream & Read(std::istream &is)
Reads the Ipv6AddrMap from an istream. Returns the istream.
Definition DwmIpv6AddrMap.hh:212
int BZWrite(BZFILE *bzf) const
Writes the Ipv6AddrMap to bzf.
Definition DwmIpv6AddrMap.hh:309
size_t Read(FILE *f)
Reads the Ipv6AddrMap from f.
Definition DwmIpv6AddrMap.hh:231
ssize_t Write(int fd) const
Writes the Ipv6AddrMap to file descriptor fd.
Definition DwmIpv6AddrMap.hh:261
std::ostream & Write(std::ostream &os) const
Writes the Ipv6AddrMap to an ostream. Returns the ostream.
Definition DwmIpv6AddrMap.hh:221
int Read(gzFile gzf)
Reads the Ipv6AddrMap from gzf.
Definition DwmIpv6AddrMap.hh:273
bool Write(boost::asio::ip::tcp::socket &s, boost::system::error_code &ec) const
Writes the Ipv6AddrMap to s.
Definition DwmIpv6AddrMap.hh:340
bool Read(boost::asio::ip::tcp::socket &s, boost::system::error_code &ec)
Reads the Ipv6AddrMap from s.
Definition DwmIpv6AddrMap.hh:329
bool Write(boost::asio::generic::stream_protocol::socket &s, boost::system::error_code &ec) const
Writes the Ipv6AddrMap to s.
Definition DwmIpv6AddrMap.hh:384
int Write(gzFile gzf) const
Writes the Ipv6AddrMap to gzf.
Definition DwmIpv6AddrMap.hh:285
bool Read(boost::asio::local::stream_protocol::socket &s, boost::system::error_code &ec)
Reads the Ipv6AddrMap from s.
Definition DwmIpv6AddrMap.hh:351
size_t Write(FILE *f) const
Writes the Ipv6AddrMap to f.
Definition DwmIpv6AddrMap.hh:241
int BZRead(BZFILE *bzf)
Reads the Ipv6AddrMap from bzf.
Definition DwmIpv6AddrMap.hh:297
bool Read(boost::asio::generic::stream_protocol::socket &s, boost::system::error_code &ec)
Reads the Ipv6AddrMap from s.
Definition DwmIpv6AddrMap.hh:373
uint64_t StreamedLength() const
Returns the number of bytes that would be written if the Ipv6AddrMap was written to a FILE,...
Definition DwmIpv6AddrMap.hh:319
bool Write(boost::asio::local::stream_protocol::socket &s, boost::system::error_code &ec) const
Writes the Ipv6AddrMap to s.
Definition DwmIpv6AddrMap.hh:362
ssize_t Read(int fd)
Reads the Ipv6AddrMap from file descriptor fd.
Definition DwmIpv6AddrMap.hh:251
This class encapsulates an IPv6 address.
Definition DwmIpv6Address.hh:64
uint64_t Hash() const
Returns a 64-bit hash value for the Ipv6Address.
Definition DwmIpv6Address.hh:289
static std::istream & Read(std::istream &is, char &c)
Reads c from is. Returns is.
static std::ostream & Write(std::ostream &os, char c)
Writes c to os. Returns os.