From 50e389f63c916ae158239aea3e6dc6f362729ae6 Mon Sep 17 00:00:00 2001 From: Beman Date: Tue, 21 May 2013 17:03:07 -0400 Subject: [PATCH] Preliminary work on align::yes specialization. --- include/boost/endian/types.hpp | 74 ++++++++++++++-------------------- 1 file changed, 31 insertions(+), 43 deletions(-) diff --git a/include/boost/endian/types.hpp b/include/boost/endian/types.hpp index 069f228..427462e 100644 --- a/include/boost/endian/types.hpp +++ b/include/boost/endian/types.hpp @@ -79,6 +79,29 @@ namespace endian BOOST_SCOPED_ENUM(align) A = align::no> class endian; + // aligned big endian signed integer types + typedef endian big_int16_t; + typedef endian big_int32_t; + typedef endian big_int64_t; + + // aligned big endian unsigned integer types + typedef endian big_uint16_t; + typedef endian big_uint32_t; + typedef endian big_uint64_t; + + // aligned little endian signed integer types + typedef endian little_int16_t; + typedef endian little_int32_t; + typedef endian little_int64_t; + + // aligned little endian unsigned integer types + typedef endian little_uint16_t; + typedef endian little_uint32_t; + typedef endian little_uint64_t; + + // aligned native endian typedefs are not provided because + // types are superior for this use case + // unaligned big endian signed integer types typedef endian big_8_t; typedef endian big_16_t; @@ -139,29 +162,6 @@ namespace endian typedef endian native_u56_t; typedef endian native_u64_t; - // aligned big endian signed integer types - typedef endian big_int16_t; - typedef endian big_int32_t; - typedef endian big_int64_t; - - // aligned big endian unsigned integer types - typedef endian big_uint16_t; - typedef endian big_uint32_t; - typedef endian big_uint64_t; - - // aligned little endian signed integer types - typedef endian little_int16_t; - typedef endian little_int32_t; - typedef endian little_int64_t; - - // aligned little endian unsigned integer types - typedef endian little_uint16_t; - typedef endian little_uint32_t; - typedef endian little_uint64_t; - - // aligned native endian typedefs are not provided because - // types are superior for this use case - } // namespace boost } // namespace endian @@ -263,9 +263,7 @@ namespace endian bool endian_log(true); # endif - - // endian class template and specializations ---------------------------------------// - + // endian class template specializations -------------------------------------------// // Specializations that represent unaligned bytes. // Taking an integer type as a parameter provides a nice way to pass both @@ -366,8 +364,7 @@ namespace endian char m_value[n_bits/8]; }; - // Specializations that mimic built-in integer types. - // These typically have the same alignment as the underlying types. + // align::yes specializations; only n_bits == 16/32/64 supported // aligned big endian specialization template @@ -378,22 +375,13 @@ namespace endian BOOST_STATIC_ASSERT( sizeof(T) == n_bits/8 ); public: typedef T value_type; -# ifndef BOOST_ENDIAN_NO_CTORS +# ifndef BOOST_ENDIAN_NO_CTORS endian() BOOST_ENDIAN_DEFAULT_CONSTRUCT -# ifdef BOOST_BIG_ENDIAN - endian(T val) : m_value(val) { } -# else - explicit endian(T val) { detail::store_big_endian(&m_value, val); } -# endif -# endif -# ifdef BOOST_BIG_ENDIAN - endian & operator=(T val) { m_value = val; return *this; } - operator T() const { return m_value; } -# else - endian & operator=(T val) { detail::store_big_endian(&m_value, val); return *this; } - operator T() const { return detail::load_big_endian(&m_value); } -# endif - const char* data() const { return reinterpret_cast(&m_value); } + explicit endian(T val) : m_value(::boost::endian::big_endian_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);} + const char* data() const {return reinterpret_cast(&m_value);} private: T m_value; };