diff --git a/include/etl/byte.h b/include/etl/byte.h index 7532cf43..3cbb67f6 100644 --- a/include/etl/byte.h +++ b/include/etl/byte.h @@ -6,127 +6,310 @@ #include "platform.h" #include "type_traits.h" -#if ETL_CPP11_SUPPORTED namespace etl { +#if ETL_CPP11_SUPPORTED && !defined(ETL_BYTE_FORCE_CPP03_IMPLEMENTATION) + enum class byte : unsigned char {}; - ///************************************************************************ + //************************************************************************* /// To intger. - ///************************************************************************ - template - constexpr - etl::enable_if_t::value, TInteger> - to_integer(etl::byte b) noexcept - { - return TInteger(b); - } - - ///************************************************************************ - /// Shift left. - ///************************************************************************ + //************************************************************************* template constexpr - etl::enable_if_t::value, etl::byte> + typename etl::enable_if::value, TInteger>::type + to_integer(etl::byte b) noexcept + { + return TInteger(b); + } + + //************************************************************************* + /// Shift left. + //************************************************************************* + template + constexpr + typename etl::enable_if::value, etl::byte>::type operator <<(etl::byte b, TInteger shift) noexcept { return etl::byte(static_cast(b) << shift); } - ///************************************************************************ + //************************************************************************* /// Shift right - ///************************************************************************ + //************************************************************************* template constexpr - etl::enable_if_t::value, etl::byte> + typename etl::enable_if::value, etl::byte>::type operator >>(etl::byte b, TInteger shift) noexcept { return etl::byte(static_cast(b) >> shift); } - ///************************************************************************ + //************************************************************************* /// Shift left equals. - ///************************************************************************ + //************************************************************************* template - constexpr - etl::enable_if_t::value, etl::byte&> + constexpr + typename etl::enable_if::value, etl::byte&>::type operator <<=(etl::byte& b, TInteger shift) noexcept + { + return b = b << shift;; + } + + //************************************************************************* + /// Shift right equals. + //************************************************************************* + template + constexpr + typename etl::enable_if::value, etl::byte&>::type + operator >>=(etl::byte& b, TInteger shift) noexcept + { + return b = b >> shift; + } + + //************************************************************************* + /// Or. + //************************************************************************* + constexpr etl::byte operator |(etl::byte lhs, etl::byte rhs) noexcept + { + return etl::byte(static_cast(lhs) | static_cast(rhs)); + } + + //************************************************************************* + /// And. + //************************************************************************* + constexpr etl::byte operator &(etl::byte lhs, etl::byte rhs) noexcept + { + return etl::byte(static_cast(lhs) & static_cast(rhs)); + } + + //************************************************************************* + /// Exclusive Or. + //************************************************************************* + constexpr etl::byte operator ^(etl::byte lhs, etl::byte rhs) noexcept + { + return etl::byte(static_cast(lhs) ^ static_cast(rhs)); + } + + //************************************************************************* + /// Or equals. + //************************************************************************* + ETL_CONSTEXPR14 etl::byte& operator |=(etl::byte& lhs, etl::byte rhs) noexcept + { + return lhs = lhs | rhs; + } + + //************************************************************************* + /// And equals + //************************************************************************* + ETL_CONSTEXPR14 etl::byte& operator &=(etl::byte& lhs, etl::byte rhs) noexcept + { + return lhs = lhs & rhs; + } + + //************************************************************************* + /// Exclusive or equals. + //************************************************************************* + ETL_CONSTEXPR14 etl::byte& operator ^=(etl::byte& lhs, etl::byte rhs) noexcept + { + return lhs = lhs ^ rhs; + } + + //************************************************************************* + /// Not. + //************************************************************************* + constexpr etl::byte operator ~(etl::byte b) noexcept + { + return etl::byte(~static_cast(b)); + } + +#else + + //************************************************************************* + /// The byte class. + //************************************************************************* + class byte + { + public: + + // Friend functions + friend etl::byte operator |(etl::byte lhs, etl::byte rhs); + friend etl::byte operator &(etl::byte lhs, etl::byte rhs); + friend etl::byte operator ^(etl::byte lhs, etl::byte rhs); + + template + friend + typename etl::enable_if::value, etl::byte>::type + operator <<(etl::byte b, TInteger shift); + + template + friend + typename etl::enable_if::value, etl::byte>::type + operator >>(etl::byte b, TInteger shift); + + template + friend + typename etl::enable_if::value, TInteger>::type + to_integer(etl::byte b); + + friend bool operator ==(etl::byte lhs, etl::byte rhs); + + // Default constructor + byte() + : value(0U) + { + } + + // Construct from a value castable to unsigned char + template + explicit byte(T v) + : value(static_cast(v)) + { + } + + private: + + // Cast to a T + template + operator T() const + { + return static_cast(value); + } + + // The byte value + unsigned char value; + }; + + //************************************************************************* + /// Equality test + //************************************************************************* + bool operator ==(etl::byte lhs, etl::byte rhs) + { + return (lhs.value == rhs.value); + } + + //************************************************************************* + /// Inequality test + //************************************************************************* + bool operator !=(etl::byte lhs, etl::byte rhs) + { + return !(lhs == rhs); + } + + //************************************************************************* + /// To intger. + //************************************************************************* + template + typename etl::enable_if::value, TInteger>::type + to_integer(etl::byte b) + { + return TInteger(b); + } + + //************************************************************************* + /// Shift left. + //************************************************************************* + template + typename etl::enable_if::value, etl::byte>::type + operator <<(etl::byte b, TInteger shift) + { + return etl::byte(static_cast(b) << shift); + } + + //************************************************************************* + /// Shift right + //************************************************************************* + template + typename etl::enable_if::value, etl::byte>::type + operator >>(etl::byte b, TInteger shift) + { + return etl::byte(static_cast(b) >> shift); + } + + //************************************************************************* + /// Shift left equals. + //************************************************************************* + template + typename etl::enable_if::value, etl::byte&>::type + operator <<=(etl::byte& b, TInteger shift) { b = b << shift; return b; } - ///************************************************************************ + //************************************************************************* /// Shift right equals. - ///************************************************************************ + //************************************************************************* template - constexpr - etl::enable_if_t::value, etl::byte&> - operator >>=(etl::byte& b, TInteger shift) noexcept + typename etl::enable_if::value, etl::byte&>::type + operator >>=(etl::byte& b, TInteger shift) { b = b >> shift; return b; } - ///************************************************************************ + //************************************************************************* /// Or. - ///************************************************************************ - constexpr etl::byte operator |(etl::byte lhs, etl::byte rhs) noexcept + //************************************************************************* + etl::byte operator |(etl::byte lhs, etl::byte rhs) { return etl::byte(static_cast(lhs) | static_cast(rhs)); } - ///************************************************************************ + //************************************************************************* /// And. - ///************************************************************************ - constexpr etl::byte operator &(etl::byte lhs, etl::byte rhs) noexcept + //************************************************************************* + etl::byte operator &(etl::byte lhs, etl::byte rhs) { return etl::byte(static_cast(lhs) & static_cast(rhs)); } - ///************************************************************************ + //************************************************************************* /// Exclusive Or. - ///************************************************************************ - constexpr etl::byte operator ^(etl::byte lhs, etl::byte rhs) noexcept + //************************************************************************* + etl::byte operator ^(etl::byte lhs, etl::byte rhs) { - return etl::byte(static_cast(lhs) ^ static_cast(rhs)); + return etl::byte(static_cast(lhs) ^ static_cast(rhs)); } - ///************************************************************************ + //************************************************************************* /// Or equals. - ///************************************************************************ - ETL_CONSTEXPR14 etl::byte& operator |=(etl::byte& lhs, etl::byte rhs) noexcept + //************************************************************************* + etl::byte& operator |=(etl::byte& lhs, etl::byte rhs) { return lhs = lhs | rhs; } - ///************************************************************************ + //************************************************************************* /// And equals - ///************************************************************************ - ETL_CONSTEXPR14 etl::byte& operator &=(etl::byte& lhs, etl::byte rhs) noexcept + //************************************************************************* + etl::byte& operator &=(etl::byte& lhs, etl::byte rhs) { return lhs = lhs & rhs; } - ///************************************************************************ + //************************************************************************* /// Exclusive or equals. - ///************************************************************************ - ETL_CONSTEXPR14 etl::byte& operator ^=(etl::byte& lhs, etl::byte rhs) noexcept + //************************************************************************* + etl::byte& operator ^=(etl::byte& lhs, etl::byte rhs) { return lhs = lhs ^ rhs; } - ///************************************************************************ + //************************************************************************* /// Not. - ///************************************************************************ - constexpr etl::byte operator ~(etl::byte b) noexcept + //************************************************************************* + etl::byte operator ~(etl::byte b) { - return etl::byte(~static_cast(b)); + return etl::byte(~to_integer(b)); } -} #endif + + +} + #endif \ No newline at end of file