#include "net/net_utils_base.h" #include #include #include "net/local_ip.h" namespace epee { namespace net_utils { const uint8_t ipv4_network_address::ID; bool ipv4_network_address::equal(const ipv4_network_address& other) const noexcept { return is_same_host(other) && port() == other.port(); } bool ipv4_network_address::less(const ipv4_network_address& other) const noexcept { return is_same_host(other) ? port() < other.port() : ip() < other.ip(); } std::string ipv4_network_address::str() const { return string_tools::get_ip_string_from_int32(ip()) + ":" + std::to_string(port()); } std::string ipv4_network_address::host_str() const { return string_tools::get_ip_string_from_int32(ip()); } bool ipv4_network_address::is_loopback() const { return net_utils::is_ip_loopback(ip()); } bool ipv4_network_address::is_local() const { return net_utils::is_ip_local(ip()); } bool network_address::equal(const network_address& other) const { // clang typeid workaround network_address::interface const* const self_ = self.get(); network_address::interface const* const other_self = other.self.get(); if (self_ == other_self) return true; if (!self_ || !other_self) return false; if (typeid(*self_) != typeid(*other_self)) return false; return self_->equal(*other_self); } bool network_address::less(const network_address& other) const { // clang typeid workaround network_address::interface const* const self_ = self.get(); network_address::interface const* const other_self = other.self.get(); if (self_ == other_self) return false; if (!self_ || !other_self) return self == nullptr; if (typeid(*self_) != typeid(*other_self)) return self_->get_type_id() < other_self->get_type_id(); return self_->less(*other_self); } bool network_address::is_same_host(const network_address& other) const { // clang typeid workaround network_address::interface const* const self_ = self.get(); network_address::interface const* const other_self = other.self.get(); if (self_ == other_self) return true; if (!self_ || !other_self) return false; if (typeid(*self_) != typeid(*other_self)) return false; return self_->is_same_host(*other_self); } }}