1 // The Art of C++ / Sequences
2 // Copyright (c) 2015 Daniel Frey
3 
4 #ifndef TAOCPP_SEQUENCES_INCLUDE_EXCLUSIVE_SCAN_HPP
5 #define TAOCPP_SEQUENCES_INCLUDE_EXCLUSIVE_SCAN_HPP
6 
7 #include <utility>
8 
9 #include "make_integer_sequence.hpp"
10 #include "partial_sum.hpp"
11 
12 namespace tao
13 {
14   namespace seq
15   {
16     namespace impl
17     {
18       template< typename S, typename = make_index_sequence< S::size() > >
19       struct exclusive_scan;
20 
21       template< typename S, std::size_t... Is >
22       struct exclusive_scan< S, index_sequence< Is... > >
23       {
24         using type = integer_sequence< typename S::value_type, partial_sum< Is, S >::value... >;
25       };
26     }
27 
28     template< typename T, T... Ns >
29     struct exclusive_scan
30       : impl::exclusive_scan< integer_sequence< T, Ns... > >
31     {};
32 
33     template< typename T, T... Ns >
34     struct exclusive_scan< integer_sequence< T, Ns... > >
35       : impl::exclusive_scan< integer_sequence< T, Ns... > >
36     {};
37 
38     template< typename T, T... Ns >
39     using exclusive_scan_t = typename exclusive_scan< T, Ns... >::type;
40   }
41 }
42 
43 #endif // TAOCPP_SEQUENCES_INCLUDE_EXCLUSIVE_SCAN_HPP
44