| 
									
										
										
										
											2017-06-27 16:43:17 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |    Copyright (c) Marshall Clow 2017. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Distributed under the Boost Software License, Version 1.0. (See accompanying | 
					
						
							| 
									
										
										
										
											2018-07-30 13:07:36 -07:00
										 |  |  |    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
					
						
							| 
									
										
										
										
											2017-06-27 16:43:17 -07:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// \file  exclusive_scan.hpp
 | 
					
						
							|  |  |  | /// \brief ???
 | 
					
						
							|  |  |  | /// \author Marshall Clow
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef BOOST_ALGORITHM_EXCLUSIVE_SCAN_HPP
 | 
					
						
							|  |  |  | #define BOOST_ALGORITHM_EXCLUSIVE_SCAN_HPP
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <functional>     // for std::plus
 | 
					
						
							|  |  |  | #include <iterator>       // for std::iterator_traits
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-03 08:33:05 -08:00
										 |  |  | #include <boost/config.hpp>
 | 
					
						
							| 
									
										
										
										
											2017-06-27 16:43:17 -07:00
										 |  |  | #include <boost/range/begin.hpp>
 | 
					
						
							|  |  |  | #include <boost/range/end.hpp>
 | 
					
						
							|  |  |  | #include <boost/range/value_type.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace boost { namespace algorithm { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template<class InputIterator, class OutputIterator, class T, class BinaryOperation> | 
					
						
							|  |  |  | OutputIterator exclusive_scan(InputIterator first, InputIterator last, | 
					
						
							|  |  |  |                               OutputIterator result, T init, BinaryOperation bOp) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (first != last) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         T saved = init; | 
					
						
							|  |  |  |         do | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             init = bOp(init, *first); | 
					
						
							|  |  |  |             *result = saved; | 
					
						
							|  |  |  |             saved = init; | 
					
						
							|  |  |  |             ++result; | 
					
						
							|  |  |  |         } while (++first != last); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template<class InputIterator, class OutputIterator, class T> | 
					
						
							|  |  |  | OutputIterator exclusive_scan(InputIterator first, InputIterator last, | 
					
						
							|  |  |  |                               OutputIterator result, T init) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	typedef typename std::iterator_traits<InputIterator>::value_type VT; | 
					
						
							| 
									
										
										
										
											2018-01-10 10:26:21 -08:00
										 |  |  |     return boost::algorithm::exclusive_scan(first, last, result, init, std::plus<VT>()); | 
					
						
							| 
									
										
										
										
											2017-06-27 16:43:17 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }} // namespace boost and algorithm
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // BOOST_ALGORITHM_EXCLUSIVE_SCAN_HPP
 |