tuple.h.svn-base

来自「ffshow源码」· SVN-BASE 代码 · 共 604 行 · 第 1/2 页

SVN-BASE
604
字号
// typename tuple_element_type<N,T>::type gets the type of the // Nth element ot T// -------------------------------------------------------template<int N, class T>struct tuple_element_type{  typedef typename T::tail_type Next;  typedef typename tuple_element_type<N-1, Next>::type type;};template<class T>struct tuple_element_type<1,T>{  typedef typename T::head_type type;};// -get function templates -----------------------------------------------// Usage: get<N>(aTuple)// non-const version, returns a non-const reference // (unless the element itself is const)  template<int N, class HT, class TT>  inline typename convert<                    typename tuple_element_type<N, cons<HT, TT> >::type                  >::plain_to_reference  get(cons<HT, TT>& c) {     return tuple_element<N>::template get<             typename convert<               typename tuple_element_type<N, cons<HT, TT>              >::type           >::plain_to_reference>(c);   } // const version, returns a const reference to element  template<int N, class HT, class TT>  inline typename convert<                    typename tuple_element_type<N, cons<HT, TT>                   >::type>::plain_to_c_reference  get(const cons<HT, TT>& c) {     return tuple_element<N>::template get<             typename convert<               typename tuple_element_type<N, cons<HT, TT>              >::type           >::plain_to_c_reference>(c);  } // -- the cons template  --------------------------------------------------template <class HT, class TT>struct cons {  typedef HT head_type;  typedef TT tail_type;  HT head;  TT tail;   template <class T1, LL_REPEAT1(class T,), class LL_TLAST>  cons( T1& t1, LL_REPEAT2( T, & t,), LL_TLAST& tlast)  : head (t1) , tail (LL_REPEAT1(t,), tlast, cnil()) {}   template <class HT2, class TT2>   cons( const cons<HT2, TT2>& u ) : head(u.head), tail(u.tail) {}  template <class HT2, class TT2>  cons& operator=( const cons<HT2, TT2>& u ) {     head=u.head; tail=u.tail; return *this;   }  // must define assignment operator explicitely, implicit version is illformed if HT is a reference  cons& operator=(const cons& u) { head = u.head; tail = u.tail; return *this; }  template <class T1, class T2>  cons& operator=( const std::pair<T1, T2>& u ) {     tuple_internal::ct_assert<(tuple_length<cons>::value == 2)>(); // check_length = 2    head = u.first; tail.head = u.second; return *this;  }  // get member functions (non-const and const)  template <int N>  typename convert<             typename tuple_element_type<N, cons>::type           >::plain_to_reference  get() {    return std::get<N>(*this); // delegate to non-member get  }  template <int N>  typename convert<             typename tuple_element_type<N, cons>::type           >::plain_to_c_reference  get() const {    return std::get<N>(*this); // delegate to non-member get  }};template <class HT>struct cons<HT, nil> {  typedef HT head_type;  typedef nil tail_type;  head_type head;    template<class T1>  cons( T1& t1, LL_REPEAT0(const nil&), const nil&)  : head (t1) {}  template <class HT2>  cons( const cons<HT2, nil>& u ) : head(u.head) {}    template <class HT2>  cons& operator=(const cons<HT2, nil>& u ) {  head = u.head; return *this; }  // must define assignment operator explicitely, implicit version is illformed if HT is a reference  cons& operator=(const cons& u) { head = u.head; return *this; }  template <int N>  typename convert<             typename tuple_element_type<N, cons>::type           >::plain_to_reference  get() {    return std::get<N>(*this);  }  template <int N>  typename convert<             typename tuple_element_type<N, cons>::type           >::plain_to_c_reference  get() const {    return std::get<N>(*this);  }};// templates for finding out the length of the tuple -------------------template<class HT, class TT> struct tuple_length<cons<HT, TT> > {  enum { value = 1 + tuple_length<TT>::value };};template<class HT> struct tuple_length<cons<HT, nil> > {  enum { value = 1 };};// If K=tuple type, allows to write tuple_length<K> instead of // tuple_lenght<typename K::inherited>template <class T1, LL_REPEAT1(class T,), class LL_TLAST> struct tuple_length<tuple<T1, LL_REPEAT1(T,), LL_TLAST> >{  enum { value = tuple_length<                   typename tuple<T1, LL_REPEAT1(T,), LL_TLAST>::inherited                 >::value };};// Tuple to cons mapper --------------------------------------------------template <class T1, LL_REPEAT1(class T,), class LL_TLAST> struct map_tuple_to_cons{  typedef cons<T1,                typename map_tuple_to_cons<LL_REPEAT1(T,), LL_TLAST, nil>::type              > type;};template <class T1>struct map_tuple_to_cons<T1, LL_REPEAT0(nil), nil>{  typedef cons<T1, nil> type;};// -------------------------------------------------------------------// -- tuple ------------------------------------------------------template <class T1, LL_REPEAT1(class T,), class LL_TLAST> class tuple : public map_tuple_to_cons<T1, LL_REPEAT1(T,), LL_TLAST>::type   {public:  typedef typename map_tuple_to_cons<T1, LL_REPEAT1(T,), LL_TLAST>::type inherited;    explicit tuple(typename convert<T1>::plain_to_c_reference t1          = tuple_default_arg_wrap<T1>::f(),        LL_REPEAT3(typename convert<T,>::plain_to_c_reference t,          = tuple_default_arg_wrap<T,>::f()),         typename convert<LL_TLAST>::plain_to_c_reference tlast          = tuple_default_arg_wrap<LL_TLAST>::f())         : inherited(t1, LL_REPEAT1(t,), tlast) {}  template<class U1, class U2>  tuple( const cons<U1, U2>& p) : inherited(p) {}  template <class U1, LL_REPEAT1(class U,), class LL_ULAST>  tuple& operator=(const tuple<U1, LL_REPEAT1(U,), LL_ULAST>& k) {     inherited::operator=(k);     return *this;  }  template <class U1, class U2>  tuple& operator=(const std::pair<U1, U2>& k) {     tuple_internal::ct_assert<(tuple_length<tuple>::value == 2)>();// check_length = 2    this->head = k.first;    this->tail.head =  k.second;     return *this;  }};// -make_tuple function templates -----------------------------------template<class T1>tuple<typename convert_to_plain_by_default<T1>::type> inline make_tuple(const T1& t1) {  return tuple<typename convert_to_plain_by_default<T1>::type> (t1);}template<class T1, class T2>tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type> inline make_tuple(const T1& t1, const T2& t2) {  return tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type> (t1, t2);}template<class T1, class T2, class T3>tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type> inline make_tuple(const T1& t1, const T2& t2, const T3& t3) {  return tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type> (t1, t2, t3);}template<class T1, class T2, class T3, class T4>tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type> inline make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4) {  return tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type> (t1, t2, t3, t4);}template<class T1, class T2, class T3, class T4, class T5>tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type, typename convert_to_plain_by_default<T5>::type> inline make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5) {  return tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type, typename convert_to_plain_by_default<T5>::type> (t1, t2, t3, t4, t5);}template<class T1, class T2, class T3, class T4, class T5, class T6>tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type, typename convert_to_plain_by_default<T5>::type, typename convert_to_plain_by_default<T6>::type> inline make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6) {  return tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type, typename convert_to_plain_by_default<T5>::type, typename convert_to_plain_by_default<T6>::type> (t1, t2, t3, t4, t5, t6);}template<class T1, class T2, class T3, class T4, class T5, class T6, class T7>tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type, typename convert_to_plain_by_default<T5>::type, typename convert_to_plain_by_default<T6>::type, typename convert_to_plain_by_default<T7>::type> inline make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7) {  return tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type, typename convert_to_plain_by_default<T5>::type, typename convert_to_plain_by_default<T6>::type, typename convert_to_plain_by_default<T7>::type> (t1, t2, t3, t4, t5, t6, t7);}template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type, typename convert_to_plain_by_default<T5>::type, typename convert_to_plain_by_default<T6>::type, typename convert_to_plain_by_default<T7>::type, typename convert_to_plain_by_default<T8>::type> inline make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8) {  return tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type, typename convert_to_plain_by_default<T5>::type, typename convert_to_plain_by_default<T6>::type, typename convert_to_plain_by_default<T7>::type, typename convert_to_plain_by_default<T8>::type> (t1, t2, t3, t4, t5, t6, t7, t8);}template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type, typename convert_to_plain_by_default<T5>::type, typename convert_to_plain_by_default<T6>::type, typename convert_to_plain_by_default<T7>::type, typename convert_to_plain_by_default<T8>::type, typename convert_to_plain_by_default<T9>::type> inline make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9) {  return tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type, typename convert_to_plain_by_default<T5>::type, typename convert_to_plain_by_default<T6>::type, typename convert_to_plain_by_default<T7>::type, typename convert_to_plain_by_default<T8>::type, typename convert_to_plain_by_default<T9>::type> (t1, t2, t3, t4, t5, t6, t7, t8, t9);}template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10>tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type, typename convert_to_plain_by_default<T5>::type, typename convert_to_plain_by_default<T6>::type, typename convert_to_plain_by_default<T7>::type, typename convert_to_plain_by_default<T8>::type, typename convert_to_plain_by_default<T9>::type, typename convert_to_plain_by_default<T10>::type> inline make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10) {  return tuple<typename convert_to_plain_by_default<T1>::type, typename convert_to_plain_by_default<T2>::type, typename convert_to_plain_by_default<T3>::type, typename convert_to_plain_by_default<T4>::type, typename convert_to_plain_by_default<T5>::type, typename convert_to_plain_by_default<T6>::type, typename convert_to_plain_by_default<T7>::type, typename convert_to_plain_by_default<T8>::type, typename convert_to_plain_by_default<T9>::type, typename convert_to_plain_by_default<T10>::type> (t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);}// Tie function templates -------------------------------------------------template<class T1>tuple<T1&> inline tie(T1& t1) {  return tuple<T1&> (t1);}template<class T1, class T2>tuple<T1&, T2&> inline tie(T1& t1, T2& t2) {  return tuple<T1&, T2&> (t1, t2);}template<class T1, class T2, class T3>tuple<T1&, T2&, T3&> inline tie(T1& t1, T2& t2, T3& t3) {  return tuple<T1&, T2&, T3&> (t1, t2, t3);}template<class T1, class T2, class T3, class T4>tuple<T1&, T2&, T3&, T4&> inline tie(T1& t1, T2& t2, T3& t3, T4& t4) {  return tuple<T1&, T2&, T3&, T4&> (t1, t2, t3, t4);}template<class T1, class T2, class T3, class T4, class T5>tuple<T1&, T2&, T3&, T4&, T5&> inline tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5) {  return tuple<T1&, T2&, T3&, T4&, T5&> (t1, t2, t3, t4, t5);}template<class T1, class T2, class T3, class T4, class T5, class T6>tuple<T1&, T2&, T3&, T4&, T5&, T6&> inline tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6) {  return tuple<T1&, T2&, T3&, T4&, T5&, T6&> (t1, t2, t3, t4, t5, t6);}template<class T1, class T2, class T3, class T4, class T5, class T6, class T7>tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&> inline tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7) {  return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&> (t1, t2, t3, t4, t5, t6, t7);}template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&> inline tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8) {  return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&> (t1, t2, t3, t4, t5, t6, t7, t8);}template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&> inline tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, T9& t9) {  return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&> (t1, t2, t3, t4, t5, t6, t7, t8, t9);}template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10>tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&> inline tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, T9& t9, T10& t10) {  return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&> (t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);}} //namespace std#undef LL_TLAST#undef LL_ULAST#undef LL_REPEAT0#undef LL_REPEAT1#undef LL_REPEAT2#undef LL_REPEAT3#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?