Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <boost/assert.hpp>
- #include <boost/next_prior.hpp>
- #include <boost/range/begin.hpp>
- #include <boost/range/end.hpp>
- #include <boost/range/empty.hpp>
- #include <boost/range/iterator_range.hpp>
- #include <boost/range/algorithm/mismatch.hpp>
- // Mimics for_each, but with adjacent pairs.
- // Precondition: rng not empty
- // Postcondition: ran fn for all adjacent (x, x+1) pairs: fn(x,x+1), fn(x+2,x+3), etc.
- template <typename SinglePassRange, typename BinaryFunction>
- BinaryFunction for_each_adjacent(const SinglePassRange& rng, BinaryFunction fn) {
- BOOST_ASSERT(not boost::empty(rng));
- const auto sub = boost::make_iterator_range(boost::next(boost::begin(rng)), boost::end(rng));
- // Sequence side-effects and always returning true for mismatch to run through whole range
- const auto wrap = [fn](const auto& lhs, const auto& rhs) { return fn(lhs, rhs), true; };
- boost::mismatch(rng, sub, wrap);
- return fn;
- }
- template <typename SinglePassIterator, typename BinaryFunction>
- BinaryFunction for_each_adjacent(SinglePassIterator first, SinglePassIterator last, BinaryFunction fn) {
- return for_each_adjacent(boost::make_iterator_range(first, last), fn);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement