|
@@ -16,8 +16,16 @@ private:
|
|
uint8_t b[4];
|
|
uint8_t b[4];
|
|
uint32_t l;
|
|
uint32_t l;
|
|
};
|
|
};
|
|
|
|
+ // assumes gcc
|
|
|
|
+ static constexpr uint32_t netswap(uint32_t v) {
|
|
|
|
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
|
|
|
+ return v;
|
|
|
|
+#else
|
|
|
|
+ return __builtin_bswap32(v);
|
|
|
|
+#endif
|
|
|
|
+ }
|
|
static constexpr uint32_t hostmask(unsigned int n) {
|
|
static constexpr uint32_t hostmask(unsigned int n) {
|
|
- return n >= 32 ? 0 : htonl(((uint32_t)1 << n)-1);
|
|
|
|
|
|
+ return n >= 32 ? 0 : netswap(((uint32_t)1 << n)-1);
|
|
}
|
|
}
|
|
public:
|
|
public:
|
|
constexpr IP4() : l{0} { }
|
|
constexpr IP4() : l{0} { }
|
|
@@ -65,7 +73,15 @@ public:
|
|
constexpr IP4 operator % (unsigned int n) const {
|
|
constexpr IP4 operator % (unsigned int n) const {
|
|
return IP4(l & hostmask(n));
|
|
return IP4(l & hostmask(n));
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ constexpr IP4 operator + (uint32_t n) const {
|
|
|
|
+ return IP4(netswap(netswap(l) + n));
|
|
|
|
+ }
|
|
|
|
+ constexpr IP4 operator - (uint32_t n) const {
|
|
|
|
+ return IP4(netswap(netswap(l) - n));
|
|
|
|
+ }
|
|
|
|
+ constexpr int32_t operator - (const IP4 &b) const {
|
|
|
|
+ return netswap(l) - netswap(b.l);
|
|
|
|
+ }
|
|
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]; }
|
|
|
|
|