11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
23#if defined(PROMEKI_PLATFORM_WINDOWS)
26#elif !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
27#include <netinet/in.h>
30PROMEKI_NAMESPACE_BEGIN
63 PROMEKI_DATATYPE(Ipv6Address, DataTypeIpv6Address, 1)
66 Error writeToStream(DataStream &s) const;
68 template <uint32_t V> static Result<Ipv6Address> readFromStream(DataStream &s);
71 using DataFormat = Array<uint8_t, 16>;
74 using List = ::promeki::List<Ipv6Address>;
87 static Result<Ipv6Address> fromString(const String &str);
90 static Ipv6Address any() {
return Ipv6Address(); }
93 static Ipv6Address loopback();
96 Ipv6Address() : _addr{}, _scopeId(0) {}
102 explicit Ipv6Address(
const DataFormat &bytes) : _addr(bytes), _scopeId(0) {}
108 explicit Ipv6Address(
const uint8_t *bytes) : _scopeId(0) {
109 for (
size_t i = 0; i < 16; ++i) _addr[i] = bytes[i];
113 bool isNull()
const {
return _addr.isZero() && _scopeId == 0; }
116 bool isLoopback()
const;
119 bool isMulticast()
const {
return _addr[0] == 0xFF; }
122 bool isLinkLocal()
const {
return _addr[0] == 0xFE && (_addr[1] & 0xC0) == 0x80; }
125 bool isV4Mapped()
const;
128 bool isSiteLocal()
const {
return _addr[0] == 0xFE && (_addr[1] & 0xC0) == 0xC0; }
134 uint32_t scopeId()
const {
return _scopeId; }
140 void setScopeId(uint32_t
id) { _scopeId = id; }
146 const DataFormat &data()
const {
return _addr; }
152 const uint8_t *raw()
const {
return _addr.data(); }
161 String toString()
const;
170 Ipv4Address toIpv4()
const;
181 MacAddress multicastMac()
const;
183#if !defined(PROMEKI_PLATFORM_EMSCRIPTEN)
190 static Result<Ipv6Address> fromSockAddr(
const struct sockaddr_in6 *sa);
202 Error toSockAddr(
struct sockaddr_in6 *sa)
const;
206 bool operator==(
const Ipv6Address &other)
const {
207 return _addr == other._addr && _scopeId == other._scopeId;
210 bool operator!=(
const Ipv6Address &other)
const {
return !(*
this == other); }
212 bool operator<(
const Ipv6Address &other)
const {
213 int cmp = std::memcmp(_addr.data(), other._addr.data(), 16);
214 if (cmp != 0)
return cmp < 0;
215 return _scopeId < other._scopeId;
224TextStream &operator<<(TextStream &stream,
const Ipv6Address &addr);
228PROMEKI_FORMAT_VIA_TOSTRING(promeki::Ipv6Address);