From 2f656e09c63df1b931eb884986739e85cfc84e07 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Sat, 30 Nov 2013 06:27:54 -0800 Subject: [PATCH] Refactor and fix some object arithmetic comparisons --- beast/net/IPAddress.h | 2 - beast/net/impl/IPAddress.cpp | 105 ++++++++++++++++++++--------------- 2 files changed, 59 insertions(+), 48 deletions(-) diff --git a/beast/net/IPAddress.h b/beast/net/IPAddress.h index fa98ee344e..a0e1af1d7e 100644 --- a/beast/net/IPAddress.h +++ b/beast/net/IPAddress.h @@ -334,7 +334,6 @@ private: /** Comparison. */ /** @{ */ -int compare (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs); bool operator== (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs); bool operator!= (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs); bool operator< (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs); @@ -342,7 +341,6 @@ bool operator<= (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs); bool operator> (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs); bool operator>= (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs); -int compare (IPAddress const& lhs, IPAddress const& rhs); bool operator== (IPAddress const& lhs, IPAddress const& rhs); bool operator!= (IPAddress const& lhs, IPAddress const& rhs); bool operator< (IPAddress const& lhs, IPAddress const& rhs); diff --git a/beast/net/impl/IPAddress.cpp b/beast/net/impl/IPAddress.cpp index f6a75f1791..10701a11ff 100644 --- a/beast/net/impl/IPAddress.cpp +++ b/beast/net/impl/IPAddress.cpp @@ -554,58 +554,71 @@ IPAddress IPAddress::from_string_altform (std::string const& s) //------------------------------------------------------------------------------ -int compare (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) +bool operator== (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) + { return lhs.value == rhs.value; } + +bool operator< (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) + { return lhs.value < rhs.value; } + +bool operator!= (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) + { return ! (lhs == rhs); } + +bool operator> (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) + { return rhs < lhs; } + +bool operator<= (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) + { return ! (rhs < lhs); } + +bool operator>= (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) + { return ! (lhs < rhs); } + +//------------------------------------------------------------------------------ + +bool operator== (IPAddress const& lhs, IPAddress const& rhs) { - if (lhs.value < rhs.value) - return -1; - else if (lhs.value > rhs.value) - return 1; - return 0; -} - -bool operator== (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) { return compare (lhs, rhs) == 0; } -bool operator!= (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) { return compare (lhs, rhs) != 0; } -bool operator< (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) { return compare (lhs, rhs) < 0; } -bool operator<= (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) { return compare (lhs, rhs) <= 0; } -bool operator> (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) { return compare (lhs, rhs) > 0; } -bool operator>= (IPAddress::V4 const& lhs, IPAddress::V4 const& rhs) { return compare (lhs, rhs) >= 0; } - -static int type_compare (IPAddress const& lhs, IPAddress const& rhs) -{ - if (lhs.type() < rhs.type()) - return -1; - else if (lhs.type() > rhs.type()) - return 1; - return 0; -} - -int compare (IPAddress const& lhs, IPAddress const& rhs) -{ - int const tc (type_compare (lhs, rhs)); - - if (tc < 0) - return -1; - else if (tc > 0) - return 1; - + if (lhs.type() != rhs.type()) + return false; switch (lhs.type()) { - case IPAddress::none: return 0; - case IPAddress::ipv4: return compare (lhs.v4(), rhs.v4()); - default: + case IPAddress::none: return true; + case IPAddress::ipv4: return lhs.v4() == rhs.v4(); case IPAddress::ipv6: - break; - }; - bassertfalse; - return 0; + default: + bassertfalse; + } + return false; } -bool operator== (IPAddress const& lhs, IPAddress const& rhs) { return compare (lhs, rhs) == 0; } -bool operator!= (IPAddress const& lhs, IPAddress const& rhs) { return compare (lhs, rhs) != 0; } -bool operator< (IPAddress const& lhs, IPAddress const& rhs) { return compare (lhs, rhs) < 0; } -bool operator<= (IPAddress const& lhs, IPAddress const& rhs) { return compare (lhs, rhs) <= 0; } -bool operator> (IPAddress const& lhs, IPAddress const& rhs) { return compare (lhs, rhs) > 0; } -bool operator>= (IPAddress const& lhs, IPAddress const& rhs) { return compare (lhs, rhs) >= 0; } +bool operator< (IPAddress const& lhs, IPAddress const& rhs) +{ + if (lhs.type() > rhs.type()) + return false; + if (lhs.type() < rhs.type()) + return true; + switch (lhs.type()) + { + case IPAddress::none: return true; + case IPAddress::ipv4: return lhs.v4() < rhs.v4(); + case IPAddress::ipv6: + default: + bassertfalse; + } + return false; +} + +bool operator!= (IPAddress const& lhs, IPAddress const& rhs) + { return ! (lhs == rhs); } + +bool operator> (IPAddress const& lhs, IPAddress const& rhs) + { return rhs < lhs; } + +bool operator<= (IPAddress const& lhs, IPAddress const& rhs) + { return ! (rhs < lhs); } + +bool operator>= (IPAddress const& lhs, IPAddress const& rhs) + { return ! (lhs < rhs); } + +//------------------------------------------------------------------------------ std::ostream& operator<< (std::ostream &os, IPAddress::V4 const& addr) {