Chris@16: // -- algorithm.hpp -- Boost Lambda Library ----------------------------------- Chris@16: // Copyright (C) 2002 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi) Chris@16: // Copyright (C) 2002 Gary Powell (gwpowell@hotmail.com) Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // For more information, see http://www.boost.org Chris@16: Chris@16: #ifndef BOOST_LAMBDA_ALGORITHM_HPP Chris@16: #define BOOST_LAMBDA_ALGORITHM_HPP Chris@16: Chris@16: #include "boost/lambda/core.hpp" Chris@16: Chris@16: #include Chris@16: #include // for iterator_traits Chris@16: #include // for std::pair Chris@16: Chris@16: namespace boost { Chris@16: namespace lambda { Chris@16: Chris@16: namespace ll { Chris@16: Chris@16: // for_each --------------------------------- Chris@16: Chris@16: struct for_each { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::for_each(a, b, c); } Chris@16: }; Chris@16: Chris@16: // find --------------------------------- Chris@16: Chris@16: struct find { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, const C& c) const Chris@16: { return ::std::find(a, b, c); } Chris@16: }; Chris@16: Chris@16: Chris@16: // find_if --------------------------------- Chris@16: Chris@16: struct find_if { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::find_if(a, b, c); } Chris@16: }; Chris@16: Chris@16: // find_end --------------------------------- Chris@16: Chris@16: struct find_end { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c, C d) const Chris@16: { return ::std::find_end(a, b, c, d); } Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c, C d, E e) const Chris@16: { return ::std::find_end(a, b, c, d, e); } Chris@16: Chris@16: }; Chris@16: Chris@16: // find_first_of --------------------------------- Chris@16: Chris@16: struct find_first_of { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c, C d) const Chris@16: { return ::std::find_first_of(a, b, c, d); } Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c, C d, E e) const Chris@16: { return ::std::find_first_of(a, b, c, d, e); } Chris@16: Chris@16: }; Chris@16: Chris@16: // adjacent_find --------------------------------- Chris@16: Chris@16: struct adjacent_find { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b) const Chris@16: { return ::std::adjacent_find(a, b); } Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::adjacent_find(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // count --------------------------------- Chris@16: Chris@16: struct count { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename ::std::iterator_traits< Chris@16: typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type Chris@16: >::difference_type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: typename ::std::iterator_traits::difference_type Chris@16: operator()(A a, A b, const C& c) const Chris@16: { return ::std::count(a, b, c); } Chris@16: }; Chris@16: Chris@16: // count_if --------------------------------- Chris@16: Chris@16: struct count_if { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename ::std::iterator_traits< Chris@16: typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type Chris@16: >::difference_type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: typename ::std::iterator_traits::difference_type Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::count_if(a, b, c); } Chris@16: }; Chris@16: Chris@16: Chris@16: // mismatch --------------------------------- Chris@16: Chris@16: struct mismatch { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type element1_type; Chris@16: Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type element2_type; Chris@16: Chris@16: typedef ::std::pair< element1_type, element2_type > type; Chris@16: }; Chris@16: Chris@16: template Chris@16: ::std::pair Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::mismatch(a, b, c); } Chris@16: Chris@16: template Chris@16: ::std::pair Chris@16: operator()(A a, A b, C c, D d) const Chris@16: { return ::std::mismatch(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // equal --------------------------------- Chris@16: Chris@16: struct equal { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef bool type; Chris@16: }; Chris@16: Chris@16: template Chris@16: bool Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::equal(a, b, c); } Chris@16: Chris@16: template Chris@16: bool Chris@16: operator()(A a, A b, C c, D d) const Chris@16: { return ::std::equal(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // search -------------------------------- Chris@16: Chris@16: struct search { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c, C d) const Chris@16: { return std::search(a, b, c, d);} Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c, C d, E e) const Chris@16: { return std::search(a, b, c, d, e);} Chris@16: Chris@16: }; Chris@16: Chris@16: // copy --------------------------------- Chris@16: Chris@16: struct copy { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::copy(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // copy_backward --------------------------------- Chris@16: Chris@16: struct copy_backward { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::copy_backward(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // swap --------------------------------- Chris@16: Chris@16: struct swap { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b) const Chris@16: { ::std::swap(a, b); } Chris@16: Chris@16: }; Chris@16: Chris@16: // swap_ranges --------------------------------- Chris@16: Chris@16: struct swap_ranges { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::swap_ranges(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // iter_swap --------------------------------- Chris@16: Chris@16: struct iter_swap { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b) const Chris@16: { ::std::iter_swap(a, b); } Chris@16: Chris@16: }; Chris@16: Chris@16: Chris@16: // transform -------------------------------- Chris@16: Chris@16: struct transform { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element< Chris@16: boost::tuples::length::value - 2, Chris@16: Args Chris@16: >::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c, D d) const Chris@16: { return std::transform(a, b, c, d);} Chris@16: Chris@16: template Chris@16: D Chris@16: operator()(A a, A b, C c, D d, E e) const Chris@16: { return std::transform(a, b, c, d, e);} Chris@16: Chris@16: }; Chris@16: Chris@16: // replace --------------------------------- Chris@16: Chris@16: struct replace { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, const C& c, const C& d) const Chris@16: { ::std::replace(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // replace_if --------------------------------- Chris@16: Chris@16: struct replace_if { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, C c, const D& d) const Chris@16: { ::std::replace_if(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // replace_copy --------------------------------- Chris@16: Chris@16: struct replace_copy { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c, const D& d, const D& e) const Chris@16: { return ::std::replace_copy(a, b, c, d, e); } Chris@16: Chris@16: }; Chris@16: Chris@16: // replace_copy_if --------------------------------- Chris@16: Chris@16: struct replace_copy_if { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c, D d, const E& e) const Chris@16: { return ::std::replace_copy_if(a, b, c, d, e); } Chris@16: Chris@16: }; Chris@16: Chris@16: // fill --------------------------------- Chris@16: Chris@16: struct fill { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, const C& c) const Chris@16: { ::std::fill(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // fill_n --------------------------------- Chris@16: Chris@16: struct fill_n { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, B b, const C& c) const Chris@16: { ::std::fill_n(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // generate --------------------------------- Chris@16: Chris@16: struct generate { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, C c) const Chris@16: { ::std::generate(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // generate_n --------------------------------- Chris@16: Chris@16: struct generate_n { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, B b, C c) const Chris@16: { ::std::generate_n(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // remove --------------------------------- Chris@16: Chris@16: struct remove { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, const C& c) const Chris@16: { return ::std::remove(a, b, c); } Chris@16: }; Chris@16: Chris@16: // remove_if --------------------------------- Chris@16: Chris@16: struct remove_if { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::remove_if(a, b, c); } Chris@16: }; Chris@16: Chris@16: // remove_copy --------------------------------- Chris@16: Chris@16: struct remove_copy { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c, const D& d) const Chris@16: { return ::std::remove_copy(a, b, c, d); } Chris@16: }; Chris@16: Chris@16: // remove_copy_if --------------------------------- Chris@16: Chris@16: struct remove_copy_if { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c, D d) const Chris@16: { return ::std::remove_copy_if(a, b, c, d); } Chris@16: }; Chris@16: Chris@16: // unique --------------------------------- Chris@16: Chris@16: struct unique { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b) const Chris@16: { return ::std::unique(a, b); } Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::unique(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // unique_copy --------------------------------- Chris@16: Chris@16: struct unique_copy { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::unique_copy(a, b, c); } Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c, D d) const Chris@16: { return ::std::unique_copy(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // reverse --------------------------------- Chris@16: Chris@16: struct reverse { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b) const Chris@16: { ::std::reverse(a, b); } Chris@16: Chris@16: }; Chris@16: Chris@16: // reverse_copy --------------------------------- Chris@16: Chris@16: struct reverse_copy { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::reverse_copy(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // rotate --------------------------------- Chris@16: Chris@16: struct rotate { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, A c) const Chris@16: { ::std::rotate(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // rotate_copy --------------------------------- Chris@16: Chris@16: struct rotate_copy { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: D Chris@16: operator()(A a, A b, A c, D d) const Chris@16: { return ::std::rotate_copy(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // random_shuffle --------------------------------- Chris@16: Chris@16: struct random_shuffle { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b) const Chris@16: { ::std::random_shuffle(a, b); } Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, const C& c) const Chris@16: { ::std::random_shuffle(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: Chris@16: // partition --------------------------------- Chris@16: Chris@16: struct partition { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::partition(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // stable_partition --------------------------------- Chris@16: Chris@16: struct stable_partition { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::stable_partition(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // sort --------------------------------- Chris@16: Chris@16: struct sort { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b) const Chris@16: { ::std::sort(a, b); } Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, C c) const Chris@16: { ::std::sort(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // stable_sort --------------------------------- Chris@16: Chris@16: struct stable_sort { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b) const Chris@16: { ::std::stable_sort(a, b); } Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, C c) const Chris@16: { ::std::stable_sort(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // partial_sort --------------------------------- Chris@16: Chris@16: struct partial_sort { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, A c) const Chris@16: { ::std::partial_sort(a, b, c); } Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, A c, D d) const Chris@16: { ::std::partial_sort(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // partial_sort_copy --------------------------------- Chris@16: Chris@16: struct partial_sort_copy { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<3, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c, C d) const Chris@16: { return ::std::partial_sort_copy(a, b, c, d); } Chris@16: Chris@16: template Chris@16: C Chris@16: operator()(A a, A b, C c, C d, E e) const Chris@16: { return ::std::partial_sort_copy(a, b, c, d, e); } Chris@16: }; Chris@16: Chris@16: // nth_element --------------------------------- Chris@16: Chris@16: struct nth_element { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, A c) const Chris@16: { ::std::nth_element(a, b, c); } Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, A c, D d) const Chris@16: { ::std::nth_element(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // lower_bound --------------------------------- Chris@16: Chris@16: struct lower_bound { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, const C& c) const Chris@16: { return ::std::lower_bound(a, b, c); } Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, const C& c, D d) const Chris@16: { return ::std::lower_bound(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // upper_bound --------------------------------- Chris@16: Chris@16: struct upper_bound { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, const C& c) const Chris@16: { return ::std::upper_bound(a, b, c); } Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, const C& c, D d) const Chris@16: { return ::std::upper_bound(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // equal_range --------------------------------- Chris@16: Chris@16: struct equal_range { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type element_type; Chris@16: Chris@16: typedef ::std::pair< element_type, element_type > type; Chris@16: }; Chris@16: Chris@16: template Chris@16: ::std::pair Chris@16: operator()(A a, A b, const C& c) const Chris@16: { return ::std::equal_range(a, b, c); } Chris@16: Chris@16: template Chris@16: ::std::pair Chris@16: operator()(A a, A b, const C& c, D d) const Chris@16: { return ::std::equal_range(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // binary_search --------------------------------- Chris@16: Chris@16: struct binary_search { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef bool type; Chris@16: }; Chris@16: Chris@16: template Chris@16: bool Chris@16: operator()(A a, A b, const C& c) const Chris@16: { return ::std::binary_search(a, b, c); } Chris@16: Chris@16: template Chris@16: bool Chris@16: operator()(A a, A b, const C& c, D d) const Chris@16: { return ::std::binary_search(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // merge -------------------------------- Chris@16: Chris@16: struct merge { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<5, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: E Chris@16: operator()(A a, A b, C c, C d, E e) const Chris@16: { return std::merge(a, b, c, d, e);} Chris@16: Chris@16: template Chris@16: E Chris@16: operator()(A a, A b, C c, C d, E e, F f) const Chris@16: { return std::merge(a, b, c, d, e, f);} Chris@16: Chris@16: }; Chris@16: Chris@16: // inplace_merge --------------------------------- Chris@16: Chris@16: struct inplace_merge { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, A c) const Chris@16: { ::std::inplace_merge(a, b, c); } Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, A c, D d) const Chris@16: { ::std::inplace_merge(a, b, c, d); } Chris@16: Chris@16: }; Chris@16: Chris@16: // includes --------------------------------- Chris@16: Chris@16: struct includes { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef bool type; Chris@16: }; Chris@16: Chris@16: template Chris@16: bool Chris@16: operator()(A a, A b, C c, C d) const Chris@16: { return ::std::includes(a, b, c, d); } Chris@16: Chris@16: template Chris@16: bool Chris@16: operator()(A a, A b, C c, C d, E e) const Chris@16: { return ::std::includes(a, b, c, d, e); } Chris@16: Chris@16: }; Chris@16: Chris@16: // set_union -------------------------------- Chris@16: Chris@16: struct set_union { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<5, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: E Chris@16: operator()(A a, A b, C c, C d, E e) const Chris@16: { return std::set_union(a, b, c, d, e);} Chris@16: Chris@16: template Chris@16: E Chris@16: operator()(A a, A b, C c, C d, E e, F f) const Chris@16: { return std::set_union(a, b, c, d, e, f);} Chris@16: Chris@16: }; Chris@16: Chris@16: // set_intersection -------------------------------- Chris@16: Chris@16: struct set_intersection { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<5, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: E Chris@16: operator()(A a, A b, C c, C d, E e) const Chris@16: { return std::set_intersection(a, b, c, d, e);} Chris@16: Chris@16: template Chris@16: E Chris@16: operator()(A a, A b, C c, C d, E e, F f) const Chris@16: { return std::set_intersection(a, b, c, d, e, f);} Chris@16: Chris@16: }; Chris@16: Chris@16: // set_difference -------------------------------- Chris@16: Chris@16: struct set_difference { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<5, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: E Chris@16: operator()(A a, A b, C c, C d, E e) const Chris@16: { return std::set_difference(a, b, c, d, e);} Chris@16: Chris@16: template Chris@16: E Chris@16: operator()(A a, A b, C c, C d, E e, F f) const Chris@16: { return std::set_difference(a, b, c, d, e, f);} Chris@16: Chris@16: }; Chris@16: Chris@16: Chris@16: // set_symmetric_difference -------------------------------- Chris@16: Chris@16: struct set_symmetric_difference { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<5, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: E Chris@16: operator()(A a, A b, C c, C d, E e) const Chris@16: { return std::set_symmetric_difference(a, b, c, d, e);} Chris@16: Chris@16: template Chris@16: E Chris@16: operator()(A a, A b, C c, C d, E e, F f) const Chris@16: { return std::set_symmetric_difference(a, b, c, d, e, f);} Chris@16: Chris@16: }; Chris@16: Chris@16: // push_heap --------------------------------- Chris@16: Chris@16: struct push_heap { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b) const Chris@16: { ::std::push_heap(a, b); } Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, C c) const Chris@16: { ::std::push_heap(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // pop_heap --------------------------------- Chris@16: Chris@16: struct pop_heap { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b) const Chris@16: { ::std::pop_heap(a, b); } Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, C c) const Chris@16: { ::std::pop_heap(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: Chris@16: // make_heap --------------------------------- Chris@16: Chris@16: struct make_heap { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b) const Chris@16: { ::std::make_heap(a, b); } Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, C c) const Chris@16: { ::std::make_heap(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // sort_heap --------------------------------- Chris@16: Chris@16: struct sort_heap { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef void type; Chris@16: }; Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b) const Chris@16: { ::std::sort_heap(a, b); } Chris@16: Chris@16: template Chris@16: void Chris@16: operator()(A a, A b, C c) const Chris@16: { ::std::sort_heap(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // min --------------------------------- Chris@16: Chris@16: struct min { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(const A& a, const A& b) const Chris@16: { return (::std::min)(a, b); } Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(const A& a, const A& b, C c) const Chris@16: { return (::std::min)(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // max --------------------------------- Chris@16: Chris@16: struct max { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(const A& a, const A& b) const Chris@16: { return (::std::max)(a, b); } Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(const A& a, const A& b, C c) const Chris@16: { return (::std::max)(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: struct min_element { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b) const Chris@16: { return ::std::min_element(a, b); } Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::min_element(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // max_element --------------------------------- Chris@16: Chris@16: struct max_element { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef typename boost::remove_const< Chris@16: typename boost::tuples::element<1, Args>::type Chris@16: >::type type; Chris@16: }; Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b) const Chris@16: { return ::std::max_element(a, b); } Chris@16: Chris@16: template Chris@16: A Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::max_element(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: Chris@16: // lexicographical_compare --------------------------------- Chris@16: Chris@16: struct lexicographical_compare { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef bool type; Chris@16: }; Chris@16: Chris@16: template Chris@16: bool Chris@16: operator()(A a, A b, C c, C d) const Chris@16: { return ::std::lexicographical_compare(a, b, c, d); } Chris@16: Chris@16: template Chris@16: bool Chris@16: operator()(A a, A b, C c, C d, E e) const Chris@16: { return ::std::lexicographical_compare(a, b, c, d, e); } Chris@16: Chris@16: }; Chris@16: Chris@16: // next_permutation --------------------------------- Chris@16: Chris@16: struct next_permutation { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef bool type; Chris@16: }; Chris@16: Chris@16: template Chris@16: bool Chris@16: operator()(A a, A b) const Chris@16: { return ::std::next_permutation(a, b); } Chris@16: Chris@16: template Chris@16: bool Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::next_permutation(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: // prev_permutation --------------------------------- Chris@16: Chris@16: struct prev_permutation { Chris@16: Chris@16: template Chris@16: struct sig { Chris@16: typedef bool type; Chris@16: }; Chris@16: Chris@16: template Chris@16: bool Chris@16: operator()(A a, A b) const Chris@16: { return ::std::prev_permutation(a, b); } Chris@16: Chris@16: template Chris@16: bool Chris@16: operator()(A a, A b, C c) const Chris@16: { return ::std::prev_permutation(a, b, c); } Chris@16: Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: } // end of ll namespace Chris@16: Chris@16: // There is no good way to call an overloaded member function in a Chris@16: // lambda expression. Chris@16: // The macro below defines a function object class for calling a Chris@16: // const_iterator returning member function of a container. Chris@16: Chris@16: #define CALL_MEMBER(X) \ Chris@16: struct call_##X { \ Chris@16: template \ Chris@16: struct sig { \ Chris@16: typedef typename boost::remove_const< \ Chris@16: typename boost::tuples::element<1, Args>::type \ Chris@16: >::type::const_iterator type; \ Chris@16: }; \ Chris@16: \ Chris@16: template \ Chris@16: typename T::const_iterator \ Chris@16: operator()(const T& t) const \ Chris@16: { \ Chris@16: return t.X(); \ Chris@16: } \ Chris@16: }; Chris@16: Chris@16: // create call_begin and call_end classes Chris@16: CALL_MEMBER(begin) Chris@16: CALL_MEMBER(end) Chris@16: Chris@16: #undef CALL_MEMBER Chris@16: Chris@16: } // end of lambda namespace Chris@16: } // end of boost namespace Chris@16: Chris@16: Chris@16: Chris@16: #endif