// (C) Copyright Thorsten Ottosen 2009. // Use, modification and distribution are subject to the // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #ifdef TEST_STD # include # include // max_align and long_long_type #else # include # include # include #endif #include "test.hpp" #include "check_integral_constant.hpp" namespace { template< unsigned N, unsigned Alignment > struct alignment_implementation1 { boost::detail::aligned_storage::aligned_storage_imp type; const void* address() const { return type.address(); } }; template< unsigned N, unsigned Alignment > struct alignment_implementation2 : #ifndef __BORLANDC__ private #else public #endif boost::detail::aligned_storage::aligned_storage_imp { typedef boost::detail::aligned_storage::aligned_storage_imp type; const void* address() const { return static_cast(this)->address(); } }; template< unsigned N, class T > std::ptrdiff_t get_address1() { static alignment_implementation1::value> imp1; return static_cast(imp1.address()) - reinterpret_cast(&imp1); } template< unsigned N, class T > std::ptrdiff_t get_address2() { static alignment_implementation2::value> imp2; return static_cast(imp2.address()) - reinterpret_cast(&imp2); } template< class T > void do_check() { std::ptrdiff_t addr1 = get_address1<0,T>(); std::ptrdiff_t addr2 = get_address2<0,T>(); // // @remark: only the empty case differs // BOOST_CHECK( addr1 != addr2 ); addr1 = get_address1<1,T>(); addr2 = get_address2<1,T>(); BOOST_CHECK( addr1 == addr2 ); addr1 = get_address1<2,T>(); addr2 = get_address2<2,T>(); BOOST_CHECK( addr1 == addr2 ); addr1 = get_address1<3,T>(); addr2 = get_address2<3,T>(); BOOST_CHECK( addr1 == addr2 ); addr1 = get_address1<4,T>(); addr2 = get_address2<4,T>(); BOOST_CHECK( addr1 == addr2 ); addr1 = get_address1<17,T>(); addr2 = get_address2<17,T>(); BOOST_CHECK( addr1 == addr2 ); addr1 = get_address1<32,T>(); addr2 = get_address2<32,T>(); BOOST_CHECK( addr1 == addr2 ); } } TT_TEST_BEGIN(type_with_empty_alignment_buffer) do_check(); do_check(); do_check(); do_check(); do_check(); do_check(); do_check(); #ifdef BOOST_HAS_MS_INT64 do_check<__int64>(); #endif #ifdef BOOST_HAS_LONG_LONG do_check(); #endif do_check(); do_check(); do_check(); do_check(); do_check(); do_check(); do_check(); do_check(); do_check(); do_check(); TT_TEST_END