contrib/boost/static_assert.hpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef BOOST_STATIC_ASSERT_HPP
00015 #define BOOST_STATIC_ASSERT_HPP
00016
00017 #include <boost/config.hpp>
00018 #include <boost/detail/workaround.hpp>
00019
00020 #ifdef __BORLANDC__
00021
00022
00023 #define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS
00024 #endif
00025
00026 #if defined(__GNUC__) && (__GNUC__ == 3) && ((__GNUC_MINOR__ == 3) || (__GNUC_MINOR__ == 4))
00027
00028 # define BOOST_SA_GCC_WORKAROUND
00029 #endif
00030
00031 namespace boost{
00032
00033
00034 template <bool x> struct STATIC_ASSERTION_FAILURE;
00035
00036 template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };
00037
00038
00039 template<int x> struct static_assert_test{};
00040
00041 }
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 #if !defined(BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS)
00066
00067 #if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
00068
00069
00070 #define BOOST_STATIC_ASSERT( B ) \
00071 typedef ::boost::static_assert_test<\
00072 sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)\
00073 > boost_static_assert_typedef_
00074 #elif defined(BOOST_MSVC)
00075 #define BOOST_STATIC_ASSERT( B ) \
00076 typedef ::boost::static_assert_test<\
00077 sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)>\
00078 BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__)
00079 #elif defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND)
00080
00081
00082 # define BOOST_STATIC_ASSERT( B ) \
00083 typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \
00084 [ ::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >::value ]
00085 #elif defined(__sgi)
00086
00087 #define BOOST_STATIC_ASSERT( B ) \
00088 BOOST_STATIC_CONSTANT(bool, \
00089 BOOST_JOIN(boost_static_assert_test_, __LINE__) = ( B )); \
00090 typedef ::boost::static_assert_test<\
00091 sizeof(::boost::STATIC_ASSERTION_FAILURE< \
00092 BOOST_JOIN(boost_static_assert_test_, __LINE__) >)>\
00093 BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
00094 #elif BOOST_WORKAROUND(__MWERKS__, <= 0x3003)
00095
00096 #define BOOST_STATIC_ASSERT( B ) \
00097 BOOST_STATIC_CONSTANT(int, \
00098 BOOST_JOIN(boost_static_assert_test_, __LINE__) = \
00099 sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) )
00100 #else
00101
00102 #define BOOST_STATIC_ASSERT( B ) \
00103 typedef ::boost::static_assert_test<\
00104 sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)>\
00105 BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
00106 #endif
00107
00108 #else
00109
00110 #define BOOST_STATIC_ASSERT( B ) \
00111 enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \
00112 = sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) }
00113 #endif
00114
00115
00116 #endif // BOOST_STATIC_ASSERT_HPP
00117
00118