4 #include "fly/types/string/lexer.hpp"
5 #include "fly/types/string/string.hpp"
27 using address_type = std::array<std::uint8_t, 16>;
40 explicit constexpr
IPv6Address(
const address_type &address) noexcept;
48 explicit constexpr
IPv6Address(address_type &&address) noexcept;
56 explicit constexpr
IPv6Address(
const address_type::value_type (&address)[16]) noexcept;
87 static constexpr std::optional<IPv6Address>
from_string(std::string_view address);
94 constexpr
void copy(address_type::value_type (&address)[16])
const;
96 #if defined(FLY_MACOS)
101 constexpr
bool operator==(
const IPv6Address &address)
const;
102 constexpr
bool operator!=(
const IPv6Address &address)
const;
103 constexpr
bool operator<(
const IPv6Address &address)
const;
104 constexpr
bool operator<=(
const IPv6Address &address)
const;
105 constexpr
bool operator>(
const IPv6Address &address)
const;
106 constexpr
bool operator>=(
const IPv6Address &address)
const;
115 static constexpr std::size_t s_address_size = std::tuple_size_v<address_type>;
116 address_type m_address {};
132 std::copy(std::begin(address), std::end(address), m_address.begin());
138 address_type address {};
145 address_type address {};
146 address.back() = 0x01;
154 constexpr
const auto s_max16 =
155 static_cast<std::uint64_t
>(std::numeric_limits<std::uint16_t>::max());
156 constexpr
const auto s_colon =
':';
159 address_type parts {};
161 std::optional<std::size_t> index_after_short_form;
162 std::size_t index = 0;
170 if (index_after_short_form)
175 index_after_short_form = index;
178 else if (
const auto segment = lexer.
consume_hex_number(); segment && (*segment <= s_max16))
180 parts[index++] =
static_cast<address_type::value_type
>((*segment >> 8) & 0xff);
181 parts[index++] =
static_cast<address_type::value_type
>(*segment & 0xff);
187 }
while (lexer.
peek() && (index < s_address_size));
189 if (lexer.
peek() || ((index != s_address_size) && !index_after_short_form))
193 else if (index_after_short_form)
195 const auto start =
static_cast<std::ptrdiff_t
>(s_address_size - index);
196 const auto end =
static_cast<std::ptrdiff_t
>(*index_after_short_form);
198 std::rotate(parts.rbegin(), parts.rbegin() + start, parts.rend() - end);
207 std::copy(m_address.begin(), m_address.end(), std::begin(address));
210 #if defined(FLY_MACOS)
213 constexpr
bool IPv6Address::operator==(
const IPv6Address &address)
const
215 return m_address == address.m_address;
219 constexpr
bool IPv6Address::operator!=(
const IPv6Address &address)
const
221 return m_address != address.m_address;
225 constexpr
bool IPv6Address::operator<(
const IPv6Address &address)
const
227 return m_address < address.m_address;
231 constexpr
bool IPv6Address::operator<=(
const IPv6Address &address)
const
233 return m_address <= address.m_address;
237 constexpr
bool IPv6Address::operator>(
const IPv6Address &address)
const
239 return m_address > address.m_address;
243 constexpr
bool IPv6Address::operator>=(
const IPv6Address &address)
const
245 return m_address >= address.m_address;
264 template <
typename FormatContext>
267 static constexpr std::size_t s_address_size =
268 std::tuple_size_v<fly::net::IPv6Address::address_type>;
270 fly::net::IPv6Address::address_type::value_type parts[s_address_size] {};
273 auto join_segments = [&parts](std::size_t index) -> std::uint16_t {
274 return (parts[index] << 8) | parts[index + 1];
277 bool used_short_form =
false;
279 for (std::size_t i = 0; i < s_address_size;)
281 const std::uint16_t segment = join_segments(i);
283 if ((segment == 0) && !used_short_form)
288 }
while ((i < s_address_size) && (join_segments(i) == 0));
291 used_short_form =
true;
constexpr std::optional< std::uintmax_t > consume_hex_number()
Definition: lexer.hpp:245
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: ipv6_address.hpp:25
static constexpr std::optional< IPv6Address > from_string(std::string_view address)
Definition: ipv6_address.hpp:152
static constexpr IPv6Address in_addr_loopback()
Definition: ipv6_address.hpp:143
constexpr void copy(address_type::value_type(&address)[16]) const
Definition: ipv6_address.hpp:205
auto operator<=>(const IPv6Address &) const =default
static constexpr IPv6Address in_addr_any()
Definition: ipv6_address.hpp:136