# HG changeset patch # User David Demelier # Date 1435063662 -7200 # Node ID 403fa2642e19382a0947fa422a499b98f3b33111 # Parent 4b08afed634d8a91718d83479a49e5d7e84aadfd Socket: add operator on addresses diff -r 4b08afed634d -r 403fa2642e19 C++/modules/Socket/SocketAddress.cpp --- a/C++/modules/Socket/SocketAddress.cpp Tue Jun 23 14:21:47 2015 +0200 +++ b/C++/modules/Socket/SocketAddress.cpp Tue Jun 23 14:47:42 2015 +0200 @@ -94,6 +94,28 @@ }; } +bool operator==(const Ip &ip1, const Ip &ip2) noexcept +{ + const char *addr1 = reinterpret_cast(&ip1.address()); + const char *addr2 = reinterpret_cast(&ip2.address()); + + return std::equal( + addr1, addr1 + ip1.length(), + addr2, addr2 + ip2.length() + ); +} + +bool operator<(const Ip &ip1, const Ip &ip2) noexcept +{ + const char *addr1 = reinterpret_cast(&ip1.address()); + const char *addr2 = reinterpret_cast(&ip2.address()); + + return std::lexicographical_compare( + addr1, addr1 + ip1.length(), + addr2, addr2 + ip2.length() + ); +} + /* -------------------------------------------------------- * Unix implementation * -------------------------------------------------------- */ @@ -133,6 +155,28 @@ }; } +bool operator==(const Unix &unix1, const Unix &unix2) noexcept +{ + const char *addr1 = reinterpret_cast(&unix1.address()); + const char *addr2 = reinterpret_cast(&unix2.address()); + + return std::equal( + addr1, addr1 + unix1.length(), + addr2, addr2 + unix2.length() + ); +} + +bool operator<(const Unix &unix1, const Unix &unix2) noexcept +{ + const char *addr1 = reinterpret_cast(&unix1.address()); + const char *addr2 = reinterpret_cast(&unix1.address()); + + return std::lexicographical_compare( + addr1, addr1 + unix1.length(), + addr2, addr2 + unix2.length() + ); +} + #endif // _WIN32 } // !address diff -r 4b08afed634d -r 403fa2642e19 C++/modules/Socket/SocketAddress.h --- a/C++/modules/Socket/SocketAddress.h Tue Jun 23 14:21:47 2015 +0200 +++ b/C++/modules/Socket/SocketAddress.h Tue Jun 23 14:47:42 2015 +0200 @@ -169,6 +169,10 @@ SocketAddressInfo info() const; }; +bool operator==(const Ip &ip1, const Ip &ip2) noexcept; + +bool operator<(const Ip &ip1, const Ip &ip2) noexcept; + /** * @class Ipv6 * @brief Convenient helper for IPv6 protocol @@ -274,6 +278,10 @@ SocketAddressInfo info() const; }; +bool operator==(const Unix &unix1, const Unix &unix2) noexcept; + +bool operator<(const Unix &unix1, const Unix &unix2) noexcept; + #endif // !_WIN32 } // !address diff -r 4b08afed634d -r 403fa2642e19 C++/tests/Socket/main.cpp --- a/C++/tests/Socket/main.cpp Tue Jun 23 14:21:47 2015 +0200 +++ b/C++/tests/Socket/main.cpp Tue Jun 23 14:47:42 2015 +0200 @@ -610,6 +610,26 @@ #endif +/* -------------------------------------------------------- + * Operators + * -------------------------------------------------------- */ + +TEST(AddressOperator, less) +{ + Ipv4 ip1{"*", 8000}; + Ipv4 ip2{"*", 8002}; + + ASSERT_LT(ip1, ip2); +} + +TEST(AddressOperator, same) +{ + Ipv4 ip1{"*", 8000}; + Ipv4 ip2{"*", 8000}; + + ASSERT_EQ(ip1, ip2); +} + int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv);