00001 #ifndef _typeof_h
00002 #define _typeof_h
00003
00004
00005 #include <spl/types.h>
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00038 template<int N> struct typeof_class;
00039 template<class T> struct WrapType { typedef T U; };
00040
00041 #define REGISTER_TYPEOF(N,T) \
00042 template<> struct typeof_class<N > { typedef WrapType<T >::U V; }; \
00043 char (*typeof_fct(const WrapType<T >::U &))[N];
00044
00045 #if defined(_MSC_VER)
00046 #define REGISTER_TYPEOF2(N,T,T2) \
00047 template<> struct typeof_class<N > { typedef WrapType<T,##T2 >::U V; }; \
00048 char (*typeof_fct(const WrapType<T,##T2 >::U &))[N];
00049 #else
00050 #define REGISTER_TYPEOF2(N,T,T2) \
00051 template<> struct typeof_class<N > { typedef WrapType<T,T2 >::U V; }; \
00052 char (*typeof_fct(const WrapType<T,T2 >::U &))[N];
00053 #endif
00054
00055 #define type_of(x) typeof_class<sizeof(*typeof_fct(x))>::V
00056
00057
00058
00059 REGISTER_TYPEOF( 1, char );
00060 REGISTER_TYPEOF( 2, byte );
00061 REGISTER_TYPEOF( 6, int16 );
00062 REGISTER_TYPEOF( 7, uint16 );
00063 REGISTER_TYPEOF( 8, long );
00064 REGISTER_TYPEOF( 9, unsigned long );
00065 REGISTER_TYPEOF( 10, int32 );
00066 REGISTER_TYPEOF( 11, uint32 );
00067 REGISTER_TYPEOF( 12, int64 );
00068 REGISTER_TYPEOF( 13, uint64 );
00069 REGISTER_TYPEOF( 14, float32 );
00070 REGISTER_TYPEOF( 15, float64 );
00071 REGISTER_TYPEOF( 17, IHashable );
00072 REGISTER_TYPEOF( 18, IComparable );
00073
00074
00075
00076
00077
00078
00079
00080
00081 #define USER_REGISTER_TYPEOF_START 1024
00082
00118 #define foreach(_it_,_collection_) \
00119 for(type_of(_collection_)::Iterator _it_ = _collection_.Begin();_it_.Next(); )
00120
00124 #endif