SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
Resolver.h
Go to the documentation of this file.
1 /*
2  * SWC-DB© Copyright since 2019 Alex Kashirin <kashirin.alex@gmail.com>
3  * License details at <https://github.com/kashirin-alex/swc-db/#license>
4  */
5 
6 
7 #ifndef swcdb_core_comm_Resolver_h
8 #define swcdb_core_comm_Resolver_h
9 
10 
13 
14 
15 namespace SWC {
16 
17 namespace Comm {
18 
19 typedef asio::ip::tcp::endpoint EndPoint;
21 
22 
24 std::ostream& operator<<(std::ostream& out, const EndPoint& endpoint) {
25  return (
26  endpoint.address().is_v4()
27  ? (out << endpoint.address().to_v4().to_string())
28  : (out << '[' << endpoint.address().to_v6().to_string() << ']')
29  ) << ':' << endpoint.port();
30 }
31 
32 
33 struct Network {
34  bool is_v4;
35  const asio::ip::network_v4 v4;
36  const asio::ip::network_v6 v6;
37 
39  Network(const asio::ip::network_v4& a_v4) noexcept
40  : is_v4(true), v4(a_v4), v6() { }
41 
43  Network(const asio::ip::network_v6& a_v6) noexcept
44  : is_v4(false), v4(), v6(a_v6) { }
45 
47  Network(const Network& net) noexcept
48  : is_v4(net.is_v4), v4(net.v4), v6(net.v6) {
49  }
50 };
51 
55 
56 } //namespace Comm
57 
58 
59 
60 namespace Serialization {
61 
63 uint8_t encoded_length(const Comm::EndPoint& endpoint) noexcept {
64  return 3 + (endpoint.address().is_v4() ? 4 : 16);
65 }
66 
67 void encode(uint8_t** bufp, const Comm::EndPoint& endpoint);
68 
69 Comm::EndPoint decode(const uint8_t** bufp, size_t* remainp);
70 
71 
72 uint32_t SWC_PURE_FUNC
73 encoded_length(const Comm::EndPoints& endpoints) noexcept;
74 
75 void encode(uint8_t** bufp, const Comm::EndPoints& endpoints);
76 
77 void decode(const uint8_t** bufp, size_t* remainp,
78  Comm::EndPoints& endpoints);
79 
81 Comm::EndPoints decode_endpoints(const uint8_t** bufp, size_t* remainp) {
82  Comm::EndPoints endpoints;
83  Serialization::decode(bufp, remainp, endpoints);
84  return endpoints;
85 }
86 
87 } //namespace Serialization
88 
89 
90 
91 namespace Comm {
92 
93 
94 void print(std::ostream& out, const EndPoints& endpoints);
95 
96 bool SWC_PURE_FUNC has_endpoint(const EndPoint& e1,
97  const EndPoints& endpoints_in) noexcept;
98 
99 bool SWC_PURE_FUNC has_endpoint(const EndPoints& endpoints,
100  const EndPoints& endpoints_in) noexcept;
101 
102 bool SWC_PURE_FUNC equal_endpoints(const EndPoints& endpoints1,
103  const EndPoints& endpoints2) noexcept;
104 
105 size_t endpoints_hash(const EndPoints& endpoints);
106 
107 size_t SWC_PURE_FUNC endpoint_hash(const EndPoint& endpoint) noexcept;
108 
109 
110 
112 namespace Resolver {
113 
114 
115 bool is_ipv4_address(const std::string& str) noexcept;
116 
117 bool is_ipv6_address(const std::string& str) noexcept;
118 
119 EndPoints get_endpoints(uint16_t defaul_port,
120  const Config::Strings& addrs,
121  const std::string& host,
122  const Networks& nets,
123  bool srv=false);
124 
125 void sort(const Networks& nets, const EndPoints& endpoints,
126  EndPoints& sorted);
127 
128 void get_networks(const Config::Strings& networks,
129  Networks& nets, asio::error_code& ec);
130 
131 void get_networks(const Config::Strings& networks,
132  Networks_v4& nets_v4,
133  Networks_v6& nets_v6,
134  asio::error_code& ec);
135 
136 void get_local_networks(int& err,
137  Networks_v4& nets_v4,
138  Networks_v6& nets_v6);
139 
140 bool is_network(const EndPoint& endpoint,
141  const Networks_v4& nets_v4,
142  const Networks_v6& nets_v6) noexcept;
143 
144 bool is_network(const EndPoint& endpoint,
145  const asio::ip::network_v4& net) noexcept;
146 
147 bool is_network(const EndPoint& endpoint,
148  const asio::ip::network_v6& net) noexcept;
149 
150 
151 }} // namespace Comm::Resolver
152 
153 
154 } // namespace SWC
155 
156 
157 
158 #ifdef SWC_IMPL_SOURCE
160 #endif
161 
162 #endif // swcdb_core_comm_Resolver_h
SWC::Comm::Network::v4
const asio::ip::network_v4 v4
Definition: Resolver.h:35
SWC::Comm::Resolver::is_network
bool is_network(const EndPoint &endpoint, const Networks_v4 &nets_v4, const Networks_v6 &nets_v6) noexcept
Definition: Resolver.cc:354
SWC::Comm::Resolver::get_networks
void get_networks(const Config::Strings &networks, Networks &nets, asio::error_code &ec)
Definition: Resolver.cc:264
SWC::Comm::Resolver::get_local_networks
void get_local_networks(int &err, Networks_v4 &nets_v4, Networks_v6 &nets_v6)
Definition: Resolver.cc:287
SWC::Comm::EndPoint
asio::ip::tcp::endpoint EndPoint
Definition: Resolver.h:19
SWC::Comm::Networks
Core::Vector< Network > Networks
Definition: Resolver.h:52
SWC::Comm::has_endpoint
bool SWC_PURE_FUNC has_endpoint(const EndPoint &e1, const EndPoints &endpoints_in) noexcept
Definition: Resolver.cc:93
SWC::Comm::Networks_v4
Core::Vector< asio::ip::network_v4 > Networks_v4
Definition: Resolver.h:53
SWC::Comm::endpoints_hash
size_t endpoints_hash(const EndPoints &endpoints)
Definition: Resolver.cc:120
SWC::Serialization::encoded_length
SWC_CAN_INLINE uint8_t encoded_length(const Comm::EndPoint &endpoint) noexcept
Definition: Resolver.h:63
SWC::Comm::print
void print(std::ostream &out, const EndPoints &endpoints)
Definition: Resolver.cc:85
SWC::Serialization::encode
void encode(uint8_t **bufp, const Comm::EndPoint &endpoint)
Definition: Resolver.cc:22
SWC::Comm::Networks_v6
Core::Vector< asio::ip::network_v6 > Networks_v6
Definition: Resolver.h:54
SWC_CAN_INLINE
#define SWC_CAN_INLINE
Definition: Compat.h:102
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
Property.h
SWC_PURE_FUNC
#define SWC_PURE_FUNC
Definition: Compat.h:108
SWC::Config::str
Property::Value_string::Ptr str(std::string &&v)
Definition: PropertiesParser.cc:45
SWC::Comm::Resolver::sort
void sort(const Networks &nets, const EndPoints &endpoints, EndPoints &sorted)
Definition: Resolver.cc:243
SWC::Comm::EndPoints
Core::Vector< EndPoint > EndPoints
Definition: Resolver.h:20
asio_wrap.h
SWC::Core::Vector< EndPoint >
SWC::Serialization::decode_endpoints
SWC_CAN_INLINE Comm::EndPoints decode_endpoints(const uint8_t **bufp, size_t *remainp)
Definition: Resolver.h:81
SWC::Comm::Resolver::is_ipv4_address
bool is_ipv4_address(const std::string &str) noexcept
Definition: Resolver.cc:141
SWC::Comm::Network::Network
SWC_CAN_INLINE Network(const asio::ip::network_v4 &a_v4) noexcept
Definition: Resolver.h:39
SWC::Comm::Network::Network
SWC_CAN_INLINE Network(const asio::ip::network_v6 &a_v6) noexcept
Definition: Resolver.h:43
SWC::Serialization::decode
Comm::EndPoint decode(const uint8_t **bufp, size_t *remainp)
Definition: Resolver.cc:35
Resolver.cc
SWC::Comm::Network::v6
const asio::ip::network_v6 v6
Definition: Resolver.h:36
SWC::Comm::Network::Network
SWC_CAN_INLINE Network(const Network &net) noexcept
Definition: Resolver.h:47
SWC::Comm::endpoint_hash
size_t SWC_PURE_FUNC endpoint_hash(const EndPoint &endpoint) noexcept
Definition: Resolver.cc:133
SWC::Comm::Resolver::is_ipv6_address
bool is_ipv6_address(const std::string &str) noexcept
Definition: Resolver.cc:147
SWC::Comm::Resolver::get_endpoints
EndPoints get_endpoints(uint16_t defaul_port, const Config::Strings &addrs, const std::string &host, const Networks &nets, bool srv=false)
Definition: Resolver.cc:152
SWC::Comm::operator<<
SWC_CAN_INLINE std::ostream & operator<<(std::ostream &out, const EndPoint &endpoint)
Definition: Resolver.h:24
SWC::Comm::Network::is_v4
bool is_v4
Definition: Resolver.h:34
SWC::Comm::equal_endpoints
bool SWC_PURE_FUNC equal_endpoints(const EndPoints &endpoints1, const EndPoints &endpoints2) noexcept
Definition: Resolver.cc:108
SWC::Comm::Network
Definition: Resolver.h:33