00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef HELPER_HPP_
00034 #define HELPER_HPP_
00035
00036 #include <boost/cstdint.hpp>
00037 #include <boost/type_traits.hpp>
00038 #include <boost/utility/enable_if.hpp>
00039 #include <boost/mpl/if.hpp>
00040
00041
00042 #ifndef finline
00043 #define finline inline __attribute__((always_inline))
00044 #endif
00045
00046
00047 #define if_is_base_of(X,Y) \
00048 typename boost::enable_if<boost::is_base_of<X, Y> , int>::type __v = 0
00049
00050
00051 #define if_integral(X) \
00052 typename boost::enable_if<boost::is_integral<X>,int>::type __i##X = 0
00053
00054
00055 #define if_uint(X) \
00056 typename boost::enable_if<boost::is_integral<X>,int>::type __i##X = 0,\
00057 typename boost::enable_if<boost::is_unsigned<X>,int>::type __u##X = 0
00058
00059
00060 #define if_int(X) \
00061 typename boost::enable_if<boost::is_integral<X>,int>::type __i##X = 0,\
00062 typename boost::enable_if<boost::is_signed<X>,int>::type __s##X = 0
00063
00064
00065 #define CONVERT_SIGN(X,Y) \
00066 finline X& _unsigned( Y& v ) { return *((X*)&v); } \
00067 finline X& _unsigned( X& v ) { return v; } \
00068 finline Y& _signed( X& v ) { return *((Y*)&v); } \
00069 finline Y& _signed( Y& v ) { return v; }
00070
00071 CONVERT_SIGN( uint8_t, int8_t );
00072 CONVERT_SIGN( uint16_t, int16_t );
00073 CONVERT_SIGN( uint32_t, int32_t );
00074
00075
00076 #define CONVERT_TO_TYPE( __method, __type ) \
00077 template<class T> __type& __method(T& x, typename \
00078 boost::enable_if< boost::mpl::bool_<sizeof(T) == sizeof(__type)>, int> \
00079 ::type __ix = 0) { return (__type&) *(&x);}
00080
00081 CONVERT_TO_TYPE( _uint, uint8_t )
00082 CONVERT_TO_TYPE( _uint, uint16_t )
00083 CONVERT_TO_TYPE( _uint, uint32_t )
00084
00085 CONVERT_TO_TYPE( _int , int8_t )
00086 CONVERT_TO_TYPE( _int , int16_t )
00087 CONVERT_TO_TYPE( _int , int32_t )
00088
00089 #endif