Advertisement
Guest User

Untitled

a guest
Oct 9th, 2015
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.16 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <boost/assert.hpp>
  4. #include <boost/next_prior.hpp>
  5. #include <boost/range/begin.hpp>
  6. #include <boost/range/end.hpp>
  7. #include <boost/range/empty.hpp>
  8. #include <boost/range/iterator_range.hpp>
  9. #include <boost/range/algorithm/mismatch.hpp>
  10.  
  11.  
  12. // Mimics for_each, but with adjacent pairs.
  13. // Precondition: rng not empty
  14. // Postcondition: ran fn for all adjacent (x, x+1) pairs: fn(x,x+1), fn(x+2,x+3), etc.
  15. template <typename SinglePassRange, typename BinaryFunction>
  16. BinaryFunction for_each_adjacent(const SinglePassRange& rng, BinaryFunction fn) {
  17. BOOST_ASSERT(not boost::empty(rng));
  18.  
  19. const auto sub = boost::make_iterator_range(boost::next(boost::begin(rng)), boost::end(rng));
  20.  
  21. // Sequence side-effects and always returning true for mismatch to run through whole range
  22. const auto wrap = [fn](const auto& lhs, const auto& rhs) { return fn(lhs, rhs), true; };
  23.  
  24. boost::mismatch(rng, sub, wrap);
  25.  
  26. return fn;
  27. }
  28.  
  29.  
  30. template <typename SinglePassIterator, typename BinaryFunction>
  31. BinaryFunction for_each_adjacent(SinglePassIterator first, SinglePassIterator last, BinaryFunction fn) {
  32. return for_each_adjacent(boost::make_iterator_range(first, last), fn);
  33. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement