text: // 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, sockaddr const *addr);
  
  BufferWriter& bwformat(BufferWriter& w, bwf::Spec const& spec, in6_addr const& addr);
  
  BufferWriter& bwformat(BufferWriter& w, bwf::Spec const& spec, 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, 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, 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
  
  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
  
  