OSDN Git Service

2010-04-30 Paolo Carlini <paolo.carlini@oracle.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / std / tuple
index bba7ba7..f9aa14f 100644 (file)
@@ -550,6 +550,28 @@ namespace std
       return __result_type(std::forward<_Elements>(__args)...);
     }
 
+  template<typename _Tp, bool = is_array<_Tp>::value>
+    struct __pa_add_rvalue_reference_helper
+    { typedef typename std::add_rvalue_reference<_Tp>::type __type; };
+
+  template<typename _Tp>
+    struct __pa_add_rvalue_reference_helper<_Tp, true>
+    { typedef _Tp& __type; };
+
+  template<typename _Tp>
+    struct __pa_add_rvalue_reference
+    : public __pa_add_rvalue_reference_helper<_Tp>
+    { };
+
+  template<typename... _Elements>
+    inline tuple<typename __pa_add_rvalue_reference<_Elements>::__type...>
+    pack_arguments(_Elements&&... __args)
+    {
+      typedef tuple<typename __pa_add_rvalue_reference<_Elements>::__type...>
+       __result_type;
+      return __result_type(std::forward<_Elements>(__args)...);
+    }
+
   template<std::size_t...> struct __index_holder { };    
 
   template<std::size_t __i, typename _IdxHolder, typename... _Elements>
@@ -678,6 +700,49 @@ namespace std
   {
     _Swallow_assign ignore;
   }; // anonymous namespace
+
+  /**
+   * Stores a tuple of indices. Used by bind() to extract the elements
+   * in a tuple. 
+   */
+  template<int... _Indexes>
+    struct _Index_tuple
+    {
+      typedef _Index_tuple<_Indexes..., sizeof...(_Indexes)> __next;
+    };
+
+  /// Builds an _Index_tuple<0, 1, 2, ..., _Num-1>.
+  template<std::size_t _Num>
+    struct _Build_index_tuple
+    {
+      typedef typename _Build_index_tuple<_Num-1>::__type::__next __type;
+    };
+
+  template<>
+    struct _Build_index_tuple<0>
+    {
+      typedef _Index_tuple<> __type;
+    };
+
+  // See stl_pair.h...
+  template<class _T1, class _T2>
+    template<typename _Tp, typename... _Args>
+      inline _Tp
+      pair<_T1, _T2>::
+      __cons(tuple<_Args...>&& __tuple)
+      {
+       typedef typename _Build_index_tuple<sizeof...(_Args)>::__type
+         _Indexes;
+       return __do_cons<_Tp>(std::move(__tuple), _Indexes());
+      }
+
+  template<class _T1, class _T2>
+    template<typename _Tp, typename... _Args, int... _Indexes>
+      inline _Tp
+      pair<_T1, _T2>::
+      __do_cons(tuple<_Args...>&& __tuple,
+               const _Index_tuple<_Indexes...>&)
+      { return _Tp(std::forward<_Args>(get<_Indexes>(__tuple))...); }
 }
 
 #endif // __GXX_EXPERIMENTAL_CXX0X__