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