You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							496 lines
						
					
					
						
							18 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							496 lines
						
					
					
						
							18 KiB
						
					
					
				
								/*
							 | 
						|
								    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.
							 | 
						|
								
							 | 
						|
								    This file is part of Threading Building Blocks.
							 | 
						|
								
							 | 
						|
								    Threading Building Blocks is free software; you can redistribute it
							 | 
						|
								    and/or modify it under the terms of the GNU General Public License
							 | 
						|
								    version 2 as published by the Free Software Foundation.
							 | 
						|
								
							 | 
						|
								    Threading Building Blocks is distributed in the hope that it will be
							 | 
						|
								    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
							 | 
						|
								    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						|
								    GNU General Public License for more details.
							 | 
						|
								
							 | 
						|
								    You should have received a copy of the GNU General Public License
							 | 
						|
								    along with Threading Building Blocks; if not, write to the Free Software
							 | 
						|
								    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
							 | 
						|
								
							 | 
						|
								    As a special exception, you may use this file as part of a free software
							 | 
						|
								    library without restriction.  Specifically, if other files instantiate
							 | 
						|
								    templates or use macros or inline functions from this file, or you compile
							 | 
						|
								    this file and link it with other files to produce an executable, this
							 | 
						|
								    file does not by itself cause the resulting executable to be covered by
							 | 
						|
								    the GNU General Public License.  This exception does not however
							 | 
						|
								    invalidate any other reasons why the executable file might be covered by
							 | 
						|
								    the GNU General Public License.
							 | 
						|
								*/
							 | 
						|
								
							 | 
						|
								#ifndef __TBB_tuple_H
							 | 
						|
								#define __TBB_tuple_H
							 | 
						|
								
							 | 
						|
								#include <utility>
							 | 
						|
								#include "../tbb_stddef.h"
							 | 
						|
								
							 | 
						|
								// build preprocessor variables for varying number of arguments
							 | 
						|
								// Need the leading comma so the empty __TBB_T_PACK will not cause a syntax error.
							 | 
						|
								#if __TBB_VARIADIC_MAX <= 5
							 | 
						|
								#define __TBB_T_PACK
							 | 
						|
								#define __TBB_U_PACK
							 | 
						|
								#define __TBB_TYPENAME_T_PACK
							 | 
						|
								#define __TBB_TYPENAME_U_PACK
							 | 
						|
								#define __TBB_NULL_TYPE_PACK
							 | 
						|
								#define __TBB_REF_T_PARAM_PACK
							 | 
						|
								#define __TBB_CONST_REF_T_PARAM_PACK
							 | 
						|
								#define __TBB_T_PARAM_LIST_PACK
							 | 
						|
								#define __TBB_CONST_NULL_REF_PACK
							 | 
						|
								//
							 | 
						|
								#elif __TBB_VARIADIC_MAX == 6
							 | 
						|
								#define __TBB_T_PACK ,__T5
							 | 
						|
								#define __TBB_U_PACK ,__U5
							 | 
						|
								#define __TBB_TYPENAME_T_PACK , typename __T5
							 | 
						|
								#define __TBB_TYPENAME_U_PACK , typename __U5
							 | 
						|
								#define __TBB_NULL_TYPE_PACK , null_type
							 | 
						|
								#define __TBB_REF_T_PARAM_PACK ,__T5& t5
							 | 
						|
								#define __TBB_CONST_REF_T_PARAM_PACK ,const __T5& t5
							 | 
						|
								#define __TBB_T_PARAM_LIST_PACK ,t5
							 | 
						|
								#define __TBB_CONST_NULL_REF_PACK , const null_type&
							 | 
						|
								//
							 | 
						|
								#elif __TBB_VARIADIC_MAX == 7
							 | 
						|
								#define __TBB_T_PACK ,__T5, __T6
							 | 
						|
								#define __TBB_U_PACK ,__U5, __U6
							 | 
						|
								#define __TBB_TYPENAME_T_PACK , typename __T5 , typename __T6
							 | 
						|
								#define __TBB_TYPENAME_U_PACK , typename __U5 , typename __U6
							 | 
						|
								#define __TBB_NULL_TYPE_PACK , null_type, null_type
							 | 
						|
								#define __TBB_REF_T_PARAM_PACK ,__T5& t5, __T6& t6
							 | 
						|
								#define __TBB_CONST_REF_T_PARAM_PACK ,const __T5& t5, const __T6& t6
							 | 
						|
								#define __TBB_T_PARAM_LIST_PACK ,t5 ,t6
							 | 
						|
								#define __TBB_CONST_NULL_REF_PACK , const null_type&, const null_type&
							 | 
						|
								//
							 | 
						|
								#elif __TBB_VARIADIC_MAX == 8
							 | 
						|
								#define __TBB_T_PACK ,__T5, __T6, __T7
							 | 
						|
								#define __TBB_U_PACK ,__U5, __U6, __U7
							 | 
						|
								#define __TBB_TYPENAME_T_PACK , typename __T5 , typename __T6, typename __T7
							 | 
						|
								#define __TBB_TYPENAME_U_PACK , typename __U5 , typename __U6, typename __U7
							 | 
						|
								#define __TBB_NULL_TYPE_PACK , null_type, null_type, null_type
							 | 
						|
								#define __TBB_REF_T_PARAM_PACK ,__T5& t5, __T6& t6, __T7& t7
							 | 
						|
								#define __TBB_CONST_REF_T_PARAM_PACK , const __T5& t5, const __T6& t6, const __T7& t7
							 | 
						|
								#define __TBB_T_PARAM_LIST_PACK ,t5 ,t6 ,t7
							 | 
						|
								#define __TBB_CONST_NULL_REF_PACK , const null_type&, const null_type&, const null_type&
							 | 
						|
								//
							 | 
						|
								#elif __TBB_VARIADIC_MAX == 9
							 | 
						|
								#define __TBB_T_PACK ,__T5, __T6, __T7, __T8
							 | 
						|
								#define __TBB_U_PACK ,__U5, __U6, __U7, __U8
							 | 
						|
								#define __TBB_TYPENAME_T_PACK , typename __T5, typename __T6, typename __T7, typename __T8
							 | 
						|
								#define __TBB_TYPENAME_U_PACK , typename __U5, typename __U6, typename __U7, typename __U8
							 | 
						|
								#define __TBB_NULL_TYPE_PACK , null_type, null_type, null_type, null_type
							 | 
						|
								#define __TBB_REF_T_PARAM_PACK ,__T5& t5, __T6& t6, __T7& t7, __T8& t8
							 | 
						|
								#define __TBB_CONST_REF_T_PARAM_PACK , const __T5& t5, const __T6& t6, const __T7& t7, const __T8& t8
							 | 
						|
								#define __TBB_T_PARAM_LIST_PACK ,t5 ,t6 ,t7 ,t8
							 | 
						|
								#define __TBB_CONST_NULL_REF_PACK , const null_type&, const null_type&, const null_type&, const null_type&
							 | 
						|
								//
							 | 
						|
								#elif __TBB_VARIADIC_MAX >= 10
							 | 
						|
								#define __TBB_T_PACK ,__T5, __T6, __T7, __T8, __T9
							 | 
						|
								#define __TBB_U_PACK ,__U5, __U6, __U7, __U8, __U9
							 | 
						|
								#define __TBB_TYPENAME_T_PACK , typename __T5, typename __T6, typename __T7, typename __T8, typename __T9
							 | 
						|
								#define __TBB_TYPENAME_U_PACK , typename __U5, typename __U6, typename __U7, typename __U8, typename __U9
							 | 
						|
								#define __TBB_NULL_TYPE_PACK , null_type, null_type, null_type, null_type, null_type
							 | 
						|
								#define __TBB_REF_T_PARAM_PACK ,__T5& t5, __T6& t6, __T7& t7, __T8& t8, __T9& t9
							 | 
						|
								#define __TBB_CONST_REF_T_PARAM_PACK , const __T5& t5, const __T6& t6, const __T7& t7, const __T8& t8, const __T9& t9
							 | 
						|
								#define __TBB_T_PARAM_LIST_PACK ,t5 ,t6 ,t7 ,t8 ,t9
							 | 
						|
								#define __TBB_CONST_NULL_REF_PACK , const null_type&, const null_type&, const null_type&, const null_type&, const null_type&
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								namespace tbb {
							 | 
						|
								namespace interface5 {
							 | 
						|
								
							 | 
						|
								namespace internal {
							 | 
						|
								struct null_type { };
							 | 
						|
								}
							 | 
						|
								using internal::null_type;
							 | 
						|
								
							 | 
						|
								// tuple forward declaration
							 | 
						|
								template <typename __T0=null_type, typename __T1=null_type, typename __T2=null_type,
							 | 
						|
								          typename __T3=null_type, typename __T4=null_type
							 | 
						|
								#if __TBB_VARIADIC_MAX >= 6
							 | 
						|
								, typename __T5=null_type
							 | 
						|
								#if __TBB_VARIADIC_MAX >= 7
							 | 
						|
								, typename __T6=null_type
							 | 
						|
								#if __TBB_VARIADIC_MAX >= 8
							 | 
						|
								, typename __T7=null_type
							 | 
						|
								#if __TBB_VARIADIC_MAX >= 9
							 | 
						|
								, typename __T8=null_type
							 | 
						|
								#if __TBB_VARIADIC_MAX >= 10
							 | 
						|
								, typename __T9=null_type
							 | 
						|
								#endif
							 | 
						|
								#endif
							 | 
						|
								#endif
							 | 
						|
								#endif
							 | 
						|
								#endif
							 | 
						|
								>
							 | 
						|
								class tuple;
							 | 
						|
								
							 | 
						|
								namespace internal {
							 | 
						|
								
							 | 
						|
								// const null_type temp
							 | 
						|
								inline const null_type cnull() { return null_type(); }
							 | 
						|
								
							 | 
						|
								// cons forward declaration
							 | 
						|
								template <typename __HT, typename __TT> struct cons;
							 | 
						|
								
							 | 
						|
								// type of a component of the cons
							 | 
						|
								template<int __N, typename __T>
							 | 
						|
								struct component {
							 | 
						|
								    typedef typename __T::tail_type next;
							 | 
						|
								    typedef typename component<__N-1,next>::type type;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template<typename __T>
							 | 
						|
								struct component<0,__T> {
							 | 
						|
								    typedef typename __T::head_type type;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template<>
							 | 
						|
								struct component<0,null_type> {
							 | 
						|
								    typedef null_type type;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								// const version of component
							 | 
						|
								
							 | 
						|
								template<int __N, typename __T>
							 | 
						|
								struct component<__N, const __T>
							 | 
						|
								{
							 | 
						|
								    typedef typename __T::tail_type next;
							 | 
						|
								    typedef const typename component<__N-1,next>::type type;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template<typename __T>
							 | 
						|
								struct component<0, const __T>
							 | 
						|
								{
							 | 
						|
								    typedef const typename __T::head_type type;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								// helper class for getting components of cons
							 | 
						|
								template< int __N>
							 | 
						|
								struct get_helper {
							 | 
						|
								template<typename __HT, typename __TT>
							 | 
						|
								inline static typename component<__N, cons<__HT,__TT> >::type& get(cons<__HT,__TT>& ti) {
							 | 
						|
								    return get_helper<__N-1>::get(ti.tail);
							 | 
						|
								}
							 | 
						|
								template<typename __HT, typename __TT>
							 | 
						|
								inline static typename component<__N, cons<__HT,__TT> >::type const& get(const cons<__HT,__TT>& ti) {
							 | 
						|
								    return get_helper<__N-1>::get(ti.tail);
							 | 
						|
								}
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template<>
							 | 
						|
								struct get_helper<0> {
							 | 
						|
								template<typename __HT, typename __TT>
							 | 
						|
								inline static typename component<0, cons<__HT,__TT> >::type& get(cons<__HT,__TT>& ti) {
							 | 
						|
								    return ti.head;
							 | 
						|
								}
							 | 
						|
								template<typename __HT, typename __TT>
							 | 
						|
								inline static typename component<0, cons<__HT,__TT> >::type const& get(const cons<__HT,__TT>& ti) {
							 | 
						|
								    return ti.head;
							 | 
						|
								}
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								// traits adaptor
							 | 
						|
								template <typename __T0, typename __T1, typename __T2, typename __T3, typename __T4 __TBB_TYPENAME_T_PACK>
							 | 
						|
								struct tuple_traits {
							 | 
						|
								    typedef cons <__T0, typename tuple_traits<__T1, __T2, __T3, __T4 __TBB_T_PACK , null_type>::U > U;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template <typename __T0>
							 | 
						|
								struct tuple_traits<__T0, null_type, null_type, null_type, null_type __TBB_NULL_TYPE_PACK > {
							 | 
						|
								    typedef cons<__T0, null_type> U;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template<>
							 | 
						|
								struct tuple_traits<null_type, null_type, null_type, null_type, null_type __TBB_NULL_TYPE_PACK > {
							 | 
						|
								    typedef null_type U;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								// core cons defs
							 | 
						|
								template <typename __HT, typename __TT>
							 | 
						|
								struct cons{
							 | 
						|
								
							 | 
						|
								    typedef __HT head_type;
							 | 
						|
								    typedef __TT tail_type;
							 | 
						|
								
							 | 
						|
								    head_type head; 
							 | 
						|
								    tail_type tail;
							 | 
						|
								
							 | 
						|
								    static const int length = 1 + tail_type::length;
							 | 
						|
								
							 | 
						|
								    // default constructors
							 | 
						|
								    explicit cons() : head(), tail() { }
							 | 
						|
								
							 | 
						|
								    // non-default constructors
							 | 
						|
								    cons(head_type& h, const tail_type& t) : head(h), tail(t) { }
							 | 
						|
								
							 | 
						|
								    template <typename __T0, typename __T1, typename __T2, typename __T3, typename __T4 __TBB_TYPENAME_T_PACK >
							 | 
						|
								    cons(const __T0& t0, const __T1& t1, const __T2& t2, const __T3& t3, const __T4& t4 __TBB_CONST_REF_T_PARAM_PACK) :
							 | 
						|
								        head(t0), tail(t1, t2, t3, t4 __TBB_T_PARAM_LIST_PACK, cnull()) { }
							 | 
						|
								
							 | 
						|
								    template <typename __T0, typename __T1, typename __T2, typename __T3, typename __T4 __TBB_TYPENAME_T_PACK >
							 | 
						|
								    cons(__T0& t0, __T1& t1, __T2& t2, __T3& t3, __T4& t4 __TBB_REF_T_PARAM_PACK) :
							 | 
						|
								        head(t0), tail(t1, t2, t3, t4 __TBB_T_PARAM_LIST_PACK , cnull()) { }
							 | 
						|
								
							 | 
						|
								    template <typename __HT1, typename __TT1>
							 | 
						|
								    cons(const cons<__HT1,__TT1>& other) : head(other.head), tail(other.tail) { }
							 | 
						|
								
							 | 
						|
								    cons& operator=(const cons& other) { head = other.head; tail = other.tail; return *this; }
							 | 
						|
								
							 | 
						|
								    friend bool operator==(const cons& me, const cons& other) {
							 | 
						|
								        return me.head == other.head && me.tail == other.tail;
							 | 
						|
								    }
							 | 
						|
								    friend bool operator<(const cons& me, const cons& other)  {
							 | 
						|
								        return me.head < other.head || (!(other.head < me.head) && me.tail < other.tail);
							 | 
						|
								    }
							 | 
						|
								    friend bool operator>(const cons& me, const cons& other)  { return other<me; }
							 | 
						|
								    friend bool operator!=(const cons& me, const cons& other) { return !(me==other); }
							 | 
						|
								    friend bool operator>=(const cons& me, const cons& other) { return !(me<other); }
							 | 
						|
								    friend bool operator<=(const cons& me, const cons& other) { return !(me>other); }
							 | 
						|
								
							 | 
						|
								    template<typename __HT1, typename __TT1>
							 | 
						|
								    friend bool operator==(const cons<__HT,__TT>& me, const cons<__HT1,__TT1>& other) {
							 | 
						|
								        return me.head == other.head && me.tail == other.tail;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    template<typename __HT1, typename __TT1>
							 | 
						|
								    friend bool operator<(const cons<__HT,__TT>& me, const cons<__HT1,__TT1>& other) {
							 | 
						|
								        return me.head < other.head || (!(other.head < me.head) && me.tail < other.tail);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    template<typename __HT1, typename __TT1>
							 | 
						|
								    friend bool operator>(const cons<__HT,__TT>& me, const cons<__HT1,__TT1>& other) { return other<me; }
							 | 
						|
								
							 | 
						|
								    template<typename __HT1, typename __TT1>
							 | 
						|
								    friend bool operator!=(const cons<__HT,__TT>& me, const cons<__HT1,__TT1>& other) { return !(me==other); }
							 | 
						|
								
							 | 
						|
								    template<typename __HT1, typename __TT1>
							 | 
						|
								    friend bool operator>=(const cons<__HT,__TT>& me, const cons<__HT1,__TT1>& other) { return !(me<other); }
							 | 
						|
								
							 | 
						|
								    template<typename __HT1, typename __TT1>
							 | 
						|
								    friend bool operator<=(const cons<__HT,__TT>& me, const cons<__HT1,__TT1>& other) { return !(me>other); }
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								};  // cons
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								template <typename __HT>
							 | 
						|
								struct cons<__HT,null_type> { 
							 | 
						|
								
							 | 
						|
								    typedef __HT head_type;
							 | 
						|
								    typedef null_type tail_type;
							 | 
						|
								
							 | 
						|
								    head_type head; 
							 | 
						|
								
							 | 
						|
								    static const int length = 1;
							 | 
						|
								
							 | 
						|
								    // default constructor
							 | 
						|
								    cons() : head() { /*std::cout << "default constructor 1\n";*/ }
							 | 
						|
								
							 | 
						|
								    cons(const null_type&, const null_type&, const null_type&, const null_type&, const null_type& __TBB_CONST_NULL_REF_PACK) : head() { /*std::cout << "default constructor 2\n";*/ }
							 | 
						|
								
							 | 
						|
								    // non-default constructor
							 | 
						|
								    template<typename __T1>
							 | 
						|
								    cons(__T1& t1, const null_type&, const null_type&, const null_type&, const null_type& __TBB_CONST_NULL_REF_PACK) : head(t1) { /*std::cout << "non-default a1, t1== " << t1 << "\n";*/}
							 | 
						|
								
							 | 
						|
								    cons(head_type& h, const null_type& = null_type() ) : head(h) { }
							 | 
						|
								    cons(const head_type& t0, const null_type&, const null_type&, const null_type&, const null_type& __TBB_CONST_NULL_REF_PACK) : head(t0) { }
							 | 
						|
								
							 | 
						|
								    // converting constructor
							 | 
						|
								    template<typename __HT1>
							 | 
						|
								    cons(__HT1 h1, const null_type&, const null_type&, const null_type&, const null_type& __TBB_CONST_NULL_REF_PACK) : head(h1) { }
							 | 
						|
								
							 | 
						|
								    // copy constructor
							 | 
						|
								    template<typename __HT1>
							 | 
						|
								    cons( const cons<__HT1, null_type>& other) : head(other.head) { }
							 | 
						|
								
							 | 
						|
								    // assignment operator
							 | 
						|
								    cons& operator=(const cons& other) { head = other.head; return *this; }
							 | 
						|
								
							 | 
						|
								    friend bool operator==(const cons& me, const cons& other) { return me.head == other.head; }
							 | 
						|
								    friend bool operator<(const cons& me, const cons& other) { return me.head < other.head; }
							 | 
						|
								    friend bool operator>(const cons& me, const cons& other) { return other<me; }
							 | 
						|
								    friend bool operator!=(const cons& me, const cons& other) {return !(me==other); }
							 | 
						|
								    friend bool operator<=(const cons& me, const cons& other) {return !(me>other); }
							 | 
						|
								    friend bool operator>=(const cons& me, const cons& other) {return !(me<other); }
							 | 
						|
								
							 | 
						|
								    template<typename __HT1>
							 | 
						|
								    friend bool operator==(const cons<__HT,null_type>& me, const cons<__HT1,null_type>& other) {
							 | 
						|
								        return me.head == other.head;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    template<typename __HT1>
							 | 
						|
								    friend bool operator<(const cons<__HT,null_type>& me, const cons<__HT1,null_type>& other) {
							 | 
						|
								        return me.head < other.head;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    template<typename __HT1>
							 | 
						|
								    friend bool operator>(const cons<__HT,null_type>& me, const cons<__HT1,null_type>& other) { return other<me; }
							 | 
						|
								
							 | 
						|
								    template<typename __HT1>
							 | 
						|
								    friend bool operator!=(const cons<__HT,null_type>& me, const cons<__HT1,null_type>& other) { return !(me==other); }
							 | 
						|
								
							 | 
						|
								    template<typename __HT1>
							 | 
						|
								    friend bool operator<=(const cons<__HT,null_type>& me, const cons<__HT1,null_type>& other) { return !(me>other); }
							 | 
						|
								
							 | 
						|
								    template<typename __HT1>
							 | 
						|
								    friend bool operator>=(const cons<__HT,null_type>& me, const cons<__HT1,null_type>& other) { return !(me<other); }
							 | 
						|
								
							 | 
						|
								};  // cons
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								struct cons<null_type,null_type> { typedef null_type tail_type; static const int length = 0; };
							 | 
						|
								
							 | 
						|
								// wrapper for default constructor
							 | 
						|
								template<typename __T>
							 | 
						|
								inline const __T wrap_dcons(__T*) { return __T(); }
							 | 
						|
								
							 | 
						|
								} // namespace internal
							 | 
						|
								
							 | 
						|
								// tuple definition
							 | 
						|
								template<typename __T0, typename __T1, typename __T2, typename __T3, typename __T4 __TBB_TYPENAME_T_PACK >
							 | 
						|
								class tuple : public internal::tuple_traits<__T0, __T1, __T2, __T3, __T4 __TBB_T_PACK >::U {
							 | 
						|
								    // friends
							 | 
						|
								    template <typename __T> friend class tuple_size;
							 | 
						|
								    template<int __N, typename __T> friend struct tuple_element;
							 | 
						|
								
							 | 
						|
								    // stl components
							 | 
						|
								    typedef tuple<__T0,__T1,__T2,__T3,__T4 __TBB_T_PACK > value_type;
							 | 
						|
								    typedef value_type *pointer;
							 | 
						|
								    typedef const value_type *const_pointer;
							 | 
						|
								    typedef value_type &reference;
							 | 
						|
								    typedef const value_type &const_reference;
							 | 
						|
								    typedef size_t size_type;
							 | 
						|
								
							 | 
						|
								    typedef typename internal::tuple_traits<__T0,__T1,__T2,__T3, __T4 __TBB_T_PACK >::U my_cons;
							 | 
						|
								
							 | 
						|
								public:
							 | 
						|
								    tuple(const __T0& t0=internal::wrap_dcons((__T0*)NULL)
							 | 
						|
								          ,const __T1& t1=internal::wrap_dcons((__T1*)NULL)
							 | 
						|
								          ,const __T2& t2=internal::wrap_dcons((__T2*)NULL)
							 | 
						|
								          ,const __T3& t3=internal::wrap_dcons((__T3*)NULL)
							 | 
						|
								          ,const __T4& t4=internal::wrap_dcons((__T4*)NULL)
							 | 
						|
								#if __TBB_VARIADIC_MAX >= 6
							 | 
						|
								          ,const __T5& t5=internal::wrap_dcons((__T5*)NULL)
							 | 
						|
								#if __TBB_VARIADIC_MAX >= 7
							 | 
						|
								          ,const __T6& t6=internal::wrap_dcons((__T6*)NULL)
							 | 
						|
								#if __TBB_VARIADIC_MAX >= 8
							 | 
						|
								          ,const __T7& t7=internal::wrap_dcons((__T7*)NULL)
							 | 
						|
								#if __TBB_VARIADIC_MAX >= 9
							 | 
						|
								          ,const __T8& t8=internal::wrap_dcons((__T8*)NULL)
							 | 
						|
								#if __TBB_VARIADIC_MAX >= 10
							 | 
						|
								          ,const __T9& t9=internal::wrap_dcons((__T9*)NULL)
							 | 
						|
								#endif
							 | 
						|
								#endif
							 | 
						|
								#endif
							 | 
						|
								#endif
							 | 
						|
								#endif
							 | 
						|
								          ) :
							 | 
						|
								        my_cons(t0,t1,t2,t3,t4 __TBB_T_PARAM_LIST_PACK) { }
							 | 
						|
								
							 | 
						|
								    template<int __N>
							 | 
						|
								    struct internal_tuple_element {
							 | 
						|
								        typedef typename internal::component<__N,my_cons>::type type;
							 | 
						|
								    };
							 | 
						|
								
							 | 
						|
								    template<int __N>
							 | 
						|
								    typename internal_tuple_element<__N>::type& get() { return internal::get_helper<__N>::get(*this); }
							 | 
						|
								
							 | 
						|
								    template<int __N>
							 | 
						|
								    typename internal_tuple_element<__N>::type const& get() const { return internal::get_helper<__N>::get(*this); }
							 | 
						|
								
							 | 
						|
								    template<typename __U1, typename __U2>
							 | 
						|
								    tuple& operator=(const internal::cons<__U1,__U2>& other) {
							 | 
						|
								        my_cons::operator=(other);
							 | 
						|
								        return *this;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    template<typename __U1, typename __U2>
							 | 
						|
								    tuple& operator=(const std::pair<__U1,__U2>& other) {
							 | 
						|
								        // __TBB_ASSERT(tuple_size<value_type>::value == 2, "Invalid size for pair to tuple assignment");
							 | 
						|
								        this->head = other.first;
							 | 
						|
								        this->tail.head = other.second;
							 | 
						|
								        return *this;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    friend bool operator==(const tuple& me, const tuple& other) {return static_cast<const my_cons &>(me)==(other);}
							 | 
						|
								    friend bool operator<(const tuple& me,  const tuple& other) {return static_cast<const my_cons &>(me)<(other);}
							 | 
						|
								    friend bool operator>(const tuple& me,  const tuple& other) {return static_cast<const my_cons &>(me)>(other);}
							 | 
						|
								    friend bool operator!=(const tuple& me, const tuple& other) {return static_cast<const my_cons &>(me)!=(other);}
							 | 
						|
								    friend bool operator>=(const tuple& me, const tuple& other) {return static_cast<const my_cons &>(me)>=(other);}
							 | 
						|
								    friend bool operator<=(const tuple& me, const tuple& other) {return static_cast<const my_cons &>(me)<=(other);}
							 | 
						|
								
							 | 
						|
								};  // tuple
							 | 
						|
								
							 | 
						|
								// empty tuple
							 | 
						|
								template<>
							 | 
						|
								class tuple<null_type, null_type, null_type, null_type, null_type __TBB_NULL_TYPE_PACK > : public null_type {
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								// helper classes
							 | 
						|
								
							 | 
						|
								template < typename __T>
							 | 
						|
								class tuple_size {
							 | 
						|
								public:
							 | 
						|
								    static const size_t value = 1 + tuple_size<typename __T::tail_type>::value;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								class tuple_size<tuple<> > { 
							 | 
						|
								public:
							 | 
						|
								    static const size_t value = 0;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template <>
							 | 
						|
								class tuple_size<null_type> {
							 | 
						|
								public:
							 | 
						|
								    static const size_t value = 0;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template<int __N, typename __T>
							 | 
						|
								struct tuple_element {
							 | 
						|
								    typedef typename internal::component<__N, typename __T::my_cons>::type type;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								template<int __N, typename __T0, typename __T1, typename __T2, typename __T3, typename __T4 __TBB_TYPENAME_T_PACK >
							 | 
						|
								inline static typename tuple_element<__N,tuple<__T0,__T1,__T2,__T3,__T4 __TBB_T_PACK > >::type&
							 | 
						|
								    get(tuple<__T0,__T1,__T2,__T3,__T4 __TBB_T_PACK >& t) { return internal::get_helper<__N>::get(t); }
							 | 
						|
								
							 | 
						|
								template<int __N, typename __T0, typename __T1, typename __T2, typename __T3, typename __T4 __TBB_TYPENAME_T_PACK >
							 | 
						|
								inline static typename tuple_element<__N,tuple<__T0,__T1,__T2,__T3,__T4 __TBB_T_PACK > >::type const&
							 | 
						|
								    get(const tuple<__T0,__T1,__T2,__T3,__T4 __TBB_T_PACK >& t) { return internal::get_helper<__N>::get(t); }
							 | 
						|
								
							 | 
						|
								}  // interface5
							 | 
						|
								} // tbb
							 | 
						|
								
							 | 
						|
								#if !__TBB_CPP11_TUPLE_PRESENT
							 | 
						|
								namespace tbb {
							 | 
						|
								    namespace flow {
							 | 
						|
								        using tbb::interface5::tuple;
							 | 
						|
								        using tbb::interface5::tuple_size;
							 | 
						|
								        using tbb::interface5::tuple_element;
							 | 
						|
								        using tbb::interface5::get;
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#undef __TBB_T_PACK
							 | 
						|
								#undef __TBB_U_PACK
							 | 
						|
								#undef __TBB_TYPENAME_T_PACK
							 | 
						|
								#undef __TBB_TYPENAME_U_PACK
							 | 
						|
								#undef __TBB_NULL_TYPE_PACK
							 | 
						|
								#undef __TBB_REF_T_PARAM_PACK
							 | 
						|
								#undef __TBB_CONST_REF_T_PARAM_PACK
							 | 
						|
								#undef __TBB_T_PARAM_LIST_PACK
							 | 
						|
								#undef __TBB_CONST_NULL_REF_PACK
							 | 
						|
								 
							 | 
						|
								#endif /* __TBB_tuple_H */
							 |