11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
22#if defined(PROMEKI_PLATFORM_WINDOWS)
25#elif !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
26#include <netinet/in.h>
29PROMEKI_NAMESPACE_BEGIN
62 using DataFormat = Array<uint8_t, 16>;
65 using List = ::promeki::List<Ipv6Address>;
78 static Result<Ipv6Address> fromString(
const String &str);
81 static Ipv6Address any() {
return Ipv6Address(); }
84 static Ipv6Address loopback();
87 Ipv6Address() : _addr{}, _scopeId(0) {}
93 explicit Ipv6Address(
const DataFormat &bytes) : _addr(bytes), _scopeId(0) {}
99 explicit Ipv6Address(
const uint8_t *bytes) : _scopeId(0) {
100 for (
size_t i = 0; i < 16; ++i) _addr[i] = bytes[i];
104 bool isNull()
const {
return _addr.isZero() && _scopeId == 0; }
107 bool isLoopback()
const;
110 bool isMulticast()
const {
return _addr[0] == 0xFF; }
113 bool isLinkLocal()
const {
return _addr[0] == 0xFE && (_addr[1] & 0xC0) == 0x80; }
116 bool isV4Mapped()
const;
119 bool isSiteLocal()
const {
return _addr[0] == 0xFE && (_addr[1] & 0xC0) == 0xC0; }
125 uint32_t scopeId()
const {
return _scopeId; }
131 void setScopeId(uint32_t
id) { _scopeId = id; }
137 const DataFormat &data()
const {
return _addr; }
143 const uint8_t *raw()
const {
return _addr.data(); }
152 String toString()
const;
161 Ipv4Address toIpv4()
const;
172 MacAddress multicastMac()
const;
174#if !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
181 static Result<Ipv6Address> fromSockAddr(
const struct sockaddr_in6 *sa);
193 Error toSockAddr(
struct sockaddr_in6 *sa)
const;
197 bool operator==(
const Ipv6Address &other)
const {
198 return _addr == other._addr && _scopeId == other._scopeId;
201 bool operator!=(
const Ipv6Address &other)
const {
return !(*
this == other); }
203 bool operator<(
const Ipv6Address &other)
const {
204 int cmp = std::memcmp(_addr.data(), other._addr.data(), 16);
205 if (cmp != 0)
return cmp < 0;
206 return _scopeId < other._scopeId;
215TextStream &operator<<(TextStream &stream,
const Ipv6Address &addr);
219PROMEKI_FORMAT_VIA_TOSTRING(promeki::Ipv6Address);