--- nono/lib/macaddr.h 2026/04/29 17:05:08 1.1.1.1 +++ nono/lib/macaddr.h 2026/04/29 17:05:35 1.1.1.2 @@ -11,15 +11,79 @@ #pragma once #include "header.h" -#include // MAC アドレス格納用のクラス -class macaddr_t : public std::array +class MacAddr { - using inherited = std::array; + // addr.b[] をアクセスするためのヘルパー。 + static inline std::size_t IDX(std::size_t n) + { +#if BYTE_ORDER == LITTLE_ENDIAN + return n; +#else + return 7 - n; +#endif + } + public: + // コンストラクタ + MacAddr() + { + } + + // コンストラクタ + explicit MacAddr(uint64 addr_) + { + addr.q = addr_; + } + + // コンストラクタ + explicit MacAddr(const uint8 *src) + : MacAddr(src[0], src[1], src[2], src[3], src[4], src[5]) + { + } + + // コンストラクタ + MacAddr(uint s0, uint s1, uint s2, uint s3, uint s4, uint s5) + { + addr.q = ((uint64)s0 << 0) + | ((uint64)s1 << 8) + | ((uint64)s2 << 16) + | ((uint64)s3 << 24) + | ((uint64)s4 << 32) + | ((uint64)s5 << 40); + } + + // コピーコンストラクタ + MacAddr(const MacAddr& src) + { + addr.q = src.addr.q; + } + + // コピー代入演算子 + MacAddr& operator=(const MacAddr& src) + { + addr.q = src.addr.q; + return *this; + } + + // [] 演算子 + const uint8& operator[](std::size_t n) const + { + return addr.b[IDX(n)]; + } + + // [] 演算子 + uint8& operator[](std::size_t n) + { + return addr.b[IDX(n)]; + } + + // MAC アドレスのバイト数を返す。 + std::size_t size() const noexcept { return 6; } + // この MAC アドレスが 00:00:00:00:00:00 なら true - bool Empty() const; + bool Empty() const noexcept { return (addr.q == 0); } // MAC アドレスを適当に生成する。 void Generate(); @@ -28,6 +92,26 @@ class macaddr_t : public std::array