#ifndef H_3FE5AF534D5E46BD9700F872DB5C50CD #define H_3FE5AF534D5E46BD9700F872DB5C50CD #include #include namespace NeoPacket { class RedPixel { public: RedPixel& operator=(RedPixel& other); RedPixel& operator=(uint8_t val); uint8_t val() const; private: uint8_t padding1; uint8_t value; uint8_t padding2; }; class GreenPixel { public: GreenPixel& operator=(GreenPixel& other); GreenPixel& operator=(uint8_t val); uint8_t val() const; private: uint8_t value; uint8_t padding1; uint8_t padding2; }; class BluePixel { public: BluePixel& operator=(BluePixel& other); BluePixel& operator=(uint8_t val); uint8_t val() const; private: uint8_t padding1; uint8_t padding2; uint8_t value; }; class Pixel { public: uint8_t green; uint8_t red; uint8_t blue; void apply(GreenPixel g); void apply(RedPixel r); void apply(BluePixel b); }; template class NeoPacket { public: std::array& as_green() { return reinterpret_cast&>(*this); } std::array& as_red() { return reinterpret_cast&>(*this); } std::array& as_blue() { return reinterpret_cast&>(*this); } private: std::array data; }; } #endif //H_3FE5AF534D5E46BD9700F872DB5C50CD