Compare commits

...

13 Commits

Author SHA1 Message Date
e59958cc4d Merge include + doc fixes to master for 1.72 release 2019-12-03 16:53:16 -08:00
a814721376 Apply PR#57 from tonyelewis to improve the docs. Thanks, Tony\! 2019-12-03 08:39:34 -08:00
9ef3df0d0b Update header files to always include boost/config.hpp. Fixes issue #61 2019-12-03 08:33:05 -08:00
44527f4c81 Algorithm: Merge example fixes master for 1.72.0 2019-12-03 07:48:39 -08:00
9093abbda9 Update examples so that they build 2019-11-27 10:58:37 -08:00
1b65b8de02 Merge bug fixes to master for 1.71 2019-07-10 15:14:08 -07:00
77bbc6ce43 Merge pull request #49 from Ben10do/feature/forwarding-references
Use forwarding references in string/split.hpp
2019-07-03 07:54:40 -07:00
0a57ec30a2 Update the apply_permutation tests to use the BOOST_CHECK_EQUAL_COLLECTIONS facilities. Based on https://github.com/boostorg/algorithm/pull/42 Thanks to Jeremy for the patch 2019-07-03 07:44:25 -07:00
9477cd8be0 Merge pull request #59 from tinko92/develop
Replace broken links (mostly in minmax) documentation
2019-04-29 11:58:43 -04:00
f39107f228 Replace broken links. 2019-04-23 13:48:19 +02:00
45baad2431 Correct lvalue/rvalue nomenclature
I accidentally referred to the additional tests as using lvalues as inputs, when they’re actually using rvalues. This commit corrects the relevant comments.
2018-08-02 22:18:54 +01:00
5408a17020 Add tests with lvalue inputs
If the compiler supports forwarding references, we now test if lvalues can be used as input strings for split(), find_all(), and ifind_all().

Note that MSVC (without its recent /permissive- flag) may pass these tests without the forwarding references changes that I made, due to its non-standard binding of lvalues to rvalues.
2018-08-01 22:42:18 +01:00
c6f784cb70 Use forwarding references in string/split.hpp
On compilers that support C++11, this allows both lvalues and rvalues to be used as inputs to the split(), find_all(), and ifind_all() functions.

For example, given a function get_string() that returns a std::string, this allows you to write:
boost::split(result, get_string(), boost::is_any_of(" "))
2018-08-01 20:54:17 +01:00
50 changed files with 370 additions and 93 deletions

View File

