dune-common  2.2.1
tuples.hh
Go to the documentation of this file.
1 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set ts=8 sw=2 et sts=2:
3 
4 #ifndef DUNE_TUPLES_HH
5 #define DUNE_TUPLES_HH
6 
7 #include<iostream>
8 
9 #include"typetraits.hh"
10 #include"static_assert.hh"
11 
12 #ifdef HAVE_TUPLE
13 #include <tuple>
14 #elif defined HAVE_TR1_TUPLE
15 #include <tr1/tuple>
16 #endif
17 
18 namespace Dune{
37  template<class T>
39  {
41  typedef T& NonConstType;
43  };
44 
45  template<class T>
46  struct TupleAccessTraits<T*>
47  {
49  typedef T* NonConstType;
50  typedef T* ParameterType;
51  };
52 
53  template<class T>
54  struct TupleAccessTraits<T&>
55  {
56  typedef T& ConstType;
57  typedef T& NonConstType;
58  typedef T& ParameterType;
59  };
60 
61 #ifdef HAVE_TUPLE
62  using std::tuple;
63 #elif defined HAVE_TR1_TUPLE
64  using std::tr1::tuple;
65 #else
66 
69  struct Nil
70  {};
71 
72  namespace
73  {
74  inline const Nil nullType()
75  {
76  return Nil();
77  }
78  }
79 
85  template<typename T1, typename TT>
86  struct Pair
87  {
91  typedef T1 Type1;
92 
96  typedef TT Type2;
97 // enum{
98 // /**
99 // * @brief The number of values we hold.
100 // */
101 // values = 2;
102 // };
103 
117  template<typename T2, typename T3, typename T4, typename T5,
118  typename T6, typename T7, typename T8, typename T9>
119  Pair(typename TupleAccessTraits<T1>::ParameterType t1, T2& t2, T3& t3, T4& t4, T5& t5,
120  T6& t6, T7& t7, T8& t8, T9& t9);
121 
128  Pair(typename TupleAccessTraits<Type1>::ParameterType t1, TT& t2);
129 
130  Pair();
131 
136  template<typename U1, typename U2>
137  Pair(const Pair<U1,U2>& other);
138 
143  template<typename U1, typename U2>
144  Pair& operator=(const Pair<U1,U2>& other);
145 
146  Pair& operator=(const Pair& other);
147 
153 
159  first() const;
160 
166  second();
167 
173  second() const;
174 
179 
180  };
181 
186  template<typename T1>
187  struct Pair<T1,Nil>
188  {
192  typedef T1 Type1;
193 
199  typedef Nil Type2;
200 
205  Pair(typename TupleAccessTraits<T1>::ParameterType first, const Nil&, const Nil&, const Nil&, const Nil&,
206  const Nil&, const Nil&, const Nil&, const Nil&);
207 
213  const Nil&);
214 
215  Pair();
216 
220  template<typename T2>
221  Pair(const Pair<T2,Nil>& other);
222 
226  template<typename T2>
227  Pair& operator=(const Pair<T2,Nil>& other);
228 
232  Pair& operator=(const Pair& other);
233 
239  first();
240 
246  first() const;
247 
250  };
251 
252 
256  template<typename T1, typename T2, typename T3, typename T4, typename T5,
257  typename T6, typename T7, typename T8, typename T9>
259  {
261  };
262 
266  template<typename T1>
268  {
270  };
271 
289  template<typename T1 = Nil, typename T2 = Nil, typename T3 = Nil,
290  typename T4 = Nil, typename T5 = Nil,typename T6 = Nil,
291  typename T7 = Nil, typename T8 = Nil, typename T9 = Nil>
292  class tuple : public TupleToPairs<T1,T2,T3,T4,T5,T6,T7,T8,T9>::Type
293  {
294  public:
297 
299  {}
300 
302  : FirstPair(t1, nullType(), nullType(), nullType(),
303  nullType(), nullType(), nullType(), nullType(),
304  nullType())
305  {}
306 
309  : FirstPair(t1, t2, nullType(), nullType(),
310  nullType(), nullType(), nullType(), nullType(),
311  nullType())
312  {}
313 
317  : FirstPair(t1, t2, t3, nullType(),
318  nullType(), nullType(), nullType(), nullType(),
319  nullType())
320  {}
321 
326  : FirstPair(t1, t2, t3, t4,
327  nullType(), nullType(), nullType(), nullType(),
328  nullType())
329  {}
330 
336  : FirstPair(t1, t2, t3, t4,
337  t5, nullType(), nullType(), nullType(),
338  nullType())
339  {}
340 
347  : FirstPair(t1, t2, t3, t4,
348  t5, t6, nullType(), nullType(),
349  nullType())
350  {}
351 
359  : FirstPair(t1, t2, t3, t4,
360  t5, t6, t7, nullType(),
361  nullType())
362  {}
363 
372  : FirstPair(t1, t2, t3, t4,
373  t5, t6, t7, t8,
374  nullType())
375  {}
376 
386  : FirstPair(t1, t2, t3, t4, t5, t6, t7, t8, t9)
387  {}
388 
389  template<class U1, class U2>
390  tuple& operator=(const Pair<U1,U2>& other)
391  {
392  FirstPair::operator=(other);
393  return *this;
394  }
395  };
396 
397 #endif
398 
399 #ifdef HAVE_TUPLE
400  using std::tuple_element;
401 #elif defined HAVE_TR1_TUPLE
402  using std::tr1::tuple_element;
403 #else
404 
407  template<int N, class Tuple>
409  {
415  };
416 
417  template<int N, typename T1, typename T2>
418  struct tuple_element<N,Pair<T1,T2> >
419  {
423  typedef typename tuple_element<N-1,T2>::Type type;
424  typedef typename tuple_element<N-1,T2>::Type Type;
425  };
426 
430  template<typename T1, typename T2>
431  struct tuple_element<0, Pair<T1,T2> >
432  {
436  typedef T1 type;
437  typedef T1 Type;
438  };
439 
440 #endif
441 
442 #if defined HAVE_TUPLE || defined HAVE_TR1_TUPLE
443 #ifdef HAVE_TUPLE
444  using std::get;
445 #elif defined HAVE_TR1_TUPLE
446  using std::tr1::get;
447 #endif
448 
449 #else
450 
455  template<int N>
456  struct Element
457  {
463  template<typename T1, typename T2>
464  static typename TupleAccessTraits<
465  typename tuple_element<N,Pair<T1,T2> >::type
466  >::NonConstType
468  {
469  return Element<N-1>::get(tuple.second());
470  }
471 
477  template<typename T1, typename T2>
478  static typename TupleAccessTraits<
479  typename tuple_element<N,Pair<T1,T2> >::type
480  >::ConstType
481  get(const Pair<T1,T2>& tuple)
482  {
483  return Element<N-1>::get(tuple.second());
484  }
485  };
486 
490  template<>
491  struct Element<0>
492  {
498  template<typename T1, typename T2>
500  {
501  return tuple.first();
502  }
503 
509  template<typename T1, typename T2>
511  {
512  return tuple.first();
513  }
514  };
515 
516  template<int i, typename T1, typename T2, typename T3, typename T4,
517  typename T5, typename T6, typename T7, typename T8, typename T9>
518  typename TupleAccessTraits<typename tuple_element<i, tuple<T1,T2,T3,T4,T5,T6,T7,T8,T9> >::type>
519  ::NonConstType
521  {
522  return Element<i>::get(t);
523  }
524 
525  template<int i, typename T1, typename T2, typename T3, typename T4,
526  typename T5, typename T6, typename T7, typename T8, typename T9>
527  typename TupleAccessTraits<typename tuple_element<i, tuple<T1,T2,T3,T4,T5,T6,T7,T8,T9> >::type>
528  ::ConstType
530  {
531  return Element<i>::get(t);
532  }
533 
534 #endif
535 
536 #ifdef HAVE_TUPLE
537  using std::tuple_size;
538 #elif defined HAVE_TR1_TUPLE
539  using std::tr1::tuple_size;
540 #else
541 
545  template<class T>
546  struct tuple_size
547  {
548  enum{
549  // @brief The number of Elements in the tuple.
551  };
552 
553 
554  };
555 
556  template<typename T1, typename T2>
557  struct tuple_size<Pair<T1,T2> >
558  {
560  };
561 
562 
563  template<typename T1>
564  struct tuple_size<Pair<T1,Nil> >
565  {
566  enum{ value=1};
567  };
568 
569  template<>
570  struct tuple_size<Pair<Nil,Nil> >
571  {
572  enum{ value=0};
573  };
574 #endif
575 
576 
577 #ifdef HAVE_TUPLE
578  using std::tie;
579  using std::make_tuple;
580 #elif defined HAVE_TR1_TUPLE
581  using std::tr1::tie;
582  using std::tr1::make_tuple;
583 #endif
584 
585 
586  template<int i>
588  {
589  template<class T>
590  static std::ostream& put(std::ostream& os, const T& t, const char* delim=", ")
591  {
592  return tuple_writer<i-1>::put(os,t,delim)<<delim<<Dune::get<i-1>(t);
593  }
594 
595  template< class T >
596  static std::istream &get ( std::istream &is, T &t, const char *delim = "," )
597  {
598  tuple_writer< i-1 >::get( is, t, delim );
599  for( const char *it = delim; is && (*it != 0); ++it )
600  {
601  char c = 0;
602  is >> c;
603  if( c != *it )
604  is.setstate( std::ios::failbit );
605  }
606  return is >> Dune::get< i-1 >( t );
607  }
608  };
609 
610  template<>
611  struct tuple_writer<1>
612  {
613  template<class T>
614  static std::ostream& put(std::ostream& os, const T& t, const char* delim=", ")
615  {
616  return os<<Dune::get<0>(t);
617  }
618 
619  template< class T >
620  static std::istream &get ( std::istream &is, T &t, const char *delim = ", " )
621  {
622  return is >> Dune::get< 0 >( t );
623  }
624  };
625 
626  template<>
627  struct tuple_writer<0>
628  {
629  template<class T>
630  static std::ostream& put(std::ostream& os, const T& t, const char* delim=", ")
631  {
632  return os;
633  }
634 
635  template< class T >
636  static std::istream &get ( std::istream &is, T &t, const char *delim = ", " )
637  {
638  return is;
639  }
640  };
641 
642 #if defined HAVE_TUPLE || defined HAVE_TR1_TUPLE
643 
646  template<typename T1>
647  inline std::ostream& operator<<( std::ostream& os, const tuple<T1> & t)
648  {
649  typedef tuple<T1> TupleT;
650  return tuple_writer<tuple_size<TupleT>::value>::put(os, t);
651  }
652 
653  template<typename T1, typename T2>
654  inline std::ostream& operator<<( std::ostream& os, const tuple<T1,T2> & t)
655  {
656  typedef tuple<T1,T2> TupleT;
657  return tuple_writer<tuple_size<TupleT>::value>::put(os, t);
658  }
659 
660  template<typename T1, typename T2, typename T3>
661  inline std::ostream& operator<<( std::ostream& os, const tuple<T1,T2,T3> & t)
662  {
663  typedef tuple<T1,T2,T3> TupleT;
664  return tuple_writer<tuple_size<TupleT>::value>::put(os, t);
665  }
666 
667  template<typename T1, typename T2, typename T3, typename T4>
668  inline std::ostream& operator<<( std::ostream& os, const tuple<T1,T2,T3,T4> & t)
669  {
670  typedef tuple<T1,T2,T3,T4> TupleT;
671  return tuple_writer<tuple_size<TupleT>::value>::put(os, t);
672  }
673 
674  template<typename T1, typename T2, typename T3, typename T4, typename T5>
675  inline std::ostream& operator<<( std::ostream& os, const tuple<T1,T2,T3,T4,T5> & t)
676  {
677  typedef tuple<T1,T2,T3,T4,T5> TupleT;
678  return tuple_writer<tuple_size<TupleT>::value>::put(os, t);
679  }
680 
681  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
682  inline std::ostream& operator<<( std::ostream& os, const tuple<T1,T2,T3,T4,T5,T6> & t)
683  {
684  typedef tuple<T1,T2,T3,T4,T5,T6> TupleT;
685  return tuple_writer<tuple_size<TupleT>::value>::put(os, t);
686  }
687 
688  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
689  inline std::ostream& operator<<( std::ostream& os, const tuple<T1,T2,T3,T4,T5,T6,T7> & t)
690  {
691  typedef tuple<T1,T2,T3,T4,T5,T6,T7> TupleT;
692  return tuple_writer<tuple_size<TupleT>::value>::put(os, t);
693  }
694 
695  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
696  typename T8>
697  inline std::ostream& operator<<( std::ostream& os, const tuple<T1,T2,T3,T4,T5,T6,T7,T8> & t)
698  {
699  typedef tuple<T1,T2,T3,T4,T5,T6,T7,T8> TupleT;
700  return tuple_writer<tuple_size<TupleT>::value>::put(os, t);
701  }
702 
703  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
704  typename T8, typename T9>
705  inline std::ostream& operator<<( std::ostream& os, const tuple<T1,T2,T3,T4,T5,T6,T7,T8,T9> & t)
706  {
707  typedef tuple<T1,T2,T3,T4,T5,T6,T7,T8,T9> TupleT;
708  return tuple_writer<tuple_size<TupleT>::value>::put(os, t);
709  }
710 
711  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
712  typename T8, typename T9, typename T10>
713  inline std::ostream& operator<<( std::ostream& os, const tuple<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> & t)
714  {
715  typedef tuple<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> TupleT;
716  return tuple_writer<tuple_size<TupleT>::value>::put(os, t);
717  }
718 
722  template<typename T1>
723  inline std::istream& operator>>( std::istream& is, tuple<T1> & t)
724  {
725  typedef tuple<T1> TupleT;
726  return tuple_writer<tuple_size<TupleT>::value>::get(is, t);
727  }
728 
729  template<typename T1, typename T2>
730  inline std::istream& operator>>( std::istream& is, tuple<T1,T2> & t)
731  {
732  typedef tuple<T1,T2> TupleT;
733  return tuple_writer<tuple_size<TupleT>::value>::get(is, t);
734  }
735 
736  template<typename T1, typename T2, typename T3>
737  inline std::istream& operator>>( std::istream& is, tuple<T1,T2,T3> & t)
738  {
739  typedef tuple<T1,T2,T3> TupleT;
740  return tuple_writer<tuple_size<TupleT>::value>::get(is, t);
741  }
742 
743  template<typename T1, typename T2, typename T3, typename T4>
744  inline std::istream& operator>>( std::istream& is, tuple<T1,T2,T3,T4> & t)
745  {
746  typedef tuple<T1,T2,T3,T4> TupleT;
747  return tuple_writer<tuple_size<TupleT>::value>::get(is, t);
748  }
749 
750  template<typename T1, typename T2, typename T3, typename T4, typename T5>
751  inline std::istream& operator>>( std::istream& is, tuple<T1,T2,T3,T4,T5> & t)
752  {
753  typedef tuple<T1,T2,T3,T4,T5> TupleT;
754  return tuple_writer<tuple_size<TupleT>::value>::get(is, t);
755  }
756 
757  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
758  inline std::istream& operator>>( std::istream& is, tuple<T1,T2,T3,T4,T5,T6> & t)
759  {
760  typedef tuple<T1,T2,T3,T4,T5,T6> TupleT;
761  return tuple_writer<tuple_size<TupleT>::value>::get(is, t);
762  }
763 
764  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
765  inline std::istream& operator>>( std::istream& is, tuple<T1,T2,T3,T4,T5,T6,T7> & t)
766  {
767  typedef tuple<T1,T2,T3,T4,T5,T6,T7> TupleT;
768  return tuple_writer<tuple_size<TupleT>::value>::get(is, t);
769  }
770 
771  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
772  typename T8>
773  inline std::istream& operator>>( std::istream& is, tuple<T1,T2,T3,T4,T5,T6,T7,T8> & t)
774  {
775  typedef tuple<T1,T2,T3,T4,T5,T6,T7,T8> TupleT;
776  return tuple_writer<tuple_size<TupleT>::value>::get(is, t);
777  }
778 
779  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
780  typename T8, typename T9>
781  inline std::istream& operator>>( std::istream& is, tuple<T1,T2,T3,T4,T5,T6,T7,T8,T9> & t)
782  {
783  typedef tuple<T1,T2,T3,T4,T5,T6,T7,T8,T9> TupleT;
784  return tuple_writer<tuple_size<TupleT>::value>::get(is, t);
785  }
786 
787  template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
788  typename T8, typename T9, typename T10>
789  inline std::istream& operator>>( std::istream& is, tuple<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> & t)
790  {
791  typedef tuple<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> TupleT;
792  return tuple_writer<tuple_size<TupleT>::value>::get(is, t);
793  }
794 #else
795 
800  template<typename T1, typename T2, typename U1, typename U2>
801  inline bool operator==(const Pair<T1,T2>& tuple1, const Pair<U1,U2>& tuple2)
802  {
803  return (tuple1.first()==tuple2.first() && tuple1.second()==tuple2.second());
804  }
805 
811  template<typename T1, typename T2, typename U1, typename U2>
812  inline bool operator!=(const Pair<T1,T2>& tuple1, const Pair<U1,U2>& tuple2)
813  {
814  return (tuple1.first()!=tuple2.first() || tuple1.second()!=tuple2.second());
815  }
816 
822  template<typename T1, typename T2, typename U1, typename U2>
823  inline bool operator<(const Pair<T1,T2>& tuple1, const Pair<U1,U2>& tuple2)
824  {
825  return tuple1.first() < tuple2.first()
826  || (tuple1.first() == tuple2.first() && tuple1.second() < tuple2.second());
827  }
828 
834  template<typename T1,typename U1>
835  inline bool operator==(const Pair<T1,Nil>& tuple1, const Pair<U1,Nil>& tuple2)
836  {
837  return (tuple1.first()==tuple2.first());
838  }
839 
845  template<typename T1, typename U1>
846  inline bool operator!=(const Pair<T1,Nil>& tuple1, const Pair<U1,Nil>& tuple2)
847  {
849  "T1 and U1 have to be interoperable, i.e., either "
850  "conversion from one to the other must exist." );
851  return (tuple1.first()!=tuple2.first());
852  }
853 
859  template<typename T1, typename U1>
860  inline bool operator<(const Pair<T1,Nil>& tuple1, const Pair<U1,Nil>& tuple2)
861  {
862  return (tuple1.first()<tuple2.first());
863  }
864 
872  template<typename T1,typename U1, typename U2>
873  inline bool operator==(const Pair<T1,Nil>& tuple1, const Pair<U1,U2>& tuple2)
874  {
875  return false;
876  }
877 
884  template<typename T1, typename U1, typename U2>
885  inline bool operator!=(const Pair<T1,Nil>& tuple1, const Pair<U1,U2>& tuple2)
886  {
887  return true;
888  }
889 
890 
897  template<typename T1, typename T2, typename U1>
898  inline bool operator==(const Pair<T1,T2>& tuple1, const Pair<U1,Nil>& tuple2)
899  {
900  return false;
901  }
902 
909  template<typename T1, typename T2, typename U1>
910  inline bool operator!=(const Pair<T1,T2>& tuple1, const Pair<U1,Nil>& tuple2)
911  {
912  return true;
913  }
914 
920  template<typename T1, typename T2>
921  inline Pair<T1,T2> makePair(const T1& first, const T2& second)
922  {
923  return Pair<T1,T2>(first, second);
924  }
925 
929  template<typename T1, typename T2>
930  inline std::ostream& operator<<(std::ostream& os, const Pair<T1,T2>& pair)
931  {
932  os<<pair.first()<<" "<<pair.second();
933  return os;
934  }
935 
936  template<typename T1>
937  inline std::ostream& operator<<(std::ostream& os, const Pair<T1,Nil>& pair)
938  {
939  os<<pair.first();
940  return os;
941  }
942 
946  template<typename T1, typename T2>
947  inline std::istream& operator>>(std::istream& is, Pair<T1,T2>& pair)
948  {
949  return is >> pair.first() >> pair.second();
950  }
951 
952  template<typename T1>
953  inline std::istream& operator>>(std::istream& is, Pair<T1,Nil>& pair)
954  {
955  return is >> pair.first();
956  }
957 
958  template<class T1>
959  inline tuple<T1&> tie(T1& t1) {
960  return tuple<T1&> (t1);
961  }
962 
963  template<class T1, class T2>
964  inline tuple<T1&, T2&> tie(T1& t1, T2& t2) {
965  return tuple<T1&, T2&> (t1, t2);
966  }
967 
968  template<class T1, class T2, class T3>
969  inline tuple<T1&, T2&, T3&> tie(T1& t1, T2& t2, T3& t3) {
970  return tuple<T1&, T2&, T3&> (t1, t2, t3);
971  }
972 
973  template<class T1, class T2, class T3, class T4>
974  inline tuple<T1&, T2&, T3&, T4&> tie(T1& t1, T2& t2, T3& t3, T4& t4) {
975  return tuple<T1&, T2&, T3&, T4&> (t1, t2, t3, t4);
976  }
977 
978  template<class T1, class T2, class T3, class T4, class T5>
979  inline tuple<T1&, T2&, T3&, T4&, T5&>
980  tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5) {
981  return tuple<T1&, T2&, T3&, T4&, T5&> (t1, t2, t3, t4, t5);
982  }
983 
984  template<class T1, class T2, class T3, class T4, class T5, class T6>
985  inline tuple<T1&, T2&, T3&, T4&, T5&, T6&>
986  tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6) {
987  return tuple<T1&, T2&, T3&, T4&, T5&, T6&> (t1, t2, t3, t4, t5, t6);
988  }
989 
990  template<class T1, class T2, class T3, class T4, class T5, class T6, class T7>
991  inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&>
992  tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7) {
993  return tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&> (t1, t2, t3, t4, t5, t6, t7);
994  }
995 
996  template<class T1, class T2, class T3, class T4, class T5, class T6, class T7,
997  class T8>
998  inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&>
999  tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8) {
1001  (t1, t2, t3, t4, t5, t6, t7, t8);
1002  }
1003 
1004  template<class T1, class T2, class T3, class T4, class T5, class T6, class T7,
1005  class T8, class T9>
1006  inline tuple<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&>
1007  tie(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, T9& t9) {
1009  (t1, t2, t3, t4, t5, t6, t7, t8, t9);
1010  }
1011 
1012  template<class T1>
1013  inline tuple<T1> make_tuple(const T1& t1) {
1014  return tuple<T1> (t1);
1015  }
1016 
1017  template<class T1, class T2>
1018  inline tuple<T1, T2> make_tuple(const T1& t1, const T2& t2) {
1019  return tuple<T1, T2> (t1, t2);
1020  }
1021 
1022  template<class T1, class T2, class T3>
1023  inline tuple<T1, T2, T3> make_tuple(const T1& t1, const T2& t2, const T3& t3) {
1024  return tuple<T1, T2, T3> (t1, t2, t3);
1025  }
1026 
1027  template<class T1, class T2, class T3, class T4>
1028  inline tuple<T1, T2, T3, T4> make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4) {
1029  return tuple<T1, T2, T3, T4> (t1, t2, t3, t4);
1030  }
1031 
1032  template<class T1, class T2, class T3, class T4, class T5>
1033  inline tuple<T1, T2, T3, T4, T5>
1034  make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5) {
1035  return tuple<T1, T2, T3, T4, T5> (t1, t2, t3, t4, t5);
1036  }
1037 
1038  template<class T1, class T2, class T3, class T4, class T5, class T6>
1039  inline tuple<T1, T2, T3, T4, T5, T6>
1040  make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6) {
1041  return tuple<T1, T2, T3, T4, T5, T6> (t1, t2, t3, t4, t5, t6);
1042  }
1043 
1044  template<class T1, class T2, class T3, class T4, class T5, class T6, class T7>
1045  inline tuple<T1, T2, T3, T4, T5, T6, T7>
1046  make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6,
1047  const T7& t7) {
1048  return tuple<T1, T2, T3, T4, T5, T6, T7> (t1, t2, t3, t4, t5, t6, t7);
1049  }
1050 
1051  template<class T1, class T2, class T3, class T4, class T5, class T6, class T7,
1052  class T8>
1053  inline tuple<T1, T2, T3, T4, T5, T6, T7, T8>
1054  make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6,
1055  const T7& t7, const T8& t8) {
1057  (t1, t2, t3, t4, t5, t6, t7, t8);
1058  }
1059 
1060  template<class T1, class T2, class T3, class T4, class T5, class T6, class T7,
1061  class T8, class T9>
1062  inline tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>
1063  make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6,
1064  const T7& t7, const T8& t8, const T9& t9) {
1066  (t1, t2, t3, t4, t5, t6, t7, t8, t9);
1067  }
1068 
1069  template<typename T1, typename TT>
1070  template<typename T2, typename T3, typename T4, typename T5,
1071  typename T6, typename T7, typename T8, typename T9>
1073  T2& t2, T3& t3, T4& t4, T5& t5,
1074  T6& t6, T7& t7, T8& t8, T9& t9)
1075  : first_(first), second_(t2,t3,t4,t5,t6,t7,t8,t9, nullType())
1076  {}
1077 
1078  template <typename T1, typename TT>
1079  inline Pair<T1, TT>::Pair(typename TupleAccessTraits<T1>::ParameterType first, TT& second)
1080  : first_(first), second_(second)
1081  {}
1082 
1083  template<typename T1, typename T2>
1085  : first_(), second_()
1086  {}
1087 
1088  template<typename T1, typename T2>
1089  template<typename U1, typename U2>
1090  inline Pair<T1,T2>::Pair(const Pair<U1,U2>& other)
1091  : first_(other.first_), second_(other.second_)
1092  {}
1093 
1094  template<typename T1, typename T2>
1095  template<typename U1, typename U2>
1097  {
1098  first_=other.first_;
1099  second_=other.second_;
1100  return *this;
1101  }
1102 
1103  template<typename T1, typename T2>
1105  {
1106  first_=other.first_;
1107  second_=other.second_;
1108  return *this;
1109  }
1110 
1111  template<typename T1, typename T2>
1112  inline typename TupleAccessTraits<T1>::NonConstType
1114  {
1115  return first_;
1116  }
1117 
1118  template<typename T1, typename T2>
1119  inline typename TupleAccessTraits<T1>::ConstType
1121  {
1122  return first_;
1123  }
1124 
1125 
1126  template<typename T1, typename T2>
1127  inline typename TupleAccessTraits<T2>::NonConstType
1129  {
1130  return second_;
1131  }
1132 
1133  template<typename T1, typename T2>
1134  inline typename TupleAccessTraits<T2>::ConstType
1136  {
1137  return second_;
1138  }
1139 
1140  template<typename T1>
1142  const Nil&, const Nil&, const Nil&, const Nil&,
1143  const Nil&, const Nil&, const Nil&, const Nil&)
1144  : first_(first)
1145  {}
1146 
1147  template <typename T1>
1149  const Nil&)
1150  : first_(first)
1151  {}
1152 
1153  template<typename T1>
1155  : first_()
1156  {}
1157 
1158  template<typename T1>
1159  template<typename T2>
1160  inline Pair<T1,Nil>::Pair(const Pair<T2,Nil>& other)
1161  : first_(other.first_)
1162  {}
1163 
1164  template<typename T1>
1165  template<typename T2>
1167  {
1168  first_ = other.first_;
1169  return *this;
1170  }
1171 
1172 
1173  template<typename T1>
1175  {
1176  first_ = other.first_;
1177  return *this;
1178  }
1179 
1180  template<typename T1>
1181  inline typename TupleAccessTraits<T1>::NonConstType
1183  {
1184  return first_;
1185  }
1186 
1187  template<typename T1>
1188  inline typename TupleAccessTraits<T1>::ConstType
1190  {
1191  return first_;
1192  }
1193 
1195 #endif
1196 }
1197 #endif