code/include/swoc/bwf_ip.h (69 lines of code) (raw):
// SPDX-License-Identifier: Apache-2.0
// Copyright Apache Software Foundation 2019
/** @file
BufferWriter formatting for IP addresses.
*/
#pragma once
#include <iosfwd>
#include <netinet/in.h>
#include "swoc/swoc_version.h"
#include "swoc/bwf_base.h"
#include "swoc/swoc_ip.h"
namespace swoc { inline namespace SWOC_VERSION_NS {
// All of these expect the address to be in network order.
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, in6_addr const &addr);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, sockaddr const *addr);
/// @{
/// @internal The various @c sockaddr types are handled almost identically due to how formatting
/// codes are handled so it's ugly to split the code base on family. Instead we depend on
/// @a sa_family being set correctly.
inline BufferWriter &
bwformat(BufferWriter &w, bwf::Spec const &spec, sockaddr_in const *addr) {
return bwformat(w, spec, reinterpret_cast<sockaddr const *>(addr));
}
inline BufferWriter &
bwformat(BufferWriter &w, bwf::Spec const &spec, sockaddr_in6 const *addr) {
return bwformat(w, spec, reinterpret_cast<sockaddr const *>(addr));
}
/// @}
// Use class information for ordering.
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IP4Addr const &addr);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IP6Addr const &addr);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IPAddr const &addr);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IP4Srv const &addr);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IP6Srv const &addr);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IPSrv const &addr);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IP4Range const &range);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IP6Range const &range);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IPRange const &range);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IPRangeView const &range);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IPNet const &net);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IP4Net const &net);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IP6Net const &net);
BufferWriter &bwformat(BufferWriter &w, bwf::Spec const &spec, IPMask const &mask);
inline BufferWriter &
bwformat(BufferWriter &w, bwf::Spec const &spec, IPEndpoint const &addr) {
return bwformat(w, spec, &addr.sa);
}
/// Buffer space sufficient for printing any basic IP address type.
static const size_t IP_STREAM_SIZE = 80;
}} // namespace swoc::SWOC_VERSION_NS
namespace std {
inline ostream &
operator<<(ostream &s, swoc::IP4Addr const &addr) {
swoc::LocalBufferWriter<swoc::IP_STREAM_SIZE> w;
return s << bwformat(w, swoc::bwf::Spec::DEFAULT, addr);
}
inline ostream &
operator<<(ostream &s, swoc::IP6Addr const &addr) {
swoc::LocalBufferWriter<swoc::IP_STREAM_SIZE> w;
return s << bwformat(w, swoc::bwf::Spec::DEFAULT, addr);
}
inline ostream &
operator<<(ostream &s, swoc::IPAddr const &addr) {
swoc::LocalBufferWriter<swoc::IP_STREAM_SIZE> w;
return s << bwformat(w, swoc::bwf::Spec::DEFAULT, addr);
}
inline ostream &
operator<<(ostream &s, swoc::IP4Range const &Range) {
swoc::LocalBufferWriter<swoc::IP_STREAM_SIZE> w;
return s << bwformat(w, swoc::bwf::Spec::DEFAULT, Range);
}
inline ostream &
operator<<(ostream &s, swoc::IP6Range const &Range) {
swoc::LocalBufferWriter<swoc::IP_STREAM_SIZE> w;
return s << bwformat(w, swoc::bwf::Spec::DEFAULT, Range);
}
inline ostream &
operator<<(ostream &s, swoc::IPRange const &Range) {
swoc::LocalBufferWriter<swoc::IP_STREAM_SIZE> w;
return s << bwformat(w, swoc::bwf::Spec::DEFAULT, Range);
}
} // namespace std