Home | History | Annotate | Download | only in ip
      1 //
      2 // ip/address.hpp
      3 // ~~~~~~~~~~~~~~
      4 //
      5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
      6 //
      7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
      8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
      9 //
     10 
     11 #ifndef ASIO_IP_ADDRESS_HPP
     12 #define ASIO_IP_ADDRESS_HPP
     13 
     14 
     15 #include "asio/detail/config.hpp"
     16 #include <string>
     17 #include "asio/error_code.hpp"
     18 #include "asio/ip/address_v4.hpp"
     19 #include "asio/ip/address_v6.hpp"
     20 
     21 
     22 #include "asio/detail/push_options.hpp"
     23 
     24 namespace asio {
     25 namespace ip {
     26 
     27 /// Implements version-independent IP addresses.
     28 /**
     29  * The asio::ip::address class provides the ability to use either IP
     30  * version 4 or version 6 addresses.
     31  *
     32  * @par Thread Safety
     33  * @e Distinct @e objects: Safe.@n
     34  * @e Shared @e objects: Unsafe.
     35  */
     36 class address
     37 {
     38 public:
     39   /// Default constructor.
     40   ASIO_DECL address();
     41 
     42   /// Construct an address from an IPv4 address.
     43   ASIO_DECL address(const asio::ip::address_v4& ipv4_address);
     44 
     45   /// Construct an address from an IPv6 address.
     46   ASIO_DECL address(const asio::ip::address_v6& ipv6_address);
     47 
     48   /// Copy constructor.
     49   ASIO_DECL address(const address& other);
     50 
     51   /// Move constructor.
     52   ASIO_DECL address(address&& other);
     53 
     54   /// Assign from another address.
     55   ASIO_DECL address& operator=(const address& other);
     56 
     57   /// Move-assign from another address.
     58   ASIO_DECL address& operator=(address&& other);
     59 
     60   /// Assign from an IPv4 address.
     61   ASIO_DECL address& operator=(
     62       const asio::ip::address_v4& ipv4_address);
     63 
     64   /// Assign from an IPv6 address.
     65   ASIO_DECL address& operator=(
     66       const asio::ip::address_v6& ipv6_address);
     67 
     68   /// Get whether the address is an IP version 4 address.
     69   bool is_v4() const
     70   {
     71     return type_ == ipv4;
     72   }
     73 
     74   /// Get whether the address is an IP version 6 address.
     75   bool is_v6() const
     76   {
     77     return type_ == ipv6;
     78   }
     79 
     80   /// Get the address as an IP version 4 address.
     81   ASIO_DECL asio::ip::address_v4 to_v4() const;
     82 
     83   /// Get the address as an IP version 6 address.
     84   ASIO_DECL asio::ip::address_v6 to_v6() const;
     85 
     86   /// Get the address as a string in dotted decimal format.
     87   ASIO_DECL std::string to_string() const;
     88 
     89   /// Get the address as a string in dotted decimal format.
     90   ASIO_DECL std::string to_string(asio::error_code& ec) const;
     91 
     92   /// Create an address from an IPv4 address string in dotted decimal form,
     93   /// or from an IPv6 address in hexadecimal notation.
     94   ASIO_DECL static address from_string(const char* str);
     95 
     96   /// Create an address from an IPv4 address string in dotted decimal form,
     97   /// or from an IPv6 address in hexadecimal notation.
     98   ASIO_DECL static address from_string(
     99       const char* str, asio::error_code& ec);
    100 
    101   /// Create an address from an IPv4 address string in dotted decimal form,
    102   /// or from an IPv6 address in hexadecimal notation.
    103   ASIO_DECL static address from_string(const std::string& str);
    104 
    105   /// Create an address from an IPv4 address string in dotted decimal form,
    106   /// or from an IPv6 address in hexadecimal notation.
    107   ASIO_DECL static address from_string(
    108       const std::string& str, asio::error_code& ec);
    109 
    110   /// Determine whether the address is a loopback address.
    111   ASIO_DECL bool is_loopback() const;
    112 
    113   /// Determine whether the address is unspecified.
    114   ASIO_DECL bool is_unspecified() const;
    115 
    116   /// Determine whether the address is a multicast address.
    117   ASIO_DECL bool is_multicast() const;
    118 
    119   /// Compare two addresses for equality.
    120   ASIO_DECL friend bool operator==(const address& a1, const address& a2);
    121 
    122   /// Compare two addresses for inequality.
    123   friend bool operator!=(const address& a1, const address& a2)
    124   {
    125     return !(a1 == a2);
    126   }
    127 
    128   /// Compare addresses for ordering.
    129   ASIO_DECL friend bool operator<(const address& a1, const address& a2);
    130 
    131   /// Compare addresses for ordering.
    132   friend bool operator>(const address& a1, const address& a2)
    133   {
    134     return a2 < a1;
    135   }
    136 
    137   /// Compare addresses for ordering.
    138   friend bool operator<=(const address& a1, const address& a2)
    139   {
    140     return !(a2 < a1);
    141   }
    142 
    143   /// Compare addresses for ordering.
    144   friend bool operator>=(const address& a1, const address& a2)
    145   {
    146     return !(a1 < a2);
    147   }
    148 
    149 private:
    150   // The type of the address.
    151   enum { ipv4, ipv6 } type_;
    152 
    153   // The underlying IPv4 address.
    154   asio::ip::address_v4 ipv4_address_;
    155 
    156   // The underlying IPv6 address.
    157   asio::ip::address_v6 ipv6_address_;
    158 };
    159 
    160 
    161 } // namespace ip
    162 } // namespace asio
    163 
    164 #include "asio/detail/pop_options.hpp"
    165 
    166 #include "asio/ip/impl/address.hpp"
    167 # include "asio/ip/impl/address.ipp"
    168 
    169 #endif // ASIO_IP_ADDRESS_HPP
    170