/******************************************************************** created: 2008/06/13 created: 13:6:2008 10:42 filename: d:\Projects\ServiceSpace\ServiceSpace\ServiceSpaceLib\tuple.h file path: d:\Projects\ServiceSpace\ServiceSpace\ServiceSpaceLib file base: tuple file ext: h author: purpose: *********************************************************************/ #ifndef __UTILIB_TUPLE_H__ #define __UTILIB_TUPLE_H__ #include "null_type.h" #include "int2type.h" #include namespace utilib { template class tuple; template<> class tuple { public: enum { COUNTS = 0 }; template struct element { typedef null_type type; }; }; // namespace _internal // { #ifdef WIN32 #else template class element; template class element<0, tuple > { public: typedef T1 type; }; template class element > { typedef tuple tuple_type; public: typedef typename element::type type; }; #endif template class tuple : protected tuple { typedef tuple base; public: enum { COUNTS = 1 + base::COUNTS }; typedef base rest_tuple; #ifdef WIN32 template struct element; template<> struct element<0> { typedef T1 type; }; template struct element { typedef typename base::template element::type type; }; #else #endif public: #ifdef WIN32 const typename element<0>::type & value_i(int2type<0> &)const { return t_; } template const typename element::type & value_i(int2type &)const { return base::value_i(int2type()); } typename element<0>::type & value_i(int2type<0> &) { return t_; } template typename element::type & value_i(int2type &) { return base::value_i(int2type()); } #else const typename element<0, tuple>::type & value_i(int2type<0> &)const { return t_; } template const typename element::type & value_i(int2type &)const { int2type t; return base::value_i(t); } typename element<0, tuple>::type & value_i(int2type<0> &) { return t_; } template typename element::type & value_i(int2type &) { int2type t; return base::value_i(t); } #endif public: #ifdef WIN32 template const typename element::type & value()const { return value_i(int2type()); } template void value(const typename element::type & t) { value_i(int2type()) = t; } #else template const typename element::type & value()const { int2type t; return value_i(t); } template void value(const typename element::type & t) { int2type t2; value_i(t2) = t; } #endif rest_tuple & operator<<(const T1 & t) { t_ = t; return (rest_tuple &)*this; } private: T1 t_; }; } // namespace utilib #endif