// Copyright 2005 Daniel Wallin. // Copyright 2005 Joel de Guzman. // Copyright 2005 Dan Marsden. // // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Modeled after range_ex, Copyright 2004 Eric Niebler #ifndef PHOENIX_ALGORITHM_TRANSFORMATION_HPP #define PHOENIX_ALGORITHM_TRANSFORMATION_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace phoenix { namespace impl { struct swap { template struct result { typedef void type; }; template void operator()(A& a, B& b) const { using std::swap; swap(a, b); } }; struct copy { template struct result : detail::decay_array {}; template typename result::type operator()(R& r, I i) const { return std::copy(detail::begin_(r), detail::end_(r), i); } }; struct copy_backward { template struct result { typedef I type; }; template I operator()(R& r, I i) const { return std::copy_backward(detail::begin_(r), detail::end_(r), i); } }; struct transform { template struct result : detail::decay_array< typename mpl::if_, OutorI1, ForOut>::type> { }; template typename result::type operator()(R& r, O o, F f) const { return std::transform(detail::begin_(r), detail::end_(r), o, f); } template typename result::type operator()(R& r, I i, O o, F f) const { return std::transform(detail::begin_(r), detail::end_(r), i, o, f); } }; struct replace { template struct result { typedef void type; }; template void operator()(R& r, T const& what, T const& with) const { std::replace(detail::begin_(r), detail::end_(r), what, with); } }; struct replace_if { template struct result { typedef void type; }; template void operator()(R& r, P p, T const& with) const { std::replace_if(detail::begin_(r), detail::end_(r), p, with); } }; struct replace_copy { template struct result : detail::decay_array {}; template typename result::type operator()(R& r, O o, T const& what, T const& with) const { return std::replace_copy(detail::begin_(r), detail::end_(r), o, what, with); } }; struct replace_copy_if { template struct result : detail::decay_array {}; template typename result::type operator()(R& r, O o, P p, T const& with) const { return std::replace_copy_if(detail::begin_(r), detail::end_(r), o, p, with); } }; struct fill { template struct result { typedef void type; }; template void operator()(R& r, T const& x) const { std::fill(detail::begin_(r), detail::end_(r), x); } }; struct fill_n { template struct result { typedef void type; }; template void operator()(R& r, N n, T const& x) const { std::fill_n(detail::begin_(r), n, x); } }; struct generate { template struct result { typedef void type; }; template void operator()(R& r, G g) const { std::generate(detail::begin_(r), detail::end_(r), g); } }; struct generate_n { template struct result { typedef void type; }; template void operator()(R& r, N n, G g) const { std::generate_n(detail::begin_(r), n, g); } }; struct remove { template struct result : range_result_iterator { }; template typename result::type execute(R& r, T const& x, mpl::true_) const { r.remove(x); return detail::end_(r); } template typename result::type execute(R& r, T const& x, mpl::false_) const { return std::remove(detail::begin_(r), detail::end_(r), x); } template typename result::type operator()(R& r, T const& x) const { return execute(r, x, has_remove()); } }; struct remove_if { template struct result : range_result_iterator { }; template typename result::type execute(R& r, P p, mpl::true_) const { r.remove_if(p); return detail::end_(r); } template typename result::type execute(R& r, P p, mpl::false_) const { return std::remove_if(detail::begin_(r), detail::end_(r), p); } template typename result::type operator()(R& r, P p) const { return execute(r, p, has_remove_if()); } }; struct remove_copy { template struct result : detail::decay_array {}; template typename result::type operator()(R& r, O o, T const& x) const { return std::remove_copy(detail::begin_(r), detail::end_(r), o, x); } }; struct remove_copy_if { template struct result : detail::decay_array {}; template typename result::type operator()(R& r, O o, P p) const { return std::remove_copy_if(detail::begin_(r), detail::end_(r), o, p); } }; struct unique { template struct result : range_result_iterator { }; template typename result::type execute(R& r, mpl::true_) const { r.unique(); return detail::end_(r); } template typename result::type execute(R& r, mpl::false_) const { return std::unique(detail::begin_(r), detail::end_(r)); } template typename result::type operator()(R& r) const { return execute(r, has_unique()); } template typename result::type execute(R& r, P p, mpl::true_) const { r.unique(p); return detail::end_(r); } template typename result::type execute(R& r, P p, mpl::false_) const { return std::unique(detail::begin_(r), detail::end_(r), p); } template typename result::type operator()(R& r, P p) const { return execute(r, p, has_unique()); } }; struct unique_copy { template struct result : detail::decay_array {}; template typename result::type operator()(R& r, O o) const { return std::unique_copy( detail::begin_(r) , detail::end_(r) , o ); } template typename result::type operator()(R& r, O o, P p) const { return std::unique_copy( detail::begin_(r) , detail::end_(r) , o , p ); } }; struct reverse { template struct result { typedef void type; }; template void execute(R& r, mpl::true_) const { r.reverse(); } template void execute(R& r, mpl::false_) const { std::reverse(detail::begin_(r), detail::end_(r)); } template void operator()(R& r) const { execute(r, has_reverse()); } }; struct reverse_copy { template struct result : detail::decay_array {}; template typename result::type operator()(R& r, O o) const { return std::reverse_copy( detail::begin_(r) , detail::end_(r) , o ); } }; struct rotate { template struct result { typedef void type; }; template void operator()(R& r, M m) const { std::rotate( detail::begin_(r) , m , detail::end_(r) ); } }; struct rotate_copy { template struct result : detail::decay_array {}; template typename result::type operator()(R& r, M m, O o) const { return std::rotate_copy( detail::begin_(r) , m , detail::end_(r) , o ); } }; struct random_shuffle { template struct result { typedef void type; }; template void operator()(R& r) const { return std::random_shuffle(detail::begin_(r), detail::end_(r)); } template void operator()(R& r, G g) const { return std::random_shuffle(detail::begin_(r), detail::end_(r), g); } }; struct partition { template struct result : range_result_iterator {}; template typename result::type operator()(R& r, P p) const { return std::partition(detail::begin_(r), detail::end_(r), p); } }; struct stable_partition { template struct result : range_result_iterator {}; template typename result::type operator()(R& r, P p) const { return std::stable_partition(detail::begin_(r), detail::end_(r), p); } }; struct sort { template struct result { typedef void type; }; template void execute(R& r, mpl::true_) const { r.sort(); } template void execute(R& r, mpl::false_) const { std::sort(detail::begin_(r), detail::end_(r)); } template void operator()(R& r) const { execute(r, has_sort()); } template void execute(R& r, C c, mpl::true_) const { r.sort(c); } template void execute(R& r, C c, mpl::false_) const { std::sort(detail::begin_(r), detail::end_(r), c); } template void operator()(R& r, C c) const { execute(r, c, has_sort()); } }; struct stable_sort { template struct result { typedef void type; }; template void operator()(R& r) const { std::stable_sort(detail::begin_(r), detail::end_(r)); } template void operator()(R& r, C c) const { std::stable_sort(detail::begin_(r), detail::end_(r), c); } }; struct partial_sort { template struct result { typedef void type; }; template void operator()(R& r, M m) const { std::partial_sort(detail::begin_(r), m, detail::end_(r)); } template void operator()(R& r, M m, C c) const { std::partial_sort(detail::begin_(r), m, detail::end_(r), c); } }; struct partial_sort_copy { template struct result : range_result_iterator {}; template typename result::type operator()(R1& r1, R2& r2) const { return std::partial_sort_copy( detail::begin_(r1), detail::end_(r1) , detail::begin_(r2), detail::end_(r2) ); } template typename result::type operator()(R1& r1, R2& r2, C c) const { return std::partial_sort_copy( detail::begin_(r1), detail::end_(r1) , detail::begin_(r2), detail::end_(r2) , c ); } }; struct nth_element { template struct result { typedef void type; }; template void operator()(R& r, N n) const { return std::nth_element(detail::begin_(r), n, detail::end_(r)); } template void operator()(R& r, N n, C c) const { return std::nth_element(detail::begin_(r), n, detail::end_(r), c); } }; struct merge { template struct result : detail::decay_array {}; template typename result::type operator()(R1& r1, R2& r2, O o) const { return std::merge( detail::begin_(r1), detail::end_(r1) , detail::begin_(r2), detail::end_(r2) , o ); } template typename result::type operator()(R1& r1, R2& r2, O o, C c) const { return std::merge( detail::begin_(r1), detail::end_(r1) , detail::begin_(r2), detail::end_(r2) , o , c ); } }; struct inplace_merge { template struct result { typedef void type; }; template void operator()(R& r, M m) const { return std::inplace_merge(detail::begin_(r), m, detail::end_(r)); } template void operator()(R& r, M m, C c) const { return std::inplace_merge(detail::begin_(r), m, detail::end_(r), c); } }; struct next_permutation { template struct result { typedef bool type; }; template bool operator()(R& r) const { return std::next_permutation(detail::begin_(r), detail::end_(r)); } template bool operator()(R& r, C c) const { return std::next_permutation(detail::begin_(r), detail::end_(r), c); } }; struct prev_permutation { template struct result { typedef bool type; }; template bool operator()(R& r) const { return std::prev_permutation(detail::begin_(r), detail::end_(r)); } template bool operator()(R& r, C c) const { return std::prev_permutation(detail::begin_(r), detail::end_(r), c); } }; struct inner_product { template struct result { typedef T type; }; template typename result::type operator()(R& r, I i, T t) const { return std::inner_product( detail::begin_(r), detail::end_(r), i, t); } template typename result::type operator()(R& r, I i, T t, C1 c1, C2 c2) const { return std::inner_product( detail::begin_(r), detail::end_(r), i, t, c1, c2); } }; struct partial_sum { template struct result : detail::decay_array {}; template typename result::type operator()(R& r, I i) const { return std::partial_sum( detail::begin_(r), detail::end_(r), i); } template typename result::type operator()(R& r, I i, C c) const { return std::partial_sum( detail::begin_(r), detail::end_(r), i, c); } }; struct adjacent_difference { template struct result : detail::decay_array {}; template typename result::type operator()(R& r, I i) const { return std::adjacent_difference( detail::begin_(r), detail::end_(r), i); } template typename result::type operator()(R& r, I i, C c) const { return std::adjacent_difference( detail::begin_(r), detail::end_(r), i, c); } }; struct push_heap { template struct result { typedef void type; }; template void operator()(R& r) const { std::push_heap(detail::begin_(r), detail::end_(r)); } template void operator()(R& r, C c) const { std::push_heap(detail::begin_(r), detail::end_(r), c); } }; struct pop_heap { template struct result { typedef void type; }; template void operator()(R& r) const { std::pop_heap(detail::begin_(r), detail::end_(r)); } template void operator()(R& r, C c) const { std::pop_heap(detail::begin_(r), detail::end_(r), c); } }; struct make_heap { template struct result { typedef void type; }; template void operator()(R& r) const { std::make_heap(detail::begin_(r), detail::end_(r)); } template void operator()(R& r, C c) const { std::make_heap(detail::begin_(r), detail::end_(r), c); } }; struct sort_heap { template struct result { typedef void type; }; template void operator()(R& r) const { std::sort_heap(detail::begin_(r), detail::end_(r)); } template void operator()(R& r, C c) const { std::sort_heap(detail::begin_(r), detail::end_(r), c); } }; struct set_union { template struct result : detail::decay_array {}; template typename result::type operator()(R1& r1, R2& r2, O o) const { return std::set_union( detail::begin_(r1), detail::end_(r1) , detail::begin_(r2), detail::end_(r2) , o ); } template typename result::type operator()(R1& r1, R2& r2, O o, C c) const { return std::set_union( detail::begin_(r1), detail::end_(r1) , detail::begin_(r2), detail::end_(r2) , o , c ); } }; struct set_intersection { template struct result : detail::decay_array {}; template typename result::type operator()(R1& r1, R2& r2, O o) const { return std::set_intersection( detail::begin_(r1), detail::end_(r1) , detail::begin_(r2), detail::end_(r2) , o ); } template typename result::type operator()(R1& r1, R2& r2, O o, C c) const { return std::set_intersection( detail::begin_(r1), detail::end_(r1) , detail::begin_(r2), detail::end_(r2) , o , c ); } }; struct set_difference { template struct result : detail::decay_array {}; template typename result::type operator()(R1& r1, R2& r2, O o) const { return std::set_difference( detail::begin_(r1), detail::end_(r1) , detail::begin_(r2), detail::end_(r2) , o ); } template typename result::type operator()(R1& r1, R2& r2, O o, C c) const { return std::set_difference( detail::begin_(r1), detail::end_(r1) , detail::begin_(r2), detail::end_(r2) , o , c ); } }; struct set_symmetric_difference { template struct result : detail::decay_array {}; template typename result::type operator()(R1& r1, R2& r2, O o) const { return std::set_symmetric_difference( detail::begin_(r1), detail::end_(r1) , detail::begin_(r2), detail::end_(r2) , o ); } template typename result::type operator()(R1& r1, R2& r2, O o, C c) const { return std::set_symmetric_difference( detail::begin_(r1), detail::end_(r1) , detail::begin_(r2), detail::end_(r2) , o , c ); } }; }}} // boost::phoenix::impl namespace boost { namespace phoenix { function const swap = impl::swap(); function const copy = impl::copy(); function const copy_backward = impl::copy_backward(); function const transform = impl::transform(); function const replace = impl::replace(); function const replace_if = impl::replace_if(); function const replace_copy = impl::replace_copy(); function const replace_copy_if = impl::replace_copy_if(); function const fill = impl::fill(); function const fill_n = impl::fill_n(); function const generate = impl::generate(); function const generate_n = impl::generate_n(); function const remove = impl::remove(); function const remove_if = impl::remove_if(); function const remove_copy = impl::remove_copy(); function const remove_copy_if = impl::remove_copy_if(); function const unique = impl::unique(); function const unique_copy = impl::unique_copy(); function const reverse = impl::reverse(); function const reverse_copy = impl::reverse_copy(); function const rotate = impl::rotate(); function const rotate_copy = impl::rotate_copy(); function const random_shuffle = impl::random_shuffle(); function const partition = impl::partition(); function const stable_partition = impl::stable_partition(); function const sort = impl::sort(); function const stable_sort = impl::stable_sort(); function const partial_sort = impl::partial_sort(); function const partial_sort_copy = impl::partial_sort_copy(); function const nth_element = impl::nth_element(); function const merge = impl::merge(); function const inplace_merge = impl::inplace_merge(); function const next_permutation = impl::next_permutation(); function const prev_permutation = impl::prev_permutation(); function const inner_product = impl::inner_product(); function const partial_sum = impl::partial_sum(); function const adjacent_difference = impl::adjacent_difference(); function const push_heap = impl::push_heap(); function const pop_heap = impl::pop_heap(); function const make_heap = impl::make_heap(); function const sort_heap = impl::sort_heap(); function const set_union = impl::set_union(); function const set_intersection = impl::set_intersection(); function const set_difference = impl::set_difference(); function const set_symmetric_difference = impl::set_symmetric_difference(); }} #endif