LCOV - code coverage report
Current view: top level - boost/url/ipv4_address.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 17 17
Test Date: 2025-11-10 19:06:20 Functions: 100.0 % 8 8

            Line data    Source code
       1              : //
       2              : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
       3              : // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
       4              : //
       5              : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       6              : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       7              : //
       8              : // Official repository: https://github.com/boostorg/url
       9              : //
      10              : 
      11              : #ifndef BOOST_URL_IPV4_ADDRESS_HPP
      12              : #define BOOST_URL_IPV4_ADDRESS_HPP
      13              : 
      14              : #include <boost/url/detail/config.hpp>
      15              : #include <boost/url/error.hpp>
      16              : #include <boost/url/error_types.hpp>
      17              : #include <boost/core/detail/string_view.hpp>
      18              : #include <boost/url/grammar/string_token.hpp>
      19              : #include <string>
      20              : #include <array>
      21              : #include <cstdint>
      22              : #include <iosfwd>
      23              : 
      24              : namespace boost {
      25              : namespace urls {
      26              : 
      27              : /** An IP version 4 style address.
      28              : 
      29              :     Objects of this type are used to construct,
      30              :     parse, and manipulate IP version 6 addresses.
      31              : 
      32              :     @par BNF
      33              :     @code
      34              :     IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
      35              : 
      36              :     dec-octet   = DIGIT                 ; 0-9
      37              :                 / %x31-39 DIGIT         ; 10-99
      38              :                 / "1" 2DIGIT            ; 100-199
      39              :                 / "2" %x30-34 DIGIT     ; 200-249
      40              :                 / "25" %x30-35          ; 250-255
      41              :     @endcode
      42              : 
      43              :     @par Specification
      44              :     @li <a href="https://en.wikipedia.org/wiki/IPv4"
      45              :         >IPv4 (Wikipedia)</a>
      46              :     @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
      47              :         >3.2.2. Host (rfc3986)</a>
      48              : 
      49              :     @see
      50              :         @ref parse_ipv4_address,
      51              :         @ref ipv6_address.
      52              : */
      53              : class ipv4_address
      54              : {
      55              : public:
      56              :     /** The number of characters in the longest possible IPv4 string.
      57              : 
      58              :         The longest ipv4 address string is "255.255.255.255".
      59              :     */
      60              :     static
      61              :     constexpr
      62              :     std::size_t max_str_len = 15;
      63              : 
      64              :     /** The type used to represent an address as an unsigned integer
      65              :     */
      66              :     using uint_type =
      67              :         std::uint_least32_t;
      68              : 
      69              :     /** The type used to represent an address as an array of bytes
      70              :     */
      71              :     using bytes_type =
      72              :         std::array<unsigned char, 4>;
      73              : 
      74              :     /** Constructor.
      75              :     */
      76           77 :     ipv4_address() = default;
      77              : 
      78              :     /** Constructor.
      79              :     */
      80              :     ipv4_address(
      81              :         ipv4_address const&) = default;
      82              : 
      83              :     /** Copy Assignment.
      84              : 
      85              :         @param other The object to copy.
      86              :         @return A reference to this object.
      87              :     */
      88              :     ipv4_address&
      89              :     operator=(
      90              :         ipv4_address const& other) = default;
      91              : 
      92              :     //
      93              :     //---
      94              :     //
      95              : 
      96              :     /** Construct from an unsigned integer.
      97              : 
      98              :         This function constructs an address from
      99              :         the unsigned integer `u`, where the most
     100              :         significant byte forms the first octet
     101              :         of the resulting address.
     102              : 
     103              :         @param u The integer to construct from.
     104              :     */
     105              :     BOOST_URL_DECL
     106              :     explicit
     107              :     ipv4_address(
     108              :         uint_type u) noexcept;
     109              : 
     110              :     /** Construct from an array of bytes.
     111              : 
     112              :         This function constructs an address
     113              :         from the array in `bytes`, which is
     114              :         interpreted in big-endian.
     115              : 
     116              :         @param bytes The value to construct from.
     117              :     */
     118              :     BOOST_URL_DECL
     119              :     explicit
     120              :     ipv4_address(
     121              :         bytes_type const& bytes) noexcept;
     122              : 
     123              :     /** Construct from a string.
     124              : 
     125              :         This function constructs an address from
     126              :         the string `s`, which must contain a valid
     127              :         IPv4 address string or else an exception
     128              :         is thrown.
     129              : 
     130              :         @note For a non-throwing parse function,
     131              :         use @ref parse_ipv4_address.
     132              : 
     133              :         @par Exception Safety
     134              :         Exceptions thrown on invalid input.
     135              : 
     136              :         @throw system_error The input failed to parse correctly.
     137              : 
     138              :         @param s The string to parse.
     139              : 
     140              :         @par Specification
     141              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2"
     142              :             >3.2.2. Host (rfc3986)</a>
     143              : 
     144              :         @see
     145              :             @ref parse_ipv4_address.
     146              :     */
     147              :     BOOST_URL_DECL
     148              :     explicit
     149              :     ipv4_address(
     150              :         core::string_view s);
     151              : 
     152              :     /** Return the address as bytes, in network byte order.
     153              : 
     154              :         @return The address as an array of bytes.
     155              :     */
     156              :     BOOST_URL_DECL
     157              :     bytes_type
     158              :     to_bytes() const noexcept;
     159              : 
     160              :     /** Return the address as an unsigned integer.
     161              : 
     162              :         @return The address as an unsigned integer.
     163              :     */
     164              :     BOOST_URL_DECL
     165              :     uint_type
     166              :     to_uint() const noexcept;
     167              : 
     168              :     /** Return the address as a string in dotted decimal format
     169              : 
     170              :         When called with no arguments, the
     171              :         return type is `std::string`.
     172              :         Otherwise, the return type and style
     173              :         of output is determined by which string
     174              :         token is passed.
     175              : 
     176              :         @par Example
     177              :         @code
     178              :         assert( ipv4_address(0x01020304).to_string() == "1.2.3.4" );
     179              :         @endcode
     180              : 
     181              :         @par Complexity
     182              :         Constant.
     183              : 
     184              :         @par Exception Safety
     185              :         Strong guarantee.
     186              :         Calls to allocate may throw.
     187              :         String tokens may throw exceptions.
     188              : 
     189              :         @return The return type of the string token.
     190              :         If the token parameter is omitted, then
     191              :         a new `std::string` is returned.
     192              :         Otherwise, the function return type
     193              :         is the result type of the token.
     194              : 
     195              :         @param token An optional string token.
     196              : 
     197              :         @par Specification
     198              :         @li <a href="https://datatracker.ietf.org/doc/html/rfc4291#section-2.2">
     199              :             2.2. Text Representation of Addresses (rfc4291)</a>
     200              :     */
     201              :     template<BOOST_URL_STRTOK_TPARAM>
     202              :     BOOST_URL_STRTOK_RETURN
     203            2 :     to_string(StringToken&& token = {}) const
     204              :     {
     205            2 :         to_string_impl(token);
     206            2 :         return token.result();
     207              :     }
     208              : 
     209              :     /** Write a dotted decimal string representing the address to a buffer
     210              : 
     211              :         The resulting buffer is not null-terminated.
     212              : 
     213              :         @throw std::length_error `dest_size < ipv4_address::max_str_len`
     214              : 
     215              :         @return The formatted string
     216              : 
     217              :         @param dest The buffer in which to write,
     218              :         which must have at least `dest_size` space.
     219              : 
     220              :         @param dest_size The size of the output buffer.
     221              :     */
     222              :     BOOST_URL_DECL
     223              :     core::string_view
     224              :     to_buffer(
     225              :         char* dest,
     226              :         std::size_t dest_size) const;
     227              : 
     228              :     /** Return true if the address is a loopback address
     229              : 
     230              :         @return `true` if the address is a loopback address
     231              :     */
     232              :     BOOST_URL_DECL
     233              :     bool
     234              :     is_loopback() const noexcept;
     235              : 
     236              :     /** Return true if the address is unspecified
     237              : 
     238              :         @return `true` if the address is unspecified
     239              :     */
     240              :     BOOST_URL_DECL
     241              :     bool
     242              :     is_unspecified() const noexcept;
     243              : 
     244              :     /** Return true if the address is a multicast address
     245              : 
     246              :         @return `true` if the address is a multicast address
     247              :     */
     248              :     BOOST_URL_DECL
     249              :     bool
     250              :     is_multicast() const noexcept;
     251              : 
     252              :     /** Return true if two addresses are equal
     253              : 
     254              :         @param a1 The first address to compare.
     255              :         @param a2 The second address to compare.
     256              :         @return `true` if the addresses are equal, otherwise `false`.
     257              : 
     258              :     */
     259              :     friend
     260              :     bool
     261           57 :     operator==(
     262              :         ipv4_address const& a1,
     263              :         ipv4_address const& a2) noexcept
     264              :     {
     265           57 :         return a1.addr_ == a2.addr_;
     266              :     }
     267              : 
     268              :     /** Return true if two addresses are not equal
     269              : 
     270              :         @param a1 The first address to compare.
     271              :         @param a2 The second address to compare.
     272              :         @return `true` if the addresses are not equal, otherwise `false`.
     273              :     */
     274              :     friend
     275              :     bool
     276            3 :     operator!=(
     277              :         ipv4_address const& a1,
     278              :         ipv4_address const& a2) noexcept
     279              :     {
     280            3 :         return a1.addr_ != a2.addr_;
     281              :     }
     282              : 
     283              :     /** Return an address object that represents any address
     284              : 
     285              :         @return The any address.
     286              :     */
     287              :     static
     288              :     ipv4_address
     289            3 :     any() noexcept
     290              :     {
     291            3 :         return ipv4_address();
     292              :     }
     293              : 
     294              :     /** Return an address object that represents the loopback address
     295              : 
     296              :         @return The loopback address.
     297              :     */
     298              :     static
     299              :     ipv4_address
     300            3 :     loopback() noexcept
     301              :     {
     302            3 :         return ipv4_address(0x7F000001);
     303              :     }
     304              : 
     305              :     /** Return an address object that represents the broadcast address
     306              : 
     307              :         @return The broadcast address.
     308              :     */
     309              :     static
     310              :     ipv4_address
     311            3 :     broadcast() noexcept
     312              :     {
     313            3 :         return ipv4_address(0xFFFFFFFF);
     314              :     }
     315              : 
     316              : /** Format the address to an output stream.
     317              : 
     318              :     IPv4 addresses written to output streams
     319              :     are written in their dotted decimal format.
     320              : 
     321              :     @param os The output stream.
     322              :     @param addr The address to format.
     323              :     @return The output stream.
     324              : */
     325              :     friend
     326              :     std::ostream&
     327            1 :     operator<<(
     328              :         std::ostream& os,
     329              :         ipv4_address const& addr)
     330              :     {
     331            1 :         addr.write_ostream(os);
     332            1 :         return os;
     333              :     }
     334              : 
     335              : private:
     336              :     friend class ipv6_address;
     337              : 
     338              :     BOOST_URL_DECL void write_ostream(std::ostream&) const;
     339              : 
     340              :     BOOST_URL_DECL
     341              :     std::size_t
     342              :     print_impl(
     343              :         char* dest) const noexcept;
     344              : 
     345              :     BOOST_URL_DECL
     346              :     void
     347              :     to_string_impl(
     348              :         string_token::arg& t) const;
     349              : 
     350              :     uint_type addr_ = 0;
     351              : };
     352              : 
     353              : //------------------------------------------------
     354              : 
     355              : /** Return an IPv4 address from an IP address string in dotted decimal form
     356              : 
     357              :     @param s The string to parse.
     358              :     @return The parsed address, or an error code.
     359              : */
     360              : BOOST_URL_DECL
     361              : system::result<ipv4_address>
     362              : parse_ipv4_address(
     363              :     core::string_view s) noexcept;
     364              : 
     365              : } // urls
     366              : } // boost
     367              : 
     368              : #endif
        

Generated by: LCOV version 2.1