00001 #ifndef realroot_CONTAINER_TRAITS_H
00002 #define realroot_CONTAINER_TRAITS_H
00003
00004 namespace mmx {
00005
00006 namespace texp
00007 {
00008 template < class R, class X >
00009 struct instanceof { typedef null_t T; };
00010 template < template<class> class R, class X, class Y>
00011 struct instanceof< R<X>, Y > { typedef R<Y> T; };
00012 template< template<class,int> class R, int N, class X, class Y>
00013 struct instanceof< R<X,N>, Y> { typedef R<Y,N> T; };
00014 template< template<class,unsigned> class R, unsigned N, class X, class Y>
00015
00016 struct instanceof< R<X,N>, Y> { typedef R<Y,N> T; };
00017
00018 template< template<class,class> class V, class C, class R, class Y>
00019 struct instanceof< V<C,R>, Y > { typedef V<Y, typename instanceof<R,Y>::T > T; };
00020
00021 template < class A, class B >
00022 struct sup_container { typedef A T; };
00023
00024 template < class Container >
00025 struct value_type_{ typedef typename Container::value_type T; };
00026 template< template<class X> class R, class X >
00027 struct value_type_< R<X> > { typedef X T; };
00028 template< typename C, unsigned N > struct value_type_< C[N] > { typedef C T; };
00029 template< typename C > struct value_type_<C*> { typedef C T; };
00030 template< typename C > struct value_type_<const C*> { typedef C T; };
00031 template < class Container >
00032 struct value_type { typedef typename value_type_< typename ucstref<Container>::T >::T T; };
00033 };
00034
00035 }
00036
00037 #endif