From a855a35c5789bbbb9a47ec69d9f2d9cc85e53cb7 Mon Sep 17 00:00:00 2001 From: Beman Date: Tue, 21 May 2013 17:31:08 -0400 Subject: [PATCH] align::yes specialization working, using ::boost::endian::convert_value<...>(T). --- include/boost/endian/types.hpp | 55 +++++++++++----------------------- 1 file changed, 17 insertions(+), 38 deletions(-) diff --git a/include/boost/endian/types.hpp b/include/boost/endian/types.hpp index 427462e..9640be4 100644 --- a/include/boost/endian/types.hpp +++ b/include/boost/endian/types.hpp @@ -36,6 +36,7 @@ #include #include +#include #define BOOST_MINIMAL_INTEGER_COVER_OPERATORS #define BOOST_NO_IO_COVER_OPERATORS #include @@ -75,7 +76,7 @@ namespace endian #endif BOOST_SCOPED_ENUM_START(align) {no, yes}; BOOST_SCOPED_ENUM_END - template class endian; @@ -364,12 +365,11 @@ namespace endian char m_value[n_bits/8]; }; - // align::yes specializations; only n_bits == 16/32/64 supported + // align::yes specializations; only n_bits == 16/32/64 supported - // aligned big endian specialization - template - class endian< order::big, T, n_bits, align::yes > - : cover_operators< endian< order::big, T, n_bits, align::yes >, T > + template + class endian + : cover_operators, T> { BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits ); BOOST_STATIC_ASSERT( sizeof(T) == n_bits/8 ); @@ -377,44 +377,23 @@ namespace endian typedef T value_type; # ifndef BOOST_ENDIAN_NO_CTORS endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT - explicit endian(T val) : m_value(::boost::endian::big_endian_value(val)) {} + explicit endian(T val) + : m_value(::boost::endian::convert_value(val)) {} # endif - endian& operator=(T val) {m_value = ::boost::endian::big_endian_value(val); return *this;} - operator T() const {return ::boost::endian::big_endian_value(m_value);} + endian& operator=(T val) + { + m_value = ::boost::endian::convert_value(val); + return *this; + } + operator T() const + { + return ::boost::endian::convert_value(m_value); + } const char* data() const {return reinterpret_cast(&m_value);} private: T m_value; }; - // aligned little endian specialization - template - class endian< order::little, T, n_bits, align::yes > - : cover_operators< endian< order::little, T, n_bits, align::yes >, T > - { - BOOST_STATIC_ASSERT( (n_bits/8)*8 == n_bits ); - BOOST_STATIC_ASSERT( sizeof(T) == n_bits/8 ); - public: - typedef T value_type; -# ifndef BOOST_ENDIAN_NO_CTORS - endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT -# ifdef BOOST_LITTLE_ENDIAN - endian(T val) : m_value(val) { } -# else - explicit endian(T val) { detail::store_little_endian(&m_value, val); } -# endif -# endif -# ifdef BOOST_LITTLE_ENDIAN - endian & operator=(T val) { m_value = val; return *this; } - operator T() const { return m_value; } - #else - endian & operator=(T val) { detail::store_little_endian(&m_value, val); return *this; } - operator T() const { return detail::load_little_endian(&m_value); } - #endif - const char* data() const { return reinterpret_cast(&m_value); } - private: - T m_value; - }; - } // namespace endian } // namespace boost