@ -22,6 +22,7 @@ doxygen autodoc
../../../boost/algorithm/searching/*.hpp ../../../boost/algorithm/searching/*.hpp
../../../boost/algorithm/cxx11/*.hpp ../../../boost/algorithm/cxx11/*.hpp
../../../boost/algorithm/cxx14/*.hpp ../../../boost/algorithm/cxx14/*.hpp
../../../boost/algorithm/cxx17/*.hpp
] ]
: :
<doxygen:param>"PREDEFINED=\"BOOST_ALGORITHM_DOXYGEN=1\"" <doxygen:param>"PREDEFINED=\"BOOST_ALGORITHM_DOXYGEN=1\""
@ -40,8 +41,8 @@ boostbook standalone
<xsl:param>"boost.doxygen.reftitle=Boost.Algorithms C++ Reference" <xsl:param>"boost.doxygen.reftitle=Boost.Algorithms C++ Reference"
<xsl:param>chapter.autolabel=0 <xsl:param>chapter.autolabel=0
<xsl:param>chunk.section.depth=8 <xsl:param>chunk.section.depth=8
<xsl:param>toc.section.depth=2 <xsl:param>toc.section.depth=3
<xsl:param>toc.max.depth=2 <xsl:param>toc.max.depth=3
<xsl:param>generate.section.toc.level=1 <xsl:param>generate.section.toc.level=1
; ;

View File

@ -46,7 +46,11 @@ Thanks to all the people who have reviewed this library and made suggestions for
[include knuth_morris_pratt.qbk] [include knuth_morris_pratt.qbk]
[endsect] [endsect]
[section:CXX11 C++11 Algorithms] [section:CXX11 C++11 Algorithms]
[section:CXX11_inner_algorithms]
[include all_of.qbk] [include all_of.qbk]
[include any_of.qbk] [include any_of.qbk]
[include none_of.qbk] [include none_of.qbk]
@ -55,24 +59,204 @@ Thanks to all the people who have reviewed this library and made suggestions for
[include is_partitioned.qbk] [include is_partitioned.qbk]
[include is_permutation.qbk] [include is_permutation.qbk]
[include partition_point.qbk] [include partition_point.qbk]
[endsect]
[section:partition_copy partition_copy ]
[*[^[link header.boost.algorithm.cxx11.partition_copy_hpp partition_copy] ] ]
Copy a subset of a sequence to a new sequence
[endsect:partition_copy]
[section:copy_if copy_if ]
[*[^[link header.boost.algorithm.cxx11.copy_if_hpp copy_if] ] ]
Copy a subset of a sequence to a new sequence
[endsect:copy_if]
[section:copy_n copy_n ]
[*[^[link header.boost.algorithm.cxx11.copy_n_hpp copy_n] ] ]
Copy n items from one sequence to another
[endsect:copy_n]
[section:iota iota ]
[*[^[link header.boost.algorithm.cxx11.iota_hpp iota] ] ]
Generate an increasing series
[endsect:iota]
[endsect:CXX11_inner_algorithms]
[endsect:CXX11]
[section:CXX14 C++14 Algorithms] [section:CXX14 C++14 Algorithms]
[section:CXX14_inner_algorithms]
[include equal.qbk] [include equal.qbk]
[include mismatch.qbk] [include mismatch.qbk]
[endsect]
[endsect:CXX14_inner_algorithms]
[endsect:CXX14]
[section:CXX17 C++17 Algorithms]
[section:CXX17_inner_algorithms]
[section:for_each_n for_each_n]
[*[^[link boost.algorithm.for_each_n for_each_n] ] ]
Apply a functor to the elements of a sequence
[endsect:for_each_n]
[endsect:CXX17_inner_algorithms]
[endsect:CXX17]
[section:Misc Other Algorithms] [section:Misc Other Algorithms]
[include clamp-hpp.qbk]
[include find_not.qbk]
[include find_backward.qbk]
[include gather.qbk]
[include hex.qbk]
[include is_palindrome.qbk]
[include is_partitioned_until.qbk]
[include apply_permutation.qbk]
[endsect]
[section:misc_inner_algorithms]
[section:none_of_equal none_of_equal ]
[*[^[link header.boost.algorithm.cxx11.none_of_hpp none_of_equal] ] ]
Whether none of a range's elements matches a value
[endsect:none_of_equal]
[section:one_of_equal one_of_equal ]
[*[^[link header.boost.algorithm.cxx11.one_of_hpp one_of_equal] ] ]
Whether only one of a range's elements matches a value
[endsect:one_of_equal]
[section:is_decreasing is_decreasing ]
[*[^[link header.boost.algorithm.cxx11.is_sorted_hpp is_decreasing] ] ]
Whether an entire sequence is decreasing; i.e, each item is less than or equal to the previous one
[endsect:is_decreasing]
[section:is_increasing is_increasing ]
[*[^[link header.boost.algorithm.cxx11.is_sorted_hpp is_increasing] ] ]
Whether an entire sequence is increasing; i.e, each item is greater than or equal to the previous one
[endsect:is_increasing]
[section:is_strictly_decreasing is_strictly_decreasing ]
[*[^[link header.boost.algorithm.cxx11.is_sorted_hpp is_strictly_decreasing] ] ]
Whether an entire sequence is strictly decreasing; i.e, each item is less than the previous one
[endsect:is_strictly_decreasing]
[section:is_strictly_increasing is_strictly_increasing ]
[*[^[link header.boost.algorithm.cxx11.is_sorted_hpp is_strictly_increasing] ] ]
Whether an entire sequence is strictly increasing; i.e, each item is greater than the previous one
[endsect:is_strictly_increasing]
[include clamp-hpp.qbk]
[section:clamp_range clamp_range ]
[*[^[link header.boost.algorithm.clamp_hpp clamp_range] ] ]
Perform [^clamp] on the elements of a range and write the results into an output iterator
[endsect:clamp_range]
[include find_not.qbk]
[include find_backward.qbk]
[section:find_not_backward find_not_backward ]
[*[^[link header.boost.algorithm.find_backward_hpp find_not_backward] ] ]
Find the last element in a sequence that does not equal a value.
See [link the_boost_algorithm_library.Misc.misc_inner_algorithms.find_backward find_backward].
[endsect:find_not_backward]
[section:find_if_backward find_if_backward ]
[*[^[link header.boost.algorithm.find_backward_hpp find_if_backward] ] ]
Find the last element in a sequence that satisfies a predicate.
See [link the_boost_algorithm_library.Misc.misc_inner_algorithms.find_backward find_backward].
[endsect:find_if_backward]
[section:find_if_not find_if_not ]
[*[^[link header.boost.algorithm.cxx11.find_if_not_hpp find_if_not] ] ]
Find the first element in a sequence that does not satisfy a predicate.
See [link the_boost_algorithm_library.Misc.misc_inner_algorithms.find_not find_not].
[endsect:find_if_not]
[section:find_if_not_backward find_if_not_backward ]
[*[^[link header.boost.algorithm.find_backward_hpp find_if_not_backward] ] ]
Find the last element in a sequence that does not satisfy a predicate.
See [link the_boost_algorithm_library.Misc.misc_inner_algorithms.find_backward find_backward].
[endsect:find_if_not_backward]
[include gather.qbk]
[include hex.qbk]
[section:unhex unhex ]
[*[^[link header.boost.algorithm.hex_hpp unhex] ] ]
Convert a sequence of hexadecimal characters into a sequence of integers or characters
[endsect:unhex]
[section:hex_lower hex_lower ]
[*[^[link header.boost.algorithm.hex_hpp hex_lower] ] ]
Convert a sequence of integral types into a lower case hexadecimal sequence of characters
[endsect:hex_lower]
[include is_palindrome.qbk]
[include is_partitioned_until.qbk]
[section:apply_reverse_permutation apply_reverse_permutation ]
See below
[endsect:apply_reverse_permutation]
[include apply_permutation.qbk]
[section:copy_until copy_until ]
[*[^[link header.boost.algorithm.cxx11.copy_if_hpp copy_until] ] ]
Copy all the elements at the start of the input range that do not satisfy the predicate to the output range
[endsect:copy_until]
[section:copy_while copy_while ]
[*[^[link header.boost.algorithm.cxx11.copy_if_hpp copy_while] ] ]
Copy all the elements at the start of the input range that satisfy the predicate to the output range
[endsect:copy_while]
[section:iota_n iota_n ]
[*[^[link boost.algorithm.iota_n iota_n] ] ]
Write a sequence of n increasing values to an output iterator
[endsect:iota_n]
[section:power power ]
[*[^[link header.boost.algorithm.algorithm_hpp power] ] ]
Raise a value to an integral power ([^constexpr] since C++14)
[endsect:power]
[endsect:misc_inner_algorithms]
[endsect:Misc]
[section:not_yet_documented_cxx17_algos Not-yet-documented C++17 Algorithms]
* [*[^[link header.boost.algorithm.cxx17.exclusive_scan_hpp exclusive_scan] ] ]
* [*[^[link header.boost.algorithm.cxx17.inclusive_scan_hpp inclusive_scan] ] ]
* [*[^[link header.boost.algorithm.cxx17.reduce_hpp reduce] ] ]
* [*[^[link header.boost.algorithm.cxx17.transform_exclusive_scan_hpp transform_exclusive_scan] ] ]
* [*[^[link header.boost.algorithm.cxx17.transform_inclusive_scan_hpp transform_inclusive_scan] ] ]
* [*[^[link header.boost.algorithm.cxx17.transform_reduce_hpp transform_reduce] ] ]
[endsect:not_yet_documented_cxx17_algos]
[section:not_yet_documented_other_algos Not-yet-documented Other Algorithms]
* [*[^[link header.boost.algorithm.minmax_hpp minmax] ] ]
* [*[^[link header.boost.algorithm.minmax_element_hpp first_max_element] ] ]
* [*[^[link header.boost.algorithm.minmax_element_hpp first_min_element] ] ]
* [*[^[link header.boost.algorithm.minmax_element_hpp first_min_first_max_element] ] ]
* [*[^[link header.boost.algorithm.minmax_element_hpp first_min_last_max_element] ] ]
* [*[^[link header.boost.algorithm.minmax_element_hpp last_max_element] ] ]
* [*[^[link header.boost.algorithm.minmax_element_hpp last_min_element] ] ]
* [*[^[link header.boost.algorithm.minmax_element_hpp last_min_first_max_element] ] ]
* [*[^[link header.boost.algorithm.minmax_element_hpp last_min_last_max_element] ] ]
* [*[^[link header.boost.algorithm.minmax_element_hpp minmax_element] ] ]
* [*[^[link header.boost.algorithm.sort_subrange_hpp partition_subrange] ] ]
* [*[^[link header.boost.algorithm.sort_subrange_hpp sort_subrange] ] ]
[endsect:not_yet_documented_other_algos]
[xinclude autodoc.xml] [xinclude autodoc.xml]

View File

@ -9,7 +9,7 @@ Distributed under 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) (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
] ]
The header file 'apply_permutation.hpp' contains two algorithms, apply_permutation and apply_reverse_permutation. Also there are range-based versions. The header file [^[link header.boost.algorithm.apply_permutation_hpp apply_permutation.hpp]] contains two algorithms, `apply_permutation` and `apply_reverse_permutation`. There are also range-based versions.
The algorithms transform the item sequence according to index sequence order. The algorithms transform the item sequence according to index sequence order.
The routine `apply_permutation` takes a item sequence and a order sequence. It reshuffles item sequence according to order sequence. Every value in order sequence means where the item comes from. Order sequence needs to be exactly a permutation of the sequence [0, 1, ... , N], where N is the biggest index in the item sequence (zero-indexed). The routine `apply_permutation` takes a item sequence and a order sequence. It reshuffles item sequence according to order sequence. Every value in order sequence means where the item comes from. Order sequence needs to be exactly a permutation of the sequence [0, 1, ... , N], where N is the biggest index in the item sequence (zero-indexed).

View File

@ -18,8 +18,8 @@ project /boost/algorithm/example
: :
; ;
exe clamp_example : clamp_example.cpp ; exe clamp_example : clamp_example.cpp : ;
exe search_example : search_example.cpp ; exe search_example : search_example.cpp ;
exe is_palindrome_example : is_palindrome_example.cpp; exe is_palindrome_example : is_palindrome_example.cpp : <cxxstd>11 ;
exe is_partitioned_until_example : is_partitioned_until_example.cpp; exe is_partitioned_until_example : is_partitioned_until_example.cpp : <cxxstd>11 ;
exe apply_permutation_example : apply_permutation_example.cpp; exe apply_permutation_example : apply_permutation_example.cpp : <cxxstd>11 ;

View File

@ -32,8 +32,8 @@ struct isOddComp
int main ( int /*argc*/, char * /*argv*/ [] ) int main ( int /*argc*/, char * /*argv*/ [] )
{ {
std::vector<int> good({1, 2, 4}); std::vector<int> good{1, 2, 4};
std::vector<int> bad({1, 2, 3}); std::vector<int> bad{1, 2, 3};
//Use custom function //Use custom function
auto it1 = ba::is_partitioned_until(good.begin(), good.end(), isOdd); auto it1 = ba::is_partitioned_until(good.begin(), good.end(), isOdd);

View File

@ -27,7 +27,7 @@ int main ( int /*argc*/, char * /*argv*/ [] ) {
// algorithms. They all have the same (dual) interface. // algorithms. They all have the same (dual) interface.
// There is a procedural interface, based on std::search: // There is a procedural interface, based on std::search:
if ( ba::boyer_moore_search ( haystack.begin (), haystack.end (), needle1.begin (), needle1.end ()) != haystack.end ()) if ( ba::boyer_moore_search ( haystack.begin (), haystack.end (), needle1.begin (), needle1.end ()) != std::make_pair(haystack.end(), haystack.end()))
std::cout << "Found '" << needle1 << "' in '" << haystack << "' (boyer-moore 1)" << std::endl; std::cout << "Found '" << needle1 << "' in '" << haystack << "' (boyer-moore 1)" << std::endl;
else else
std::cout << "Did NOT find '" << needle1 << "' in '" << haystack << "' (boyer-moore 1)" << std::endl; std::cout << "Did NOT find '" << needle1 << "' in '" << haystack << "' (boyer-moore 1)" << std::endl;
@ -36,19 +36,19 @@ int main ( int /*argc*/, char * /*argv*/ [] ) {
// you can create a search object and use that over and over again - amortizing the setup // you can create a search object and use that over and over again - amortizing the setup
// costs across several searches // costs across several searches
ba::boyer_moore<std::string::const_iterator> search1 ( needle1.begin (), needle1.end ()); ba::boyer_moore<std::string::const_iterator> search1 ( needle1.begin (), needle1.end ());
if ( search1 ( haystack.begin (), haystack.end ()) != haystack.end ()) if ( search1 ( haystack.begin (), haystack.end ()) != std::make_pair(haystack.end(), haystack.end()))
std::cout << "Found '" << needle1 << "' in '" << haystack << "' (boyer-moore 2)" << std::endl; std::cout << "Found '" << needle1 << "' in '" << haystack << "' (boyer-moore 2)" << std::endl;
else else
std::cout << "Did NOT find '" << needle1 << "' in '" << haystack << "' (boyer-moore 2)" << std::endl; std::cout << "Did NOT find '" << needle1 << "' in '" << haystack << "' (boyer-moore 2)" << std::endl;
// There is also an implementation of boyer-moore-horspool searching // There is also an implementation of boyer-moore-horspool searching
if ( ba::boyer_moore_horspool_search ( haystack.begin (), haystack.end (), needle1.begin (), needle1.end ()) != haystack.end ()) if ( ba::boyer_moore_horspool_search ( haystack.begin (), haystack.end (), needle1.begin (), needle1.end ()) != std::make_pair(haystack.end(), haystack.end()))
std::cout << "Found '" << needle1 << "' in '" << haystack << "' (boyer-moore-horspool)" << std::endl; std::cout << "Found '" << needle1 << "' in '" << haystack << "' (boyer-moore-horspool)" << std::endl;
else else
std::cout << "Did NOT find '" << needle1 << "' in '" << haystack << "' (boyer-moore-horspool)" << std::endl; std::cout << "Did NOT find '" << needle1 << "' in '" << haystack << "' (boyer-moore-horspool)" << std::endl;
// And also the knuth-pratt-morris search algorithm // And also the knuth-pratt-morris search algorithm
if ( ba::knuth_morris_pratt_search ( haystack.begin (), haystack.end (), needle1.begin (), needle1.end ()) != haystack.end ()) if ( ba::knuth_morris_pratt_search ( haystack.begin (), haystack.end (), needle1.begin (), needle1.end ()) != std::make_pair(haystack.end(), haystack.end()))
std::cout << "Found '" << needle1 << "' in '" << haystack << "' (knuth_morris_pratt)" << std::endl; std::cout << "Found '" << needle1 << "' in '" << haystack << "' (knuth_morris_pratt)" << std::endl;
else else
std::cout << "Did NOT find '" << needle1 << "' in '" << haystack << "' (knuth_morris_pratt)" << std::endl; std::cout << "Did NOT find '" << needle1 << "' in '" << haystack << "' (knuth_morris_pratt)" << std::endl;

View File

@ -19,6 +19,7 @@
#include <functional> // for plus and multiplies #include <functional> // for plus and multiplies
#include <boost/config.hpp>
#include <boost/utility/enable_if.hpp> // for boost::disable_if #include <boost/utility/enable_if.hpp> // for boost::disable_if
#include <boost/type_traits/is_integral.hpp> #include <boost/type_traits/is_integral.hpp>

View File

@ -21,6 +21,7 @@
#include <algorithm> #include <algorithm>
#include <type_traits> #include <type_traits>
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -23,6 +23,7 @@
#include <iterator> // For std::iterator_traits #include <iterator> // For std::iterator_traits
#include <cassert> #include <cassert>
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/mpl/identity.hpp> // for identity #include <boost/mpl/identity.hpp> // for identity

View File

@ -12,6 +12,7 @@
#ifndef BOOST_ALGORITHM_ALL_OF_HPP #ifndef BOOST_ALGORITHM_ALL_OF_HPP
#define BOOST_ALGORITHM_ALL_OF_HPP #define BOOST_ALGORITHM_ALL_OF_HPP
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -14,6 +14,7 @@
#ifndef BOOST_ALGORITHM_ANY_OF_HPP #ifndef BOOST_ALGORITHM_ANY_OF_HPP
#define BOOST_ALGORITHM_ANY_OF_HPP #define BOOST_ALGORITHM_ANY_OF_HPP
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -13,6 +13,8 @@
#define BOOST_ALGORITHM_COPY_IF_HPP #define BOOST_ALGORITHM_COPY_IF_HPP
#include <utility> // for std::pair, std::make_pair #include <utility> // for std::pair, std::make_pair
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -12,6 +12,8 @@
#ifndef BOOST_ALGORITHM_COPY_N_HPP #ifndef BOOST_ALGORITHM_COPY_N_HPP
#define BOOST_ALGORITHM_COPY_N_HPP #define BOOST_ALGORITHM_COPY_N_HPP
#include <boost/config.hpp>
namespace boost { namespace algorithm { namespace boost { namespace algorithm {
/// \fn copy_n ( InputIterator first, Size n, OutputIterator result ) /// \fn copy_n ( InputIterator first, Size n, OutputIterator result )

View File

@ -12,6 +12,7 @@
#ifndef BOOST_ALGORITHM_FIND_IF_NOT_HPP #ifndef BOOST_ALGORITHM_FIND_IF_NOT_HPP
#define BOOST_ALGORITHM_FIND_IF_NOT_HPP #define BOOST_ALGORITHM_FIND_IF_NOT_HPP
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -12,6 +12,7 @@
#ifndef BOOST_ALGORITHM_IOTA_HPP #ifndef BOOST_ALGORITHM_IOTA_HPP
#define BOOST_ALGORITHM_IOTA_HPP #define BOOST_ALGORITHM_IOTA_HPP
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -12,6 +12,7 @@
#ifndef BOOST_ALGORITHM_IS_PARTITIONED_HPP #ifndef BOOST_ALGORITHM_IS_PARTITIONED_HPP
#define BOOST_ALGORITHM_IS_PARTITIONED_HPP #define BOOST_ALGORITHM_IS_PARTITIONED_HPP
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -17,6 +17,7 @@
#include <functional> // for std::equal_to #include <functional> // for std::equal_to
#include <iterator> #include <iterator>
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/utility/enable_if.hpp> #include <boost/utility/enable_if.hpp>

View File

@ -16,6 +16,7 @@
#include <functional> #include <functional>
#include <iterator> #include <iterator>
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -12,6 +12,7 @@
#ifndef BOOST_ALGORITHM_NONE_OF_HPP #ifndef BOOST_ALGORITHM_NONE_OF_HPP
#define BOOST_ALGORITHM_NONE_OF_HPP #define BOOST_ALGORITHM_NONE_OF_HPP
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -12,11 +12,13 @@
#ifndef BOOST_ALGORITHM_ONE_OF_HPP #ifndef BOOST_ALGORITHM_ONE_OF_HPP
#define BOOST_ALGORITHM_ONE_OF_HPP #define BOOST_ALGORITHM_ONE_OF_HPP
#include <boost/algorithm/cxx11/none_of.hpp> #include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/algorithm/cxx11/none_of.hpp>
namespace boost { namespace algorithm { namespace boost { namespace algorithm {
/// \fn one_of ( InputIterator first, InputIterator last, Predicate p ) /// \fn one_of ( InputIterator first, InputIterator last, Predicate p )

View File

@ -14,6 +14,7 @@
#include <iterator> // for std::distance, advance #include <iterator> // for std::distance, advance
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -14,6 +14,8 @@
#include <iterator> #include <iterator>
#include <boost/config.hpp>
namespace boost { namespace algorithm { namespace boost { namespace algorithm {
namespace detail { namespace detail {

View File

@ -16,6 +16,7 @@
#include <functional> // for std::equal_to #include <functional> // for std::equal_to
#include <iterator> #include <iterator>
#include <boost/config.hpp>
#include <boost/algorithm/cxx11/is_permutation.hpp> #include <boost/algorithm/cxx11/is_permutation.hpp>
#include <boost/algorithm/cxx14/mismatch.hpp> #include <boost/algorithm/cxx14/mismatch.hpp>

View File

@ -13,6 +13,7 @@
#define BOOST_ALGORITHM_MISMATCH_HPP #define BOOST_ALGORITHM_MISMATCH_HPP
#include <utility> // for std::pair #include <utility> // for std::pair
#include <boost/config.hpp> #include <boost/config.hpp>
namespace boost { namespace algorithm { namespace boost { namespace algorithm {

View File

@ -15,6 +15,7 @@
#include <functional> // for std::plus #include <functional> // for std::plus
#include <iterator> // for std::iterator_traits #include <iterator> // for std::iterator_traits
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/value_type.hpp> #include <boost/range/value_type.hpp>

View File

@ -14,6 +14,8 @@
#include <utility> // for std::pair #include <utility> // for std::pair
#include <boost/config.hpp>
namespace boost { namespace algorithm { namespace boost { namespace algorithm {
/// \fn for_each_n(InputIterator first, Size n, Function f); /// \fn for_each_n(InputIterator first, Size n, Function f);

View File

@ -15,6 +15,7 @@
#include <functional> // for std::plus #include <functional> // for std::plus
#include <iterator> // for std::iterator_traits #include <iterator> // for std::iterator_traits
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/value_type.hpp> #include <boost/range/value_type.hpp>

View File

@ -15,6 +15,7 @@
#include <functional> // for std::plus #include <functional> // for std::plus
#include <iterator> // for std::iterator_traits #include <iterator> // for std::iterator_traits
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/value_type.hpp> #include <boost/range/value_type.hpp>

View File

@ -15,6 +15,7 @@
#include <functional> // for std::plus #include <functional> // for std::plus
#include <iterator> // for std::iterator_traits #include <iterator> // for std::iterator_traits
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/value_type.hpp> #include <boost/range/value_type.hpp>

View File

@ -15,6 +15,7 @@
#include <functional> // for std::plus #include <functional> // for std::plus
#include <iterator> // for std::iterator_traits #include <iterator> // for std::iterator_traits
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/value_type.hpp> #include <boost/range/value_type.hpp>

View File

@ -15,6 +15,7 @@
#include <functional> // for std::plus #include <functional> // for std::plus
#include <iterator> // for std::iterator_traits #include <iterator> // for std::iterator_traits
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/range/value_type.hpp> #include <boost/range/value_type.hpp>

View File

@ -2,18 +2,17 @@
Copyright (c) T. Zachary Laine 2018. Copyright (c) T. Zachary Laine 2018.
Distributed under the Boost Software License, Version 1.0. (See accompanying Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE10.txt or copy at http://www.boost.org/LICENSE10.txt) file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
*/ */
#ifndef BOOST_ALGORITHM_FIND_BACKWARD_HPP #ifndef BOOST_ALGORITHM_FIND_BACKWARD_HPP
#define BOOST_ALGORITHM_FIND_BACKWARD_HPP #define BOOST_ALGORITHM_FIND_BACKWARD_HPP
#include <utility>
#include <boost/config.hpp> #include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <utility>
namespace boost { namespace algorithm { namespace boost { namespace algorithm {
template<typename BidiIter, typename T> template<typename BidiIter, typename T>

View File

@ -2,18 +2,17 @@
Copyright (c) T. Zachary Laine 2018. Copyright (c) T. Zachary Laine 2018.
Distributed under the Boost Software License, Version 1.0. (See accompanying Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE10.txt or copy at http://www.boost.org/LICENSE10.txt) file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
*/ */
#ifndef BOOST_ALGORITHM_FIND_NOT_HPP #ifndef BOOST_ALGORITHM_FIND_NOT_HPP
#define BOOST_ALGORITHM_FIND_NOT_HPP #define BOOST_ALGORITHM_FIND_NOT_HPP
#include <utility>
#include <boost/config.hpp> #include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <utility>
namespace boost { namespace algorithm { namespace boost { namespace algorithm {
template<typename InputIter, typename Sentinel, typename T> template<typename InputIter, typename Sentinel, typename T>

View File

@ -23,6 +23,7 @@
#include <algorithm> // for std::stable_partition #include <algorithm> // for std::stable_partition
#include <functional> #include <functional>
#include <boost/config.hpp>
#include <boost/bind.hpp> // for boost::bind #include <boost/bind.hpp> // for boost::bind
#include <boost/range/begin.hpp> // for boost::begin(range) #include <boost/range/begin.hpp> // for boost::begin(range)
#include <boost/range/end.hpp> // for boost::end(range) #include <boost/range/end.hpp> // for boost::end(range)

View File

@ -23,6 +23,7 @@
#include <iterator> // for std::iterator_traits #include <iterator> // for std::iterator_traits
#include <stdexcept> #include <stdexcept>
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>
#include <boost/exception/exception.hpp> #include <boost/exception/exception.hpp>

View File

@ -19,6 +19,7 @@
#include <functional> #include <functional>
#include <cstring> #include <cstring>
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -12,6 +12,7 @@
#ifndef BOOST_ALGORITHM_IS_PARTITIONED_UNTIL_HPP #ifndef BOOST_ALGORITHM_IS_PARTITIONED_UNTIL_HPP
#define BOOST_ALGORITHM_IS_PARTITIONED_UNTIL_HPP #define BOOST_ALGORITHM_IS_PARTITIONED_UNTIL_HPP
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -25,6 +25,7 @@
* *
*/ */
#include <boost/config.hpp>
#include <boost/tuple/tuple.hpp> // for using pairs with boost::cref #include <boost/tuple/tuple.hpp> // for using pairs with boost::cref
#include <boost/ref.hpp> #include <boost/ref.hpp>

View File

@ -28,6 +28,8 @@
#include <utility> // for std::pair and std::make_pair #include <utility> // for std::pair and std::make_pair
#include <boost/config.hpp>
namespace boost { namespace boost {
namespace detail { // for obtaining a uniform version of minmax_element namespace detail { // for obtaining a uniform version of minmax_element

View File

@ -12,6 +12,7 @@
#include <iterator> // for std::iterator_traits #include <iterator> // for std::iterator_traits
#include <boost/config.hpp>
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/static_assert.hpp> #include <boost/static_assert.hpp>

View File

@ -12,6 +12,7 @@
#include <iterator> // for std::iterator_traits #include <iterator> // for std::iterator_traits
#include <boost/config.hpp>
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/static_assert.hpp> #include <boost/static_assert.hpp>

View File

@ -13,6 +13,7 @@
#include <vector> #include <vector>
#include <iterator> // for std::iterator_traits #include <iterator> // for std::iterator_traits
#include <boost/config.hpp>
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/static_assert.hpp> #include <boost/static_assert.hpp>

View File

@ -22,6 +22,7 @@
#include <iterator> // For std::iterator_traits #include <iterator> // For std::iterator_traits
#include <algorithm> // For nth_element and partial_sort #include <algorithm> // For nth_element and partial_sort
#include <boost/config.hpp>
#include <boost/range/begin.hpp> #include <boost/range/begin.hpp>
#include <boost/range/end.hpp> #include <boost/range/end.hpp>

View File

@ -71,7 +71,11 @@ namespace boost {
inline SequenceSequenceT& inline SequenceSequenceT&
iter_find( iter_find(
SequenceSequenceT& Result, SequenceSequenceT& Result,
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
RangeT&& Input,
#else
RangeT& Input, RangeT& Input,
#endif
FinderT Finder ) FinderT Finder )
{ {
BOOST_CONCEPT_ASSERT(( BOOST_CONCEPT_ASSERT((
@ -142,7 +146,11 @@ namespace boost {
inline SequenceSequenceT& inline SequenceSequenceT&
iter_split( iter_split(
SequenceSequenceT& Result, SequenceSequenceT& Result,
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
RangeT&& Input,
#else
RangeT& Input, RangeT& Input,
#endif
FinderT Finder ) FinderT Finder )
{ {
BOOST_CONCEPT_ASSERT(( BOOST_CONCEPT_ASSERT((

View File

@ -61,7 +61,11 @@ namespace boost {
template< typename SequenceSequenceT, typename Range1T, typename Range2T > template< typename SequenceSequenceT, typename Range1T, typename Range2T >
inline SequenceSequenceT& find_all( inline SequenceSequenceT& find_all(
SequenceSequenceT& Result, SequenceSequenceT& Result,
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
Range1T&& Input,
#else
Range1T& Input, Range1T& Input,
#endif
const Range2T& Search) const Range2T& Search)
{ {
return ::boost::algorithm::iter_find( return ::boost::algorithm::iter_find(
@ -96,7 +100,11 @@ namespace boost {
template< typename SequenceSequenceT, typename Range1T, typename Range2T > template< typename SequenceSequenceT, typename Range1T, typename Range2T >
inline SequenceSequenceT& ifind_all( inline SequenceSequenceT& ifind_all(
SequenceSequenceT& Result, SequenceSequenceT& Result,
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
Range1T&& Input,
#else
Range1T& Input, Range1T& Input,
#endif
const Range2T& Search, const Range2T& Search,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
@ -139,7 +147,11 @@ namespace boost {
template< typename SequenceSequenceT, typename RangeT, typename PredicateT > template< typename SequenceSequenceT, typename RangeT, typename PredicateT >
inline SequenceSequenceT& split( inline SequenceSequenceT& split(
SequenceSequenceT& Result, SequenceSequenceT& Result,
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
RangeT&& Input,
#else
RangeT& Input, RangeT& Input,
#endif
PredicateT Pred, PredicateT Pred,
token_compress_mode_type eCompress=token_compress_off ) token_compress_mode_type eCompress=token_compress_off )
{ {

View File

@ -24,7 +24,7 @@ namespace boost {
tuple&lt;T const&amp;, T const&amp;> > tuple&lt;T const&amp;, T const&amp;> >
minmax(const T&amp; a, const T&amp; b); minmax(const T&amp; a, const T&amp; b);
template &lt;class T, class <a href="http://www.sgi.com/tech/stl/ BinaryPredicate.html">BinaryPredicate</a>> template &lt;class T, class <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">BinaryPredicate</a>>
tuple&lt;T const&amp;, T const&amp;> > tuple&lt;T const&amp;, T const&amp;> >
minmax(const T&amp; a, const T&amp; b, BinaryPredicate comp); minmax(const T&amp; a, const T&amp; b, BinaryPredicate comp);
@ -38,77 +38,77 @@ Synopsis of <tt>&lt;boost/algorithm/minmax_element.hpp></tt></h3>
namespace boost { namespace boost {
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>>
std::pair&lt;ForwardIterator,ForwardIterator> std::pair&lt;ForwardIterator,ForwardIterator>
minmax_element(ForwardIterator first, ForwardIterator last); minmax_element(ForwardIterator first, ForwardIterator last);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">BinaryPredicate</a>>
std::pair&lt;ForwardIterator,ForwardIterator> std::pair&lt;ForwardIterator,ForwardIterator>
minmax_element(ForwardIterator first, ForwardIterator last, minmax_element(ForwardIterator first, ForwardIterator last,
BinaryPredicate comp); BinaryPredicate comp);
// Variants // Variants
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>>
ForwardIterator first_min_element(ForwardIterator first, ForwardIterator last); ForwardIterator first_min_element(ForwardIterator first, ForwardIterator last);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">BinaryPredicate</a>>
ForwardIterator first_min_element(ForwardIterator first, ForwardIterator last, ForwardIterator first_min_element(ForwardIterator first, ForwardIterator last,
BinaryPredicate comp); BinaryPredicate comp);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>>
ForwardIterator last_min_element(ForwardIterator first, ForwardIterator last); ForwardIterator last_min_element(ForwardIterator first, ForwardIterator last);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">BinaryPredicate</a>>
ForwardIterator last_min_element(ForwardIterator first, ForwardIterator last, ForwardIterator last_min_element(ForwardIterator first, ForwardIterator last,
BinaryPredicate comp); BinaryPredicate comp);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>>
ForwardIterator first_max_element(ForwardIterator first, ForwardIterator last); ForwardIterator first_max_element(ForwardIterator first, ForwardIterator last);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">BinaryPredicate</a>>
ForwardIterator first_max_element(ForwardIterator first, ForwardIterator last, ForwardIterator first_max_element(ForwardIterator first, ForwardIterator last,
BinaryPredicate comp); BinaryPredicate comp);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>>
ForwardIterator last_max_element(ForwardIterator first, ForwardIterator last); ForwardIterator last_max_element(ForwardIterator first, ForwardIterator last);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">BinaryPredicate</a>>
ForwardIterator last_max_element(ForwardIterator first, ForwardIterator last, ForwardIterator last_max_element(ForwardIterator first, ForwardIterator last,
BinaryPredicate comp); BinaryPredicate comp);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>>
std::pair&lt;ForwardIterator,ForwardIterator> std::pair&lt;ForwardIterator,ForwardIterator>
first_min_first_max_element(ForwardIterator first, ForwardIterator last); first_min_first_max_element(ForwardIterator first, ForwardIterator last);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">BinaryPredicate</a>>
std::pair&lt;ForwardIterator,ForwardIterator> std::pair&lt;ForwardIterator,ForwardIterator>
first_min_first_max_element(ForwardIterator first, ForwardIterator last, first_min_first_max_element(ForwardIterator first, ForwardIterator last,
BinaryPredicate comp); BinaryPredicate comp);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>>
std::pair&lt;ForwardIterator,ForwardIterator> std::pair&lt;ForwardIterator,ForwardIterator>
first_min_last_max_element(ForwardIterator first, ForwardIterator last); first_min_last_max_element(ForwardIterator first, ForwardIterator last);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">BinaryPredicate</a>>
std::pair&lt;ForwardIterator,ForwardIterator> std::pair&lt;ForwardIterator,ForwardIterator>
first_min_last_max_element(ForwardIterator first, ForwardIterator last, first_min_last_max_element(ForwardIterator first, ForwardIterator last,
BinaryPredicate comp); BinaryPredicate comp);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>>
std::pair&lt;ForwardIterator,ForwardIterator> std::pair&lt;ForwardIterator,ForwardIterator>
last_min_first_max_element(ForwardIterator first, ForwardIterator last); last_min_first_max_element(ForwardIterator first, ForwardIterator last);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">BinaryPredicate</a>>
std::pair&lt;ForwardIterator,ForwardIterator> std::pair&lt;ForwardIterator,ForwardIterator>
last_min_first_max_element(ForwardIterator first, ForwardIterator last, last_min_first_max_element(ForwardIterator first, ForwardIterator last,
BinaryPredicate comp); BinaryPredicate comp);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>>
std::pair&lt;ForwardIterator,ForwardIterator> std::pair&lt;ForwardIterator,ForwardIterator>
last_min_last_max_element(ForwardIterator first, ForwardIterator last); last_min_last_max_element(ForwardIterator first, ForwardIterator last);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">BinaryPredicate</a>>
std::pair&lt;ForwardIterator,ForwardIterator> std::pair&lt;ForwardIterator,ForwardIterator>
last_min_last_max_element(ForwardIterator first, ForwardIterator last, last_min_last_max_element(ForwardIterator first, ForwardIterator last,
BinaryPredicate comp); BinaryPredicate comp);

View File

@ -95,7 +95,7 @@ namespace boost {
tuple&lt;T const&amp;, T const&amp;> tuple&lt;T const&amp;, T const&amp;>
minmax(const T&amp; a, const T&amp; b); minmax(const T&amp; a, const T&amp; b);
template &lt;class T, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>> template &lt;class T, class <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">BinaryPredicate</a>>
tuple&lt;T const&amp;, T const&amp;> tuple&lt;T const&amp;, T const&amp;>
minmax(const T&amp; a, const T&amp; b, BinaryPredicate comp); minmax(const T&amp; a, const T&amp; b, BinaryPredicate comp);
@ -109,11 +109,11 @@ Synopsis of <tt>&lt;boost/algorithm/minmax_element.hpp></tt></h3>
namespace boost { namespace boost {
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>>
std::pair&lt;ForwardIterator,ForwardIterator> std::pair&lt;ForwardIterator,ForwardIterator>
minmax_element(ForwardIterator first, ForwardIterator last); minmax_element(ForwardIterator first, ForwardIterator last);
template &lt;class <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>> template &lt;class <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">ForwardIterator</a>, class <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">BinaryPredicate</a>>
std::pair&lt;ForwardIterator,ForwardIterator> std::pair&lt;ForwardIterator,ForwardIterator>
minmax_element(ForwardIterator first, ForwardIterator last, minmax_element(ForwardIterator first, ForwardIterator last,
BinaryPredicate comp); BinaryPredicate comp);
@ -190,26 +190,26 @@ in <a href="../../../boost/algorithm/minmax_element.hpp">minmax_element.hpp</a>.
<a name="reqs"> <a name="reqs">
<h3> <h3>
Requirements on types</h3> Requirements on types</h3>
For minmax, <tt>T</tt> must be a model of <a href="http://www.sgi.com/tech/stl/LessThanComparable.html">LessThan For minmax, <tt>T</tt> must be a model of <a href="https://www.boost.org/sgi/stl/LessThanComparable.html">LessThan
Comparable</a>. Comparable</a>.
<p>For all the other function templates, versions with two template parameters: <p>For all the other function templates, versions with two template parameters:
<ul> <ul>
<li> <li>
<tt>ForwardIterator</tt> is a model of <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">Forward <tt>ForwardIterator</tt> is a model of <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">Forward
Iterator</a>.</li> Iterator</a>.</li>
<li> <li>
<tt>ForwardIterator</tt>'s value type is <a href="http://www.sgi.com/tech/stl/LessThanComparable.html">LessThan <tt>ForwardIterator</tt>'s value type is <a href="https://www.boost.org/sgi/stl/LessThanComparable.html">LessThan
Comparable</a>.</li> Comparable</a>.</li>
</ul> </ul>
For the versions with three template parameters: For the versions with three template parameters:
<ul> <ul>
<li> <li>
<tt>ForwardIterator</tt> is a model of <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">Forward <tt>ForwardIterator</tt> is a model of <a href="https://www.boost.org/sgi/stl/ForwardIterator.html">Forward
Iterator</a>.</li> Iterator</a>.</li>
<li> <li>
<tt>BinaryPredicate</tt> is a model of <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">Binary <tt>BinaryPredicate</tt> is a model of <a href="https://www.boost.org/sgi/stl/BinaryPredicate.html">Binary
Predicate</a>.</li> Predicate</a>.</li>
<li> <li>
@ -285,8 +285,8 @@ the library under
assert( result1.get<0>() == 0 ); assert( result1.get<0>() == 0 );
assert( result1.get<1>() == 1 ); assert( result1.get<1>() == 1 );
<a href="http://www.sgi.com/tech/stl/List.html">list</a>&lt;int> L; <a href="https://www.boost.org/sgi/stl/List.html">list</a>&lt;int> L;
<a href="http://www.sgi.com/tech/stl/generate_n.html">generate_n</a>(<a href="http://www.sgi.com/tech/stl/front_insert_iterator.html">front_inserter</a>(L), 1000, rand); <a href="https://www.boost.org/sgi/stl/generate_n.html">generate_n</a>(<a href="https://www.boost.org/sgi/stl/front_insert_iterator.html">front_inserter</a>(L), 1000, rand);
typedef list&lt;int>::const_iterator iterator; typedef list&lt;int>::const_iterator iterator;
pair&lt; iterator, iterator > result2 = boost::minmax_element(L.begin(), L.end()); pair&lt; iterator, iterator > result2 = boost::minmax_element(L.begin(), L.end());
@ -512,13 +512,13 @@ release, Eric Niebler noted the bad behavior of <tt>std::pair</tt> for
All my thanks for the excellent advice and reviews from all. All my thanks for the excellent advice and reviews from all.
<h3> <h3>
See also</h3> See also</h3>
<tt><a href="http://www.sgi.com/tech/stl/min.html">min</a></tt>, <tt><a href="http://www.sgi.com/tech/stl/max.html">max</a></tt>, <tt><a href="https://www.boost.org/sgi/stl/min.html">min</a></tt>, <tt><a href="https://www.boost.org/sgi/stl/max.html">max</a></tt>,
<tt><a href="http://www.sgi.com/tech/stl/min_element.html">min_element</a></tt>, <tt><a href="https://www.boost.org/sgi/stl/min_element.html">min_element</a></tt>,
<tt><a href="http://www.sgi.com/tech/stl/max_element.html">max_element</a></tt>, <tt><a href="https://www.boost.org/sgi/stl/max_element.html">max_element</a></tt>,
<tt><a href="http://www.sgi.com/tech/stl/LessThanComparable.html">LessThan <tt><a href="https://www.boost.org/sgi/stl/LessThanComparable.html">LessThan
Comparable</a></tt>, Comparable</a></tt>,
<tt><a href="http://www.sgi.com/tech/stl/sort.html">sort</a></tt>, <tt><a href="https://www.boost.org/sgi/stl/sort.html">sort</a></tt>,
<tt><a href="http://www.sgi.com/tech/stl/nth_element.html">nth_element</a></tt> <tt><a href="https://www.boost.org/sgi/stl/nth_element.html">nth_element</a></tt>
. .
<hr SIZE="6"> <hr SIZE="6">
<br>Last modified 2012-12-10 <br>Last modified 2012-12-10

View File

@ -31,7 +31,7 @@
typedef <i>implementation defined </i> foo_type;</code><p >The corresponding external concept is the ExternalFooConcept.</p><p >A type <code>T</code> fullfills the ExternalFooConcept if these typedef <i>implementation defined </i> foo_type;</code><p >The corresponding external concept is the ExternalFooConcept.</p><p >A type <code>T</code> fullfills the ExternalFooConcept if these
free-standing functions and type-generators exists:</p><code>void foo( const T&, int ); <br> free-standing functions and type-generators exists:</p><code>void foo( const T&, int ); <br>
int bar( T& ); <br> int bar( T& ); <br>
foo_type_of< T >::type;</code> <br> <br><hr size="1" ><h3 >Literature</h3><ul ><li > <a href="http://www.boost.org/more/generic_programming.html#type_generator" target="_self" >Type Generators</a> </li><li > <a href="http://www.boost.org/more/generic_programming.html#concept" target="_self" >Concepts</a> </li><li > <a href="http://www.sgi.com/tech/stl/stl_introduction.html" target="_self" >Concepts and SGI STL</a> </li></ul><hr size="1" ><p >&copy; Thorsten Ottosen 2003-2004 (nesotto_AT_cs.auc.dk). foo_type_of< T >::type;</code> <br> <br><hr size="1" ><h3 >Literature</h3><ul ><li > <a href="http://www.boost.org/more/generic_programming.html#type_generator" target="_self" >Type Generators</a> </li><li > <a href="http://www.boost.org/more/generic_programming.html#concept" target="_self" >Concepts</a> </li><li > <a href="https://www.boost.org/sgi/stl/stl_introduction.html" target="_self" >Concepts and SGI STL</a> </li></ul><hr size="1" ><p >&copy; Thorsten Ottosen 2003-2004 (nesotto_AT_cs.auc.dk).
<br>Use, modification and distribution is subject to the Boost <br>Use, modification and distribution is subject to the Boost
Software License, Version 1.0. (See accompanying file Software License, Version 1.0. (See accompanying file
<code class="filename">LICENSE_1_0.txt</code> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) <code class="filename">LICENSE_1_0.txt</code> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)

View File

@ -7,6 +7,8 @@
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org for updates, documentation, and revision history.
#include <boost/algorithm/string/config.hpp>
#include <boost/algorithm/string/split.hpp> #include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp> #include <boost/algorithm/string/classification.hpp>
// equals predicate is used for result comparison // equals predicate is used for result comparison
@ -82,6 +84,28 @@ void iterator_test()
string("xx") ); string("xx") );
deep_compare( tokens, vtokens ); deep_compare( tokens, vtokens );
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
// If using a compiler that supports forwarding references, we should be able to use rvalues, too
find_all(
tokens,
string("xx-abc--xx-abb"),
"xx" );
BOOST_REQUIRE( tokens.size()==2 );
BOOST_CHECK( tokens[0]==string("xx") );
BOOST_CHECK( tokens[1]==string("xx") );
ifind_all(
tokens,
string("Xx-abc--xX-abb-xx"),
"xx" );
BOOST_REQUIRE( tokens.size()==3 );
BOOST_CHECK( tokens[0]==string("Xx") );
BOOST_CHECK( tokens[1]==string("xX") );
BOOST_CHECK( tokens[2]==string("xx") );
#endif
// split tests // split tests
split( split(
tokens, tokens,
@ -144,6 +168,21 @@ void iterator_test()
BOOST_REQUIRE( tokens.size()==1 ); BOOST_REQUIRE( tokens.size()==1 );
BOOST_CHECK( tokens[0]==string("") ); BOOST_CHECK( tokens[0]==string("") );
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
// If using a compiler that supports forwarding references, we should be able to use rvalues, too
split(
tokens,
string("Xx-abc--xX-abb-xx"),
is_any_of("xX"),
token_compress_on );
BOOST_REQUIRE( tokens.size()==4 );
BOOST_CHECK( tokens[0]==string("") );
BOOST_CHECK( tokens[1]==string("-abc--") );
BOOST_CHECK( tokens[2]==string("-abb-") );
BOOST_CHECK( tokens[3]==string("") );
#endif
find_iterator<string::iterator> fiter=make_find_iterator(str1, first_finder("xx")); find_iterator<string::iterator> fiter=make_find_iterator(str1, first_finder("xx"));
find_iterator<string::iterator> fiter2; find_iterator<string::iterator> fiter2;

View File

@ -14,19 +14,19 @@
#define BOOST_TEST_MAIN #define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp> #include <boost/test/included/unit_test.hpp>
namespace ba = boost::algorithm; namespace ba = boost::algorithm;
void test_apply_permutation() BOOST_AUTO_TEST_CASE(test_apply_permutation)
{ {
//Empty //Empty
{ {
std::vector<int> vec, order, result; std::vector<int> vec, order, result;
ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end()); ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
//1 element //1 element
{ {
@ -36,7 +36,7 @@ void test_apply_permutation()
result = vec; result = vec;
ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end()); ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
//2 elements, no changes //2 elements, no changes
{ {
@ -46,7 +46,7 @@ void test_apply_permutation()
result = vec; result = vec;
ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end()); ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
//2 elements, changed //2 elements, changed
{ {
@ -56,7 +56,7 @@ void test_apply_permutation()
result.push_back(2); result.push_back(1); result.push_back(2); result.push_back(1);
ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end()); ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
//Multiple elements, no changes //Multiple elements, no changes
{ {
@ -66,7 +66,7 @@ void test_apply_permutation()
result = vec; result = vec;
ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end()); ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
//Multiple elements, changed //Multiple elements, changed
{ {
@ -76,7 +76,7 @@ void test_apply_permutation()
result.push_back(5); result.push_back(4); result.push_back(3); result.push_back(2); result.push_back(1); result.push_back(5); result.push_back(4); result.push_back(3); result.push_back(2); result.push_back(1);
ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end()); ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
//Just test range interface //Just test range interface
{ {
@ -86,18 +86,18 @@ void test_apply_permutation()
result = vec; result = vec;
ba::apply_permutation(vec, order); ba::apply_permutation(vec, order);
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
} }
void test_apply_reverse_permutation() BOOST_AUTO_TEST_CASE(test_apply_reverse_permutation)
{ {
//Empty //Empty
{ {
std::vector<int> vec, order, result; std::vector<int> vec, order, result;
ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end()); ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
//1 element //1 element
{ {
@ -107,7 +107,7 @@ void test_apply_reverse_permutation()
result = vec; result = vec;
ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end()); ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
//2 elements, no changes //2 elements, no changes
{ {
@ -117,7 +117,7 @@ void test_apply_reverse_permutation()
result = vec; result = vec;
ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end()); ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
//2 elements, changed //2 elements, changed
{ {
@ -127,7 +127,7 @@ void test_apply_reverse_permutation()
result.push_back(2); result.push_back(1); result.push_back(2); result.push_back(1);
ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end()); ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
//Multiple elements, no changes //Multiple elements, no changes
{ {
@ -137,7 +137,7 @@ void test_apply_reverse_permutation()
result = vec; result = vec;
ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end()); ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
//Multiple elements, changed //Multiple elements, changed
{ {
@ -147,7 +147,7 @@ void test_apply_reverse_permutation()
result.push_back(5); result.push_back(4); result.push_back(3); result.push_back(2); result.push_back(1); result.push_back(5); result.push_back(4); result.push_back(3); result.push_back(2); result.push_back(1);
ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end()); ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
//Just test range interface //Just test range interface
{ {
@ -157,12 +157,6 @@ void test_apply_reverse_permutation()
result = vec; result = vec;
ba::apply_reverse_permutation(vec, order); ba::apply_reverse_permutation(vec, order);
BOOST_CHECK(vec == result); BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
} }
} }
BOOST_AUTO_TEST_CASE(test_main)
{
test_apply_permutation();
test_apply_reverse_permutation();
}