3 #include "fly/types/numeric/endian.hpp"
4 #include "fly/types/string/lexer.hpp"
5 #include "fly/types/string/string.hpp"
26 using address_type = std::array<std::uint8_t, 4>;
27 using int_type = std::uint32_t;
40 explicit constexpr
IPv4Address(
const address_type &address) noexcept;
47 explicit constexpr
IPv4Address(int_type address) noexcept;
82 static constexpr std::optional<IPv4Address>
from_string(std::string_view address);
101 int_type m_address {0};
107 m_address |=
static_cast<int_type
>(address[0]);
108 m_address |=
static_cast<int_type
>(address[1] << 8);
109 m_address |=
static_cast<int_type
>(address[2] << 16);
110 m_address |=
static_cast<int_type
>(address[3] << 24);
139 constexpr
const auto s_max32 =
static_cast<std::uint64_t
>(std::numeric_limits<int_type>::max());
140 constexpr
const auto s_decimal =
'.';
144 std::array<int_type, 4> parts {};
145 std::size_t index = 0;
149 if (
const auto segment = lexer.
consume_number(); segment && (*segment <= s_max32))
151 parts[index++] =
static_cast<int_type
>(*segment);
157 }
while ((index < parts.size()) && lexer.
consume_if(s_decimal));
159 std::optional<int_type> host_address;
163 host_address = parts[0];
167 if ((parts[0] <= 0xff) && (parts[1] <= 0xff'ff'ff))
169 host_address = (parts[0] << 24) | parts[1];
174 if ((parts[0] <= 0xff) && (parts[1] <= 0xff) && (parts[2] <= 0xff'ff))
176 host_address = (parts[0] << 24) | (parts[1] << 16) | parts[2];
181 if ((parts[0] <= 0xff) && (parts[1] <= 0xff) && (parts[2] <= 0xff) && (parts[3] <= 0xff))
183 host_address = (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3];
187 if (!host_address || lexer.
peek())
192 return IPv4Address(fly::endian_swap_if_non_native<std::endian::big>(*host_address));
204 return fly::endian_swap_if_non_native<std::endian::big>(m_address);
221 template <
typename FormatContext>
229 network_order & 0xff,
230 (network_order >> 8) & 0xff,
231 (network_order >> 16) & 0xff,
232 (network_order >> 24) & 0xff);
constexpr std::optional< std::uintmax_t > consume_number()
Definition: lexer.hpp:227
constexpr bool consume_if(CharType ch)
Definition: lexer.hpp:214
constexpr std::optional< CharType > peek(std::size_t offset=0)
Definition: lexer.hpp:190
static void format_to(OutputIterator output, FormatString< ParameterTypes... > &&fmt, ParameterTypes &&...parameters)
Definition: string.hpp:939
Definition: ipv4_address.hpp:24
constexpr int_type host_order() const
Definition: ipv4_address.hpp:202
static constexpr IPv4Address in_addr_broadcast()
Definition: ipv4_address.hpp:125
static constexpr IPv4Address in_addr_any()
Definition: ipv4_address.hpp:119
static constexpr std::optional< IPv4Address > from_string(std::string_view address)
Definition: ipv4_address.hpp:137
constexpr int_type network_order() const
Definition: ipv4_address.hpp:196
auto operator<=>(const IPv4Address &) const =default
static constexpr IPv4Address in_addr_loopback()
Definition: ipv4_address.hpp:131