|
@@ -16,6 +16,9 @@ private:
|
|
uint8_t b[4];
|
|
uint8_t b[4];
|
|
uint32_t l;
|
|
uint32_t l;
|
|
};
|
|
};
|
|
|
|
+ static constexpr uint32_t hostmask(unsigned int n) {
|
|
|
|
+ return n >= 32 ? 0 : ((uint32_t)1 << n)-1;
|
|
|
|
+ }
|
|
public:
|
|
public:
|
|
constexpr IP4() : l{0} { }
|
|
constexpr IP4() : l{0} { }
|
|
constexpr IP4(nullptr_t) : l{0} { }
|
|
constexpr IP4(nullptr_t) : l{0} { }
|
|
@@ -28,6 +31,10 @@ public:
|
|
l{ip.type == IPADDR_TYPE_V4 ? ip.u_addr.ip4.addr : 0} { }
|
|
l{ip.type == IPADDR_TYPE_V4 ? ip.u_addr.ip4.addr : 0} { }
|
|
constexpr IP4(const esp_ip_addr_t & ip) :
|
|
constexpr IP4(const esp_ip_addr_t & ip) :
|
|
l{ip.type == IPADDR_TYPE_V4 ? ip.u_addr.ip4.addr : 0} { }
|
|
l{ip.type == IPADDR_TYPE_V4 ? ip.u_addr.ip4.addr : 0} { }
|
|
|
|
+ constexpr IP4(IP4 nip, IP4 hip, unsigned int n) :
|
|
|
|
+ l{(nip.l & ~hostmask(n)) | (hip.l & hostmask(n))} { }
|
|
|
|
+ constexpr IP4(IP4 nip, IP4 hip, IP4 mask) :
|
|
|
|
+ l{(nip.l & ~mask.l) | (hip.l & mask.l)} { }
|
|
IP4(const char *str);
|
|
IP4(const char *str);
|
|
|
|
|
|
operator uint32_t () const { return l; }
|
|
operator uint32_t () const { return l; }
|
|
@@ -53,11 +60,12 @@ public:
|
|
constexpr IP4 operator ^ (const IP4 &b) const { return IP4(l ^ b.l); }
|
|
constexpr IP4 operator ^ (const IP4 &b) const { return IP4(l ^ b.l); }
|
|
constexpr IP4 operator ~ () const { return IP4(~l); }
|
|
constexpr IP4 operator ~ () const { return IP4(~l); }
|
|
constexpr IP4 operator / (unsigned int n) const {
|
|
constexpr IP4 operator / (unsigned int n) const {
|
|
- return IP4(n >= 32 ? l : l & ~(((uint32_t)1 << n)-1));
|
|
|
|
|
|
+ return IP4(l & ~hostmask(n));
|
|
}
|
|
}
|
|
constexpr IP4 operator % (unsigned int n) const {
|
|
constexpr IP4 operator % (unsigned int n) const {
|
|
- return IP4(n >= 32 ? 0 : l & (((uint32_t)1 << n)-1));
|
|
|
|
|
|
+ return IP4(l & hostmask(n));
|
|
}
|
|
}
|
|
|
|
+
|
|
constexpr uint8_t operator [] (size_t n) const { return b[n]; }
|
|
constexpr uint8_t operator [] (size_t n) const { return b[n]; }
|
|
uint8_t & operator [] (size_t n) { return b[n]; }
|
|
uint8_t & operator [] (size_t n) { return b[n]; }
|
|
|
|
|