#pragma once // for addrinfo #ifndef _WIN32 #include #include #include #else #include #include #define inet_aton(x, y) inet_pton(AF_INET, x, y) #endif #include "net.h" #include // for itoa #include #include #include #include "uint128.hpp" namespace llarp { template struct huint_t { UInt_t h; constexpr huint_t operator&(huint_t x) const { return huint_t{UInt_t{h & x.h}}; } constexpr huint_t operator|(huint_t x) const { return huint_t{UInt_t{h | x.h}}; } constexpr huint_t operator-(huint_t x) const { return huint_t{UInt_t{h - x.h}}; } constexpr huint_t operator+(huint_t x) const { return huint_t{UInt_t{h + x.h}}; } constexpr huint_t operator^(huint_t x) const { return huint_t{UInt_t{h ^ x.h}}; } constexpr huint_t operator~() const { return huint_t{UInt_t{~h}}; } constexpr huint_t operator<<(int n) const { UInt_t v{h}; v <<= n; return huint_t{v}; } inline huint_t operator++() { ++h; return *this; } inline huint_t operator--() { --h; return *this; } constexpr bool operator<(huint_t x) const { return h < x.h; } constexpr bool operator!=(huint_t x) const { return h != x.h; } constexpr bool operator==(huint_t x) const { return h == x.h; } using V6Container = std::vector; void ToV6(V6Container& c); std::string ToString() const; bool FromString(const std::string&); }; using huint32_t = huint_t; using huint16_t = huint_t; using huint128_t = huint_t; template struct nuint_t { UInt_t n = 0; constexpr nuint_t operator&(nuint_t x) const { return nuint_t{UInt_t(n & x.n)}; } constexpr nuint_t operator|(nuint_t x) const { return nuint_t{UInt_t(n | x.n)}; } constexpr nuint_t operator^(nuint_t x) const { return nuint_t{UInt_t(n ^ x.n)}; } constexpr nuint_t operator~() const { return nuint_t{UInt_t(~n)}; } inline nuint_t operator++() { ++n; return *this; } inline nuint_t operator--() { --n; return *this; } constexpr bool operator<(nuint_t x) const { return n < x.n; } constexpr bool operator==(nuint_t x) const { return n == x.n; } using V6Container = std::vector; void ToV6(V6Container& c); std::string ToString() const; bool FromString(const std::string& data) { huint_t x; if (not x.FromString(data)) return false; *this = ToNet(x); return true; } }; template inline constexpr bool IsToStringFormattable> = true; template inline constexpr bool IsToStringFormattable> = true; using nuint32_t = nuint_t; using nuint16_t = nuint_t; using nuint128_t = nuint_t; static inline nuint32_t xhtonl(huint32_t x) { return nuint32_t{htonl(x.h)}; } static inline huint32_t xntohl(nuint32_t x) { return huint32_t{ntohl(x.n)}; } static inline nuint16_t xhtons(huint16_t x) { return nuint16_t{htons(x.h)}; } static inline huint16_t xntohs(nuint16_t x) { return huint16_t{ntohs(x.n)}; } huint16_t ToHost(nuint16_t); huint32_t ToHost(nuint32_t); huint128_t ToHost(nuint128_t); nuint16_t ToNet(huint16_t); nuint32_t ToNet(huint32_t); nuint128_t ToNet(huint128_t); } // namespace llarp namespace std { template struct hash> { size_t operator()(const llarp::nuint_t& x) const { return std::hash{}(x.n); } }; template struct hash> { size_t operator()(const llarp::huint_t& x) const { return std::hash{}(x.h); } }; } // namespace std