os/ossrv/ossrv_pub/boost_apis/boost/lambda/numeric.hpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // -- numeric.hpp -- Boost Lambda Library -----------------------------------
     2 // Copyright (C) 2002 Jaakko Järvi (jaakko.jarvi@cs.utu.fi)
     3 // Copyright (C) 2002 Gary Powell (gwpowell@hotmail.com)
     4 //
     5 // Distributed under the Boost Software License, Version 1.0. (See
     6 // accompanying file LICENSE_1_0.txt or copy at
     7 // http://www.boost.org/LICENSE_1_0.txt)
     8 //
     9 // For more information, see http://www.boost.org
    10 
    11 #ifndef BOOST_LAMBDA_NUMERIC_HPP
    12 #define BOOST_LAMBDA_NUMERIC_HPP
    13 
    14 #include "boost/lambda/core.hpp"
    15 
    16 #include <numeric>
    17 
    18 namespace boost {
    19   namespace lambda {
    20 
    21 namespace ll {
    22 
    23 // accumulate ---------------------------------
    24 
    25 struct accumulate {
    26   
    27   template <class Args>
    28   struct sig { 
    29     typedef typename boost::remove_const<
    30         typename boost::tuples::element<3, Args>::type 
    31      >::type type; 
    32   };
    33 
    34   template <class A, class B, class C>
    35   C
    36   operator()(A a, B b, C c) const
    37   { return ::std::accumulate(a, b, c); }
    38 
    39   template <class A, class B, class C, class D>
    40   C
    41   operator()(A a, B b, C c, D d) const
    42   { return ::std::accumulate(a, b, c, d); }
    43 };
    44 
    45 // inner_product ---------------------------------
    46 
    47 struct inner_product {
    48   
    49   template <class Args>
    50   struct sig { 
    51     typedef typename boost::remove_const<
    52         typename boost::tuples::element<4, Args>::type 
    53      >::type type; 
    54   };
    55 
    56   template <class A, class B, class C, class D>
    57   D
    58   operator()(A a, B b, C c, D d) const
    59   { return ::std::inner_product(a, b, c, d); }
    60 
    61   template <class A, class B, class C, class D, class E, class F>
    62   D
    63   operator()(A a, B b, C c, D d, E e, F f) const
    64   { return ::std::inner_product(a, b, c, d, e, f); }
    65 };
    66 
    67 
    68 // partial_sum ---------------------------------
    69 
    70 struct partial_sum {
    71   
    72   template <class Args>
    73   struct sig { 
    74     typedef typename boost::remove_const<
    75         typename boost::tuples::element<3, Args>::type 
    76      >::type type; 
    77   };
    78 
    79   template <class A, class B, class C>
    80   C
    81   operator()(A a, B b, C c) const
    82   { return ::std::partial_sum(a, b, c); }
    83 
    84   template <class A, class B, class C, class D>
    85   C
    86   operator()(A a, B b, C c, D d) const
    87   { return ::std::partial_sum(a, b, c, d); }
    88 };
    89 
    90 // adjacent_difference ---------------------------------
    91 
    92 struct adjacent_difference {
    93   
    94   template <class Args>
    95   struct sig { 
    96     typedef typename boost::remove_const<
    97         typename boost::tuples::element<3, Args>::type 
    98      >::type type; 
    99   };
   100 
   101   template <class A, class B, class C>
   102   C
   103   operator()(A a, B b, C c) const
   104   { return ::std::adjacent_difference(a, b, c); }
   105 
   106   template <class A, class B, class C, class D>
   107   C
   108   operator()(A a, B b, C c, D d) const
   109   { return ::std::adjacent_difference(a, b, c, d); }
   110 };
   111 
   112 } // end of ll namespace
   113 
   114 } // end of lambda namespace
   115 } // end of boost namespace
   116 
   117 
   118 
   119 #endif