@@ -154,9 +154,8 @@ bool is_match_ipv4_ipv6(
154154 sizeof (uint32_t )) == 0 ;
155155}
156156
157- SocketAddress::CompareResult compare_ipv4 (
158- const SocketAddress& one,
159- const SocketAddress& two) {
157+ std::partial_ordering compare_ipv4 (const SocketAddress& one,
158+ const SocketAddress& two) {
160159 const sockaddr_in* one_in =
161160 reinterpret_cast <const sockaddr_in*>(one.data ());
162161 const sockaddr_in* two_in =
@@ -165,31 +164,29 @@ SocketAddress::CompareResult compare_ipv4(
165164 const uint32_t s_addr_two = ntohl (two_in->sin_addr .s_addr );
166165
167166 if (s_addr_one < s_addr_two)
168- return SocketAddress::CompareResult::LESS_THAN ;
167+ return std::partial_ordering::less ;
169168 else if (s_addr_one == s_addr_two)
170- return SocketAddress::CompareResult::SAME ;
169+ return std::partial_ordering::equivalent ;
171170 else
172- return SocketAddress::CompareResult::GREATER_THAN ;
171+ return std::partial_ordering::greater ;
173172}
174173
175- SocketAddress::CompareResult compare_ipv6 (
176- const SocketAddress& one,
177- const SocketAddress& two) {
174+ std::partial_ordering compare_ipv6 (const SocketAddress& one,
175+ const SocketAddress& two) {
178176 const sockaddr_in6* one_in =
179177 reinterpret_cast <const sockaddr_in6*>(one.data ());
180178 const sockaddr_in6* two_in =
181179 reinterpret_cast <const sockaddr_in6*>(two.data ());
182180 int ret = memcmp (&one_in->sin6_addr , &two_in->sin6_addr , 16 );
183181 if (ret < 0 )
184- return SocketAddress::CompareResult::LESS_THAN ;
182+ return std::partial_ordering::less ;
185183 else if (ret > 0 )
186- return SocketAddress::CompareResult::GREATER_THAN ;
187- return SocketAddress::CompareResult::SAME ;
184+ return std::partial_ordering::greater ;
185+ return std::partial_ordering::equivalent ;
188186}
189187
190- SocketAddress::CompareResult compare_ipv4_ipv6 (
191- const SocketAddress& ipv4,
192- const SocketAddress& ipv6) {
188+ std::partial_ordering compare_ipv4_ipv6 (const SocketAddress& ipv4,
189+ const SocketAddress& ipv6) {
193190 const sockaddr_in* ipv4_in =
194191 reinterpret_cast <const sockaddr_in*>(ipv4.data ());
195192 const sockaddr_in6 * ipv6_in =
@@ -199,18 +196,18 @@ SocketAddress::CompareResult compare_ipv4_ipv6(
199196 reinterpret_cast <const uint8_t *>(&ipv6_in->sin6_addr );
200197
201198 if (memcmp (ptr, mask, sizeof (mask)) != 0 )
202- return SocketAddress::CompareResult::NOT_COMPARABLE ;
199+ return std::partial_ordering::unordered ;
203200
204201 int ret = memcmp (
205202 &ipv4_in->sin_addr ,
206203 ptr + sizeof (mask),
207204 sizeof (uint32_t ));
208205
209206 if (ret < 0 )
210- return SocketAddress::CompareResult::LESS_THAN ;
207+ return std::partial_ordering::less ;
211208 else if (ret > 0 )
212- return SocketAddress::CompareResult::GREATER_THAN ;
213- return SocketAddress::CompareResult::SAME ;
209+ return std::partial_ordering::greater ;
210+ return std::partial_ordering::equivalent ;
214211}
215212
216213bool in_network_ipv4 (
@@ -235,7 +232,7 @@ bool in_network_ipv6(
235232 // Special case, if prefix == 128, then just do a
236233 // straight comparison.
237234 if (prefix == 128 )
238- return compare_ipv6 (ip, net) == SocketAddress::CompareResult::SAME ;
235+ return compare_ipv6 (ip, net) == std::partial_ordering::equivalent ;
239236
240237 uint8_t r = prefix % 8 ;
241238 int len = (prefix - r) / 8 ;
@@ -263,7 +260,7 @@ bool in_network_ipv4_ipv6(
263260 int prefix) {
264261
265262 if (prefix == 128 )
266- return compare_ipv4_ipv6 (ip, net) == SocketAddress::CompareResult::SAME ;
263+ return compare_ipv4_ipv6 (ip, net) == std::partial_ordering::equivalent ;
267264
268265 uint8_t r = prefix % 8 ;
269266 int len = (prefix - r) / 8 ;
@@ -293,7 +290,7 @@ bool in_network_ipv6_ipv4(
293290 const SocketAddress& net,
294291 int prefix) {
295292 if (prefix == 32 )
296- return compare_ipv4_ipv6 (net, ip) == SocketAddress::CompareResult::SAME ;
293+ return compare_ipv4_ipv6 (net, ip) == std::partial_ordering::equivalent ;
297294
298295 uint32_t m = ((1ull << prefix) - 1 ) << (32 - prefix);
299296
@@ -337,8 +334,7 @@ bool SocketAddress::is_match(const SocketAddress& other) const {
337334 return false ;
338335}
339336
340- SocketAddress::CompareResult SocketAddress::compare (
341- const SocketAddress& other) const {
337+ std::partial_ordering SocketAddress::compare (const SocketAddress& other) const {
342338 switch (family ()) {
343339 case AF_INET:
344340 switch (other.family ()) {
@@ -349,24 +345,23 @@ SocketAddress::CompareResult SocketAddress::compare(
349345 case AF_INET6:
350346 switch (other.family ()) {
351347 case AF_INET: {
352- CompareResult c = compare_ipv4_ipv6 (other, *this );
353- switch (c) {
354- case SocketAddress::CompareResult::NOT_COMPARABLE:
355- // Fall through
356- case SocketAddress::CompareResult::SAME:
357- return c;
358- case SocketAddress::CompareResult::GREATER_THAN:
359- return SocketAddress::CompareResult::LESS_THAN;
360- case SocketAddress::CompareResult::LESS_THAN:
361- return SocketAddress::CompareResult::GREATER_THAN;
348+ auto c = compare_ipv4_ipv6 (other, *this );
349+ if (c == std::partial_ordering::unordered) {
350+ return std::partial_ordering::unordered;
351+ } else if (c == std::partial_ordering::equivalent) {
352+ return std::partial_ordering::equivalent;
353+ } else if (c == std::partial_ordering::less) {
354+ return std::partial_ordering::greater;
355+ } else if (c == std::partial_ordering::greater) {
356+ return std::partial_ordering::less;
362357 }
363358 break ;
364359 }
365360 case AF_INET6: return compare_ipv6 (*this , other);
366361 }
367362 break ;
368363 }
369- return SocketAddress::CompareResult::NOT_COMPARABLE ;
364+ return std::partial_ordering::unordered ;
370365}
371366
372367bool SocketAddress::is_in_network (
0 commit comments