OSDN Git Service

2007-10-06 Benjamin Kosnik <bkoz@redhat.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / parallel / numeric
index 4d71b8f..52fa600 100644 (file)
@@ -59,10 +59,10 @@ namespace __parallel
   // Sequential fallback.
   template<typename InputIterator, typename T>
   inline T
-  accumulate(InputIterator begin, InputIterator end, T init, __gnu_parallel::sequential_tag)
+  accumulate(InputIterator begin, InputIterator end, T init, 
+            __gnu_parallel::sequential_tag)
   { return _GLIBCXX_STD_P::accumulate(begin, end, init); }
 
-  // Sequential fallback.
   template<typename InputIterator, typename T, typename BinaryOperation>
   inline T
   accumulate(InputIterator begin, InputIterator end, T init,
@@ -72,29 +72,25 @@ namespace __parallel
   // Sequential fallback for input iterator case.
   template<typename InputIterator, typename T, typename IteratorTag>
   inline T
-  accumulate_switch(InputIterator begin, InputIterator end, T init, IteratorTag, __gnu_parallel::parallelism parallelism_tag)
-  { return accumulate(begin, end, init, __gnu_parallel::sequential_tag()); }
+  accumulate_switch(InputIterator begin, InputIterator end, T init, IteratorTag)  { return accumulate(begin, end, init, __gnu_parallel::sequential_tag()); }
 
-  // Public interface.
-  template<typename InputIterator, typename T>
-  inline T
-  accumulate(InputIterator begin, InputIterator end, T init, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_unbalanced)
-  {
-    return accumulate_switch(begin, end, init, std::plus<typename std::iterator_traits<InputIterator>::value_type>(), typename std::iterator_traits<InputIterator>::iterator_category(), parallelism_tag);
-  }
-
-  // Sequential fallback for input iterator case.
   template<typename InputIterator, typename T, typename BinaryOperation, typename IteratorTag>
   T
-  accumulate_switch(InputIterator begin, InputIterator end, T init, BinaryOperation binary_op, IteratorTag, __gnu_parallel::parallelism parallelism_tag)
+  accumulate_switch(InputIterator begin, InputIterator end, T init, 
+                   BinaryOperation binary_op, IteratorTag)
   {
-    return accumulate(begin, end, init, binary_op, __gnu_parallel::sequential_tag());
+    return accumulate(begin, end, init, binary_op, 
+                     __gnu_parallel::sequential_tag());
   }
 
   // Parallel algorithm for random access iterators.
   template<typename _RandomAccessIterator, typename T, typename BinaryOperation>
   T
-  accumulate_switch(_RandomAccessIterator begin, _RandomAccessIterator end, T init, BinaryOperation binary_op, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag)
+  accumulate_switch(_RandomAccessIterator begin, _RandomAccessIterator end, 
+                   T init, BinaryOperation binary_op, 
+                   random_access_iterator_tag, 
+                   __gnu_parallel::parallelism parallelism_tag  
+                   = __gnu_parallel::parallel_unbalanced)
   {
     if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::accumulate_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
       {
@@ -104,38 +100,81 @@ namespace __parallel
        return res;
       }
     else
-      return accumulate(begin, end, init, binary_op, __gnu_parallel::sequential_tag());
+      return accumulate(begin, end, init, binary_op, 
+                       __gnu_parallel::sequential_tag());
   }
 
   // Public interface.
-  template<typename InputIterator, typename T, typename BinaryOperation>
+  template<typename InputIterator, typename T>
   inline T
-  accumulate(InputIterator begin, InputIterator end, T init, BinaryOperation binary_op, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_unbalanced)
+  accumulate(InputIterator begin, InputIterator end, T init, 
+            __gnu_parallel::parallelism parallelism_tag)
   {
-    return accumulate_switch(begin, end, init, binary_op, typename std::iterator_traits<InputIterator>::iterator_category(), parallelism_tag);
+    typedef std::iterator_traits<InputIterator> iterator_traits;
+    typedef typename iterator_traits::value_type value_type;
+    typedef typename iterator_traits::iterator_category iterator_category;
+
+    return accumulate_switch(begin, end, init, std::plus<value_type>(), 
+                            iterator_category(), parallelism_tag);
   }
 
+  template<typename InputIterator, typename T>
+  inline T
+  accumulate(InputIterator begin, InputIterator end, T init)
+  {
+    typedef std::iterator_traits<InputIterator> iterator_traits;
+    typedef typename iterator_traits::value_type value_type;
+    typedef typename iterator_traits::iterator_category iterator_category;
 
-  // Sequential fallback.
-  template<typename InputIterator1, typename InputIterator2, typename T, typename BinaryFunction1, typename BinaryFunction2>
+    return accumulate_switch(begin, end, init, std::plus<value_type>(), 
+                            iterator_category());
+  }
+
+  template<typename InputIterator, typename T, typename BinaryOperation>
   inline T
-  inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, __gnu_parallel::sequential_tag)
+  accumulate(InputIterator begin, InputIterator end, T init, 
+            BinaryOperation binary_op, 
+            __gnu_parallel::parallelism parallelism_tag)
   {
-    return _GLIBCXX_STD_P::inner_product(first1, last1, first2, init, binary_op1, binary_op2);
+    typedef iterator_traits<InputIterator> iterator_traits;
+    typedef typename iterator_traits::iterator_category iterator_category;
+    return accumulate_switch(begin, end, init, binary_op, 
+                            iterator_category(), parallelism_tag);
   }
 
+  template<typename InputIterator, typename T, typename BinaryOperation>
+  inline T
+  accumulate(InputIterator begin, InputIterator end, T init, 
+            BinaryOperation binary_op) 
+  {
+    typedef iterator_traits<InputIterator> iterator_traits;
+    typedef typename iterator_traits::iterator_category iterator_category;
+    return accumulate_switch(begin, end, init, binary_op, 
+                            iterator_category());
+  }
+
+
   // Sequential fallback.
   template<typename InputIterator1, typename InputIterator2, typename T>
   inline T
-  inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, __gnu_parallel::sequential_tag)
+  inner_product(InputIterator1 first1, InputIterator1 last1, 
+               InputIterator2 first2, T init, __gnu_parallel::sequential_tag)
+  { return _GLIBCXX_STD_P::inner_product(first1, last1, first2, init); }
+
+  template<typename InputIterator1, typename InputIterator2, typename T, typename BinaryFunction1, typename BinaryFunction2>
+  inline T
+  inner_product(InputIterator1 first1, InputIterator1 last1, 
+               InputIterator2 first2, T init, BinaryFunction1 binary_op1, 
+               BinaryFunction2 binary_op2, __gnu_parallel::sequential_tag)
   {
-    return _GLIBCXX_STD_P::inner_product(first1, last1, first2, init);
+    return _GLIBCXX_STD_P::inner_product(first1, last1, first2, init, 
+                                        binary_op1, binary_op2);
   }
 
   // Parallel algorithm for random access iterators.
   template<typename RandomAccessIterator1, typename RandomAccessIterator2, typename T, typename BinaryFunction1, typename BinaryFunction2>
   T
-  inner_product_switch(RandomAccessIterator1 first1, RandomAccessIterator1 last1, RandomAccessIterator2 first2, T init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, random_access_iterator_tag, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag)
+  inner_product_switch(RandomAccessIterator1 first1, RandomAccessIterator1 last1, RandomAccessIterator2 first2, T init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, random_access_iterator_tag, random_access_iterator_tag, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_unbalanced)
   {
     if (_GLIBCXX_PARALLEL_CONDITION((last1 - first1) >= __gnu_parallel::Settings::accumulate_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
       {
@@ -145,20 +184,45 @@ namespace __parallel
        return res;
       }
     else
-      return inner_product(first1, last1, first2, init, __gnu_parallel::sequential_tag());
+      return inner_product(first1, last1, first2, init, 
+                          __gnu_parallel::sequential_tag());
   }
 
   // No parallelism for input iterators.
   template<typename InputIterator1, typename InputIterator2, typename T, typename BinaryFunction1, typename BinaryFunction2, typename IteratorTag1, typename IteratorTag2>
   inline T
-  inner_product_switch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, IteratorTag1, IteratorTag2, __gnu_parallel::parallelism parallelism_tag)
+  inner_product_switch(InputIterator1 first1, InputIterator1 last1, 
+                      InputIterator2 first2, T init, 
+                      BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, 
+                      IteratorTag1, IteratorTag2)
   {
-    return _GLIBCXX_STD_P::inner_product(first1, last1, first2, init, binary_op1, binary_op2);
+    return inner_product(first1, last1, first2, init, binary_op1, binary_op2,
+                        __gnu_parallel::sequential_tag());
+  }
+
+  template<typename InputIterator1, typename InputIterator2, typename T, typename BinaryFunction1, typename BinaryFunction2>
+  inline T
+  inner_product(InputIterator1 first1, InputIterator1 last1, 
+               InputIterator2 first2, T init, BinaryFunction1 binary_op1, 
+               BinaryFunction2 binary_op2, 
+               __gnu_parallel::parallelism parallelism_tag)
+  {
+    typedef iterator_traits<InputIterator1> traits1_type;
+    typedef typename traits1_type::iterator_category iterator1_category;
+
+    typedef iterator_traits<InputIterator2> traits2_type;
+    typedef typename traits2_type::iterator_category iterator2_category;
+
+    return inner_product_switch(first1, last1, first2, init, binary_op1, 
+                               binary_op2, iterator1_category(), 
+                               iterator2_category(), parallelism_tag);
   }
 
   template<typename InputIterator1, typename InputIterator2, typename T, typename BinaryFunction1, typename BinaryFunction2>
   inline T
-  inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryFunction1 binary_op1, BinaryFunction2 binary_op2, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_unbalanced)
+  inner_product(InputIterator1 first1, InputIterator1 last1, 
+               InputIterator2 first2, T init, BinaryFunction1 binary_op1, 
+               BinaryFunction2 binary_op2)
   {
     typedef iterator_traits<InputIterator1> traits1_type;
     typedef typename traits1_type::iterator_category iterator1_category;
@@ -166,20 +230,34 @@ namespace __parallel
     typedef iterator_traits<InputIterator2> traits2_type;
     typedef typename traits2_type::iterator_category iterator2_category;
 
-    return inner_product_switch(first1, last1, first2, init, binary_op1, binary_op2, iterator1_category(), iterator2_category(), parallelism_tag);
+    return inner_product_switch(first1, last1, first2, init, binary_op1, 
+                               binary_op2, iterator1_category(),
+                               iterator2_category());
   }
 
   template<typename InputIterator1, typename InputIterator2, typename T>
   inline T
-  inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_unbalanced)
+  inner_product(InputIterator1 first1, InputIterator1 last1, 
+               InputIterator2 first2, T init, 
+               __gnu_parallel::parallelism parallelism_tag)
   {
     typedef iterator_traits<InputIterator1> traits_type;
     typedef typename traits_type::value_type value_type;
-
     return inner_product(first1, last1, first2, init, std::plus<value_type>(), 
                         std::multiplies<value_type>(), parallelism_tag);
   }
 
+  template<typename InputIterator1, typename InputIterator2, typename T>
+  inline T
+  inner_product(InputIterator1 first1, InputIterator1 last1, 
+               InputIterator2 first2, T init)
+  {
+    typedef iterator_traits<InputIterator1> traits_type;
+    typedef typename traits_type::value_type value_type;
+    return inner_product(first1, last1, first2, init, std::plus<value_type>(), 
+                        std::multiplies<value_type>());
+  }
+
   // Sequential fallback.
   template<typename InputIterator, typename OutputIterator>
   inline OutputIterator
@@ -262,16 +340,21 @@ namespace __parallel
   inline OutputIterator
   adjacent_difference_switch(InputIterator begin, InputIterator end,
                             OutputIterator result, BinaryOperation bin_op,
-                            IteratorTag1, IteratorTag2, __gnu_parallel::parallelism)
-  { return adjacent_difference(begin, end, result, bin_op); }
+                            IteratorTag1, IteratorTag2)
+  { 
+    return adjacent_difference(begin, end, result, bin_op,  
+                              __gnu_parallel::sequential_tag()); 
+  }
 
   // Parallel algorithm for random access iterators.
   template<typename InputIterator, typename OutputIterator, typename BinaryOperation>
   OutputIterator
   adjacent_difference_switch(InputIterator begin, InputIterator end,
                             OutputIterator result, BinaryOperation bin_op,
-                            random_access_iterator_tag, random_access_iterator_tag,
-                            __gnu_parallel::parallelism parallelism_tag)
+                            random_access_iterator_tag, 
+                            random_access_iterator_tag,
+                            __gnu_parallel::parallelism parallelism_tag
+                            = __gnu_parallel::parallel_balanced)
   {
     if (_GLIBCXX_PARALLEL_CONDITION(static_cast<__gnu_parallel::sequence_index_t>(end - begin) >= __gnu_parallel::Settings::adjacent_difference_minimal_n && __gnu_parallel::is_parallel(parallelism_tag)))
       {
@@ -284,7 +367,8 @@ namespace __parallel
        return functionality.finish_iterator;
       }
     else
-      return adjacent_difference(begin, end, result, bin_op, __gnu_parallel::sequential_tag());
+      return adjacent_difference(begin, end, result, bin_op, 
+                                __gnu_parallel::sequential_tag());
   }
 
   // Public interface.
@@ -292,19 +376,29 @@ namespace __parallel
   inline OutputIterator
   adjacent_difference(InputIterator begin, InputIterator end,
                      OutputIterator result,
-                     __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
+                     __gnu_parallel::parallelism parallelism_tag)
+  {
+    typedef iterator_traits<InputIterator> traits_type;
+    typedef typename traits_type::value_type value_type;
+    return adjacent_difference(begin, end, result, std::minus<value_type>(), 
+                              parallelism_tag);
+  }
+
+  template<typename InputIterator, typename OutputIterator>
+  inline OutputIterator
+  adjacent_difference(InputIterator begin, InputIterator end,
+                     OutputIterator result)
   {
     typedef iterator_traits<InputIterator> traits_type;
     typedef typename traits_type::value_type value_type;
     return adjacent_difference(begin, end, result, std::minus<value_type>());
   }
 
-  // Public interface.
   template<typename InputIterator, typename OutputIterator, typename BinaryOperation>
   inline OutputIterator
   adjacent_difference(InputIterator begin, InputIterator end,
                      OutputIterator result, BinaryOperation binary_op,
-                     __gnu_parallel::parallelism parallelism_tag = __gnu_parallel::parallel_balanced)
+                     __gnu_parallel::parallelism parallelism_tag)
   {
     typedef iterator_traits<InputIterator> traitsi_type;
     typedef typename traitsi_type::iterator_category iteratori_category;
@@ -316,6 +410,22 @@ namespace __parallel
                                      iteratori_category(), 
                                      iteratoro_category(), parallelism_tag);
   }
+
+  template<typename InputIterator, typename OutputIterator, typename BinaryOperation>
+  inline OutputIterator
+  adjacent_difference(InputIterator begin, InputIterator end,
+                     OutputIterator result, BinaryOperation binary_op)
+  {
+    typedef iterator_traits<InputIterator> traitsi_type;
+    typedef typename traitsi_type::iterator_category iteratori_category;
+
+    typedef iterator_traits<OutputIterator> traitso_type;
+    typedef typename traitso_type::iterator_category iteratoro_category;
+
+    return adjacent_difference_switch(begin, end, result, binary_op,
+                                     iteratori_category(), 
+                                     iteratoro_category());
+  }
 } // end namespace
 } // end namespace