forked from boostorg/algorithm
		
	Merge pull request #35 from very-cool-name/apolukhin/constexpr
Apolukhin/constexpr
This commit is contained in:
		| @@ -40,7 +40,7 @@ T identity_operation ( std::plus<T> ) { return T(0); } | ||||
| //  \remark Taken from Knuth, The Art of Computer Programming, Volume 2: | ||||
| //  Seminumerical Algorithms, Section 4.6.3 | ||||
| template <typename T, typename Integer> | ||||
| typename boost::enable_if<boost::is_integral<Integer>, T>::type | ||||
| BOOST_CXX14_CONSTEXPR typename boost::enable_if<boost::is_integral<Integer>, T>::type | ||||
| power (T x, Integer n) { | ||||
|     T y = 1; // Should be "T y{1};"  | ||||
|     if (n == 0) return y; | ||||
| @@ -67,7 +67,7 @@ power (T x, Integer n) { | ||||
| //  \remark Taken from Knuth, The Art of Computer Programming, Volume 2: | ||||
| //  Seminumerical Algorithms, Section 4.6.3 | ||||
| template <typename T, typename Integer, typename Operation> | ||||
| typename boost::enable_if<boost::is_integral<Integer>, T>::type | ||||
| BOOST_CXX14_CONSTEXPR typename boost::enable_if<boost::is_integral<Integer>, T>::type | ||||
| power (T x, Integer n, Operation op) { | ||||
|     T y = identity_operation(op); | ||||
|     if (n == 0) return y; | ||||
|   | ||||
| @@ -46,7 +46,7 @@ namespace boost { namespace algorithm { | ||||
| ///                 p ( a, b ) returns a boolean. | ||||
| /// | ||||
|   template<typename T, typename Pred>  | ||||
|   T const & clamp ( T const& val,  | ||||
|   BOOST_CXX14_CONSTEXPR T const & clamp ( T const& val,  | ||||
|     typename boost::mpl::identity<T>::type const & lo,  | ||||
|     typename boost::mpl::identity<T>::type const & hi, Pred p ) | ||||
|   { | ||||
| @@ -68,7 +68,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param hi    The upper bound of the range to be clamped to | ||||
| /// | ||||
|   template<typename T>  | ||||
|   T const& clamp ( const T& val,  | ||||
|   BOOST_CXX14_CONSTEXPR T const& clamp ( const T& val,  | ||||
|     typename boost::mpl::identity<T>::type const & lo,  | ||||
|     typename boost::mpl::identity<T>::type const & hi ) | ||||
|   { | ||||
| @@ -87,7 +87,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param hi    The upper bound of the range to be clamped to | ||||
| /// | ||||
|   template<typename InputIterator, typename OutputIterator>  | ||||
|   OutputIterator clamp_range ( InputIterator first, InputIterator last, OutputIterator out, | ||||
|   BOOST_CXX14_CONSTEXPR OutputIterator clamp_range ( InputIterator first, InputIterator last, OutputIterator out, | ||||
|     typename std::iterator_traits<InputIterator>::value_type const & lo,  | ||||
|     typename std::iterator_traits<InputIterator>::value_type const & hi ) | ||||
|   { | ||||
| @@ -108,7 +108,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param hi    The upper bound of the range to be clamped to | ||||
| /// | ||||
|   template<typename Range, typename OutputIterator>  | ||||
|   typename boost::disable_if_c<boost::is_same<Range, OutputIterator>::value, OutputIterator>::type | ||||
|   BOOST_CXX14_CONSTEXPR typename boost::disable_if_c<boost::is_same<Range, OutputIterator>::value, OutputIterator>::type | ||||
|   clamp_range ( const Range &r, OutputIterator out, | ||||
|     typename std::iterator_traits<typename boost::range_iterator<const Range>::type>::value_type const & lo,  | ||||
|     typename std::iterator_traits<typename boost::range_iterator<const Range>::type>::value_type const & hi ) | ||||
| @@ -133,7 +133,7 @@ namespace boost { namespace algorithm { | ||||
|  | ||||
| /// | ||||
|   template<typename InputIterator, typename OutputIterator, typename Pred>  | ||||
|   OutputIterator clamp_range ( InputIterator first, InputIterator last, OutputIterator out, | ||||
|   BOOST_CXX14_CONSTEXPR OutputIterator clamp_range ( InputIterator first, InputIterator last, OutputIterator out, | ||||
|     typename std::iterator_traits<InputIterator>::value_type const & lo,  | ||||
|     typename std::iterator_traits<InputIterator>::value_type const & hi, Pred p ) | ||||
|   { | ||||
| @@ -160,7 +160,7 @@ namespace boost { namespace algorithm { | ||||
| //  Disable this template if the first two parameters are the same type; | ||||
| //  In that case, the user will get the two iterator version. | ||||
|   template<typename Range, typename OutputIterator, typename Pred>  | ||||
|   typename boost::disable_if_c<boost::is_same<Range, OutputIterator>::value, OutputIterator>::type | ||||
|   BOOST_CXX14_CONSTEXPR typename boost::disable_if_c<boost::is_same<Range, OutputIterator>::value, OutputIterator>::type | ||||
|   clamp_range ( const Range &r, OutputIterator out, | ||||
|     typename std::iterator_traits<typename boost::range_iterator<const Range>::type>::value_type const & lo,  | ||||
|     typename std::iterator_traits<typename boost::range_iterator<const Range>::type>::value_type const & hi, | ||||
|   | ||||
| @@ -27,7 +27,7 @@ namespace boost { namespace algorithm { | ||||
| /// | ||||
| /// \note           This function is part of the C++2011 standard library. | ||||
| template<typename InputIterator, typename Predicate>  | ||||
| bool all_of ( InputIterator first, InputIterator last, Predicate p ) | ||||
| BOOST_CXX14_CONSTEXPR bool all_of ( InputIterator first, InputIterator last, Predicate p ) | ||||
| { | ||||
|     for ( ; first != last; ++first ) | ||||
|         if ( !p(*first))  | ||||
| @@ -43,7 +43,7 @@ bool all_of ( InputIterator first, InputIterator last, Predicate p ) | ||||
| /// \param p    A predicate for testing the elements of the range | ||||
| /// | ||||
| template<typename Range, typename Predicate>  | ||||
| bool all_of ( const Range &r, Predicate p ) | ||||
| BOOST_CXX14_CONSTEXPR bool all_of ( const Range &r, Predicate p ) | ||||
| { | ||||
|     return boost::algorithm::all_of ( boost::begin (r), boost::end (r), p ); | ||||
| }  | ||||
| @@ -57,7 +57,7 @@ bool all_of ( const Range &r, Predicate p ) | ||||
| /// \param val   A value to compare against | ||||
| /// | ||||
| template<typename InputIterator, typename T>  | ||||
| bool all_of_equal ( InputIterator first, InputIterator last, const T &val ) | ||||
| BOOST_CXX14_CONSTEXPR bool all_of_equal ( InputIterator first, InputIterator last, const T &val ) | ||||
| { | ||||
|     for ( ; first != last; ++first ) | ||||
|     if ( val != *first )  | ||||
| @@ -73,7 +73,7 @@ bool all_of_equal ( InputIterator first, InputIterator last, const T &val ) | ||||
| /// \param val  A value to compare against | ||||
| /// | ||||
| template<typename Range, typename T>  | ||||
| bool all_of_equal ( const Range &r, const T &val )  | ||||
| BOOST_CXX14_CONSTEXPR bool all_of_equal ( const Range &r, const T &val )  | ||||
| { | ||||
|     return boost::algorithm::all_of_equal ( boost::begin (r), boost::end (r), val ); | ||||
| }  | ||||
|   | ||||
| @@ -28,7 +28,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param p     A predicate for testing the elements of the sequence | ||||
| /// | ||||
| template<typename InputIterator, typename Predicate>  | ||||
| bool any_of ( InputIterator first, InputIterator last, Predicate p )  | ||||
| BOOST_CXX14_CONSTEXPR bool any_of ( InputIterator first, InputIterator last, Predicate p )  | ||||
| { | ||||
|     for ( ; first != last; ++first ) | ||||
|         if ( p(*first))  | ||||
| @@ -44,7 +44,7 @@ bool any_of ( InputIterator first, InputIterator last, Predicate p ) | ||||
| /// \param p    A predicate for testing the elements of the range | ||||
| /// | ||||
| template<typename Range, typename Predicate>  | ||||
| bool any_of ( const Range &r, Predicate p ) | ||||
| BOOST_CXX14_CONSTEXPR bool any_of ( const Range &r, Predicate p ) | ||||
| { | ||||
|     return boost::algorithm::any_of (boost::begin (r), boost::end (r), p); | ||||
| }  | ||||
| @@ -58,7 +58,7 @@ bool any_of ( const Range &r, Predicate p ) | ||||
| /// \param val   A value to compare against | ||||
| /// | ||||
| template<typename InputIterator, typename V>  | ||||
| bool any_of_equal ( InputIterator first, InputIterator last, const V &val )  | ||||
| BOOST_CXX14_CONSTEXPR bool any_of_equal ( InputIterator first, InputIterator last, const V &val )  | ||||
| { | ||||
|     for ( ; first != last; ++first ) | ||||
|         if ( val == *first ) | ||||
| @@ -74,7 +74,7 @@ bool any_of_equal ( InputIterator first, InputIterator last, const V &val ) | ||||
| /// \param val   A value to compare against | ||||
| /// | ||||
| template<typename Range, typename V>  | ||||
| bool any_of_equal ( const Range &r, const V &val )  | ||||
| BOOST_CXX14_CONSTEXPR bool any_of_equal ( const Range &r, const V &val )  | ||||
| { | ||||
|     return boost::algorithm::any_of_equal (boost::begin (r), boost::end (r), val); | ||||
| } | ||||
|   | ||||
| @@ -29,7 +29,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param p        A predicate for testing the elements of the range | ||||
| /// \note           This function is part of the C++2011 standard library. | ||||
| template<typename InputIterator, typename OutputIterator, typename Predicate>  | ||||
| OutputIterator copy_if ( InputIterator first, InputIterator last, OutputIterator result, Predicate p ) | ||||
| BOOST_CXX14_CONSTEXPR OutputIterator copy_if ( InputIterator first, InputIterator last, OutputIterator result, Predicate p ) | ||||
| { | ||||
|     for ( ; first != last; ++first ) | ||||
|         if (p(*first)) | ||||
| @@ -47,7 +47,7 @@ OutputIterator copy_if ( InputIterator first, InputIterator last, OutputIterator | ||||
| /// \param p        A predicate for testing the elements of the range | ||||
| /// | ||||
| template<typename Range, typename OutputIterator, typename Predicate> | ||||
| OutputIterator copy_if ( const Range &r, OutputIterator result, Predicate p ) | ||||
| BOOST_CXX14_CONSTEXPR OutputIterator copy_if ( const Range &r, OutputIterator result, Predicate p ) | ||||
| { | ||||
|     return boost::algorithm::copy_if (boost::begin (r), boost::end(r), result, p); | ||||
| } | ||||
| @@ -64,7 +64,7 @@ OutputIterator copy_if ( const Range &r, OutputIterator result, Predicate p ) | ||||
| /// \param p        A predicate for testing the elements of the range | ||||
| /// | ||||
| template<typename InputIterator, typename OutputIterator, typename Predicate>  | ||||
| std::pair<InputIterator, OutputIterator> | ||||
| BOOST_CXX14_CONSTEXPR std::pair<InputIterator, OutputIterator> | ||||
| copy_while ( InputIterator first, InputIterator last, OutputIterator result, Predicate p ) | ||||
| { | ||||
|     for ( ; first != last && p(*first); ++first ) | ||||
| @@ -82,7 +82,7 @@ copy_while ( InputIterator first, InputIterator last, OutputIterator result, Pre | ||||
| /// \param p        A predicate for testing the elements of the range | ||||
| /// | ||||
| template<typename Range, typename OutputIterator, typename Predicate> | ||||
| std::pair<typename boost::range_iterator<const Range>::type, OutputIterator>  | ||||
| BOOST_CXX14_CONSTEXPR std::pair<typename boost::range_iterator<const Range>::type, OutputIterator>  | ||||
| copy_while ( const Range &r, OutputIterator result, Predicate p ) | ||||
| { | ||||
|     return boost::algorithm::copy_while (boost::begin (r), boost::end(r), result, p); | ||||
| @@ -100,7 +100,7 @@ copy_while ( const Range &r, OutputIterator result, Predicate p ) | ||||
| /// \param p        A predicate for testing the elements of the range | ||||
| /// | ||||
| template<typename InputIterator, typename OutputIterator, typename Predicate>  | ||||
| std::pair<InputIterator, OutputIterator> | ||||
| BOOST_CXX14_CONSTEXPR std::pair<InputIterator, OutputIterator> | ||||
| copy_until ( InputIterator first, InputIterator last, OutputIterator result, Predicate p ) | ||||
| { | ||||
|     for ( ; first != last && !p(*first); ++first ) | ||||
| @@ -118,7 +118,7 @@ copy_until ( InputIterator first, InputIterator last, OutputIterator result, Pre | ||||
| /// \param p        A predicate for testing the elements of the range | ||||
| /// | ||||
| template<typename Range, typename OutputIterator, typename Predicate> | ||||
| std::pair<typename boost::range_iterator<const Range>::type, OutputIterator>  | ||||
| BOOST_CXX14_CONSTEXPR std::pair<typename boost::range_iterator<const Range>::type, OutputIterator>  | ||||
| copy_until ( const Range &r, OutputIterator result, Predicate p ) | ||||
| { | ||||
|     return boost::algorithm::copy_until (boost::begin (r), boost::end(r), result, p); | ||||
|   | ||||
| @@ -24,7 +24,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param result   An output iterator to write the results into | ||||
| /// \note           This function is part of the C++2011 standard library. | ||||
| template <typename InputIterator, typename Size, typename OutputIterator> | ||||
| OutputIterator copy_n ( InputIterator first, Size n, OutputIterator result ) | ||||
| BOOST_CXX14_CONSTEXPR OutputIterator copy_n ( InputIterator first, Size n, OutputIterator result ) | ||||
| { | ||||
|     for ( ; n > 0; --n, ++first, ++result ) | ||||
|         *result = *first; | ||||
|   | ||||
| @@ -26,7 +26,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param p        A predicate for testing the elements of the range | ||||
| /// \note           This function is part of the C++2011 standard library. | ||||
| template<typename InputIterator, typename Predicate>  | ||||
| InputIterator find_if_not ( InputIterator first, InputIterator last, Predicate p ) | ||||
| BOOST_CXX14_CONSTEXPR InputIterator find_if_not ( InputIterator first, InputIterator last, Predicate p ) | ||||
| { | ||||
|     for ( ; first != last; ++first ) | ||||
|         if ( !p(*first)) | ||||
| @@ -42,7 +42,7 @@ InputIterator find_if_not ( InputIterator first, InputIterator last, Predicate p | ||||
| /// \param p        A predicate for testing the elements of the range | ||||
| /// | ||||
| template<typename Range, typename Predicate> | ||||
| typename boost::range_iterator<const Range>::type find_if_not ( const Range &r, Predicate p ) | ||||
| BOOST_CXX14_CONSTEXPR typename boost::range_iterator<const Range>::type find_if_not ( const Range &r, Predicate p ) | ||||
| { | ||||
|     return boost::algorithm::find_if_not (boost::begin (r), boost::end(r), p); | ||||
| } | ||||
|   | ||||
| @@ -25,7 +25,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param value    The initial value of the sequence to be generated | ||||
| /// \note           This function is part of the C++2011 standard library. | ||||
| template <typename ForwardIterator, typename T> | ||||
| void iota ( ForwardIterator first, ForwardIterator last, T value ) | ||||
| BOOST_CXX14_CONSTEXPR void iota ( ForwardIterator first, ForwardIterator last, T value ) | ||||
| { | ||||
|     for ( ; first != last; ++first, ++value ) | ||||
|         *first = value; | ||||
| @@ -38,7 +38,7 @@ void iota ( ForwardIterator first, ForwardIterator last, T value ) | ||||
| /// \param value    The initial value of the sequence to be generated | ||||
| /// | ||||
| template <typename Range, typename T> | ||||
| void iota ( Range &r, T value ) | ||||
| BOOST_CXX14_CONSTEXPR void iota ( Range &r, T value ) | ||||
| { | ||||
|     boost::algorithm::iota (boost::begin(r), boost::end(r), value); | ||||
| } | ||||
| @@ -52,7 +52,7 @@ void iota ( Range &r, T value ) | ||||
| /// \param n        The number of items to write | ||||
| /// | ||||
| template <typename OutputIterator, typename T> | ||||
| OutputIterator iota_n ( OutputIterator out, T value, std::size_t n ) | ||||
| BOOST_CXX14_CONSTEXPR OutputIterator iota_n ( OutputIterator out, T value, std::size_t n ) | ||||
| { | ||||
|     for ( ; n > 0; --n, ++value ) | ||||
|         *out++ = value; | ||||
|   | ||||
| @@ -26,7 +26,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param p        The predicate to test the values with | ||||
| /// \note           This function is part of the C++2011 standard library. | ||||
| template <typename InputIterator, typename UnaryPredicate> | ||||
| bool is_partitioned ( InputIterator first, InputIterator last, UnaryPredicate p ) | ||||
| BOOST_CXX14_CONSTEXPR bool is_partitioned ( InputIterator first, InputIterator last, UnaryPredicate p ) | ||||
| { | ||||
| //  Run through the part that satisfy the predicate | ||||
|     for ( ; first != last; ++first ) | ||||
| @@ -47,7 +47,7 @@ bool is_partitioned ( InputIterator first, InputIterator last, UnaryPredicate p | ||||
| /// \param p        The predicate to test the values with | ||||
| /// | ||||
| template <typename Range, typename UnaryPredicate> | ||||
| bool is_partitioned ( const Range &r, UnaryPredicate p ) | ||||
| BOOST_CXX14_CONSTEXPR bool is_partitioned ( const Range &r, UnaryPredicate p ) | ||||
| { | ||||
|     return boost::algorithm::is_partitioned (boost::begin(r), boost::end(r), p); | ||||
| } | ||||
|   | ||||
| @@ -34,7 +34,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param p     A binary predicate that returns true if two elements are ordered. | ||||
| /// | ||||
|     template <typename ForwardIterator, typename Pred> | ||||
|     ForwardIterator is_sorted_until ( ForwardIterator first, ForwardIterator last, Pred p ) | ||||
|     BOOST_CXX14_CONSTEXPR ForwardIterator is_sorted_until ( ForwardIterator first, ForwardIterator last, Pred p ) | ||||
|     { | ||||
|         if ( first == last ) return last;  // the empty sequence is ordered | ||||
|         ForwardIterator next = first; | ||||
| @@ -54,7 +54,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param last  One past the end of the sequence | ||||
| /// | ||||
|     template <typename ForwardIterator> | ||||
|     ForwardIterator is_sorted_until ( ForwardIterator first, ForwardIterator last ) | ||||
|     BOOST_CXX14_CONSTEXPR ForwardIterator is_sorted_until ( ForwardIterator first, ForwardIterator last ) | ||||
|     { | ||||
|         typedef typename std::iterator_traits<ForwardIterator>::value_type value_type; | ||||
|         return boost::algorithm::is_sorted_until ( first, last, std::less<value_type>()); | ||||
| @@ -69,7 +69,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param p     A binary predicate that returns true if two elements are ordered. | ||||
| /// | ||||
|     template <typename ForwardIterator, typename Pred> | ||||
|     bool is_sorted ( ForwardIterator first, ForwardIterator last, Pred p ) | ||||
|     BOOST_CXX14_CONSTEXPR bool is_sorted ( ForwardIterator first, ForwardIterator last, Pred p ) | ||||
|     { | ||||
|         return boost::algorithm::is_sorted_until (first, last, p) == last; | ||||
|     } | ||||
| @@ -81,7 +81,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param last  One past the end of the sequence | ||||
| /// | ||||
|     template <typename ForwardIterator> | ||||
|     bool is_sorted ( ForwardIterator first, ForwardIterator last ) | ||||
|     BOOST_CXX14_CONSTEXPR bool is_sorted ( ForwardIterator first, ForwardIterator last ) | ||||
|     { | ||||
|         return boost::algorithm::is_sorted_until (first, last) == last; | ||||
|     } | ||||
| @@ -98,7 +98,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param p     A binary predicate that returns true if two elements are ordered. | ||||
| /// | ||||
|     template <typename R, typename Pred> | ||||
|     typename boost::lazy_disable_if_c< | ||||
|     BOOST_CXX14_CONSTEXPR typename boost::lazy_disable_if_c< | ||||
|         boost::is_same<R, Pred>::value,  | ||||
|         typename boost::range_iterator<const R>  | ||||
|     >::type is_sorted_until ( const R &range, Pred p ) | ||||
| @@ -113,7 +113,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param range The range to be tested. | ||||
| /// | ||||
|     template <typename R> | ||||
|     typename boost::range_iterator<const R>::type is_sorted_until ( const R &range ) | ||||
|     BOOST_CXX14_CONSTEXPR typename boost::range_iterator<const R>::type is_sorted_until ( const R &range ) | ||||
|     { | ||||
|         return boost::algorithm::is_sorted_until ( boost::begin ( range ), boost::end ( range )); | ||||
|     } | ||||
| @@ -126,7 +126,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param p     A binary predicate that returns true if two elements are ordered. | ||||
| /// | ||||
|     template <typename R, typename Pred> | ||||
|     typename boost::lazy_disable_if_c< boost::is_same<R, Pred>::value, boost::mpl::identity<bool> >::type | ||||
|     BOOST_CXX14_CONSTEXPR typename boost::lazy_disable_if_c< boost::is_same<R, Pred>::value, boost::mpl::identity<bool> >::type | ||||
|     is_sorted ( const R &range, Pred p ) | ||||
|     { | ||||
|         return boost::algorithm::is_sorted ( boost::begin ( range ), boost::end ( range ), p ); | ||||
| @@ -139,7 +139,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param range The range to be tested. | ||||
| /// | ||||
|     template <typename R> | ||||
|     bool is_sorted ( const R &range ) | ||||
|     BOOST_CXX14_CONSTEXPR bool is_sorted ( const R &range ) | ||||
|     { | ||||
|         return boost::algorithm::is_sorted ( boost::begin ( range ), boost::end ( range )); | ||||
|     } | ||||
| @@ -159,7 +159,7 @@ namespace boost { namespace algorithm { | ||||
| /// \note This function will return true for sequences that contain items that compare | ||||
| ///     equal. If that is not what you intended, you should use is_strictly_increasing instead. | ||||
|     template <typename ForwardIterator> | ||||
|     bool is_increasing ( ForwardIterator first, ForwardIterator last ) | ||||
|     BOOST_CXX14_CONSTEXPR bool is_increasing ( ForwardIterator first, ForwardIterator last ) | ||||
|     { | ||||
|         typedef typename std::iterator_traits<ForwardIterator>::value_type value_type; | ||||
|         return boost::algorithm::is_sorted (first, last, std::less<value_type>()); | ||||
| @@ -175,7 +175,7 @@ namespace boost { namespace algorithm { | ||||
| /// \note This function will return true for sequences that contain items that compare | ||||
| ///     equal. If that is not what you intended, you should use is_strictly_increasing instead. | ||||
|     template <typename R> | ||||
|     bool is_increasing ( const R &range ) | ||||
|     BOOST_CXX14_CONSTEXPR bool is_increasing ( const R &range ) | ||||
|     { | ||||
|         return is_increasing ( boost::begin ( range ), boost::end ( range )); | ||||
|     } | ||||
| @@ -192,7 +192,7 @@ namespace boost { namespace algorithm { | ||||
| /// \note This function will return true for sequences that contain items that compare | ||||
| ///     equal. If that is not what you intended, you should use is_strictly_decreasing instead. | ||||
|     template <typename ForwardIterator> | ||||
|     bool is_decreasing ( ForwardIterator first, ForwardIterator last ) | ||||
|     BOOST_CXX14_CONSTEXPR bool is_decreasing ( ForwardIterator first, ForwardIterator last ) | ||||
|     { | ||||
|         typedef typename std::iterator_traits<ForwardIterator>::value_type value_type; | ||||
|         return boost::algorithm::is_sorted (first, last, std::greater<value_type>()); | ||||
| @@ -207,7 +207,7 @@ namespace boost { namespace algorithm { | ||||
| /// \note This function will return true for sequences that contain items that compare | ||||
| ///     equal. If that is not what you intended, you should use is_strictly_decreasing instead. | ||||
|     template <typename R> | ||||
|     bool is_decreasing ( const R &range ) | ||||
|     BOOST_CXX14_CONSTEXPR bool is_decreasing ( const R &range ) | ||||
|     { | ||||
|         return is_decreasing ( boost::begin ( range ), boost::end ( range )); | ||||
|     } | ||||
| @@ -224,7 +224,7 @@ namespace boost { namespace algorithm { | ||||
| /// \note This function will return false for sequences that contain items that compare | ||||
| ///     equal. If that is not what you intended, you should use is_increasing instead. | ||||
|     template <typename ForwardIterator> | ||||
|     bool is_strictly_increasing ( ForwardIterator first, ForwardIterator last ) | ||||
|     BOOST_CXX14_CONSTEXPR bool is_strictly_increasing ( ForwardIterator first, ForwardIterator last ) | ||||
|     { | ||||
|         typedef typename std::iterator_traits<ForwardIterator>::value_type value_type; | ||||
|         return boost::algorithm::is_sorted (first, last, std::less_equal<value_type>()); | ||||
| @@ -239,7 +239,7 @@ namespace boost { namespace algorithm { | ||||
| /// \note This function will return false for sequences that contain items that compare | ||||
| ///     equal. If that is not what you intended, you should use is_increasing instead. | ||||
|     template <typename R> | ||||
|     bool is_strictly_increasing ( const R &range ) | ||||
|     BOOST_CXX14_CONSTEXPR bool is_strictly_increasing ( const R &range ) | ||||
|     { | ||||
|         return is_strictly_increasing ( boost::begin ( range ), boost::end ( range )); | ||||
|     } | ||||
| @@ -255,7 +255,7 @@ namespace boost { namespace algorithm { | ||||
| /// \note This function will return false for sequences that contain items that compare | ||||
| ///     equal. If that is not what you intended, you should use is_decreasing instead. | ||||
|     template <typename ForwardIterator> | ||||
|     bool is_strictly_decreasing ( ForwardIterator first, ForwardIterator last ) | ||||
|     BOOST_CXX14_CONSTEXPR bool is_strictly_decreasing ( ForwardIterator first, ForwardIterator last ) | ||||
|     { | ||||
|         typedef typename std::iterator_traits<ForwardIterator>::value_type value_type; | ||||
|         return boost::algorithm::is_sorted (first, last, std::greater_equal<value_type>()); | ||||
| @@ -270,7 +270,7 @@ namespace boost { namespace algorithm { | ||||
| /// \note This function will return false for sequences that contain items that compare | ||||
| ///     equal. If that is not what you intended, you should use is_decreasing instead. | ||||
|     template <typename R> | ||||
|     bool is_strictly_decreasing ( const R &range ) | ||||
|     BOOST_CXX14_CONSTEXPR bool is_strictly_decreasing ( const R &range ) | ||||
|     { | ||||
|         return is_strictly_decreasing ( boost::begin ( range ), boost::end ( range )); | ||||
|     } | ||||
|   | ||||
| @@ -26,7 +26,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param p     A predicate for testing the elements of the sequence | ||||
| /// | ||||
| template<typename InputIterator, typename Predicate>  | ||||
| bool none_of ( InputIterator first, InputIterator last, Predicate p ) | ||||
| BOOST_CXX14_CONSTEXPR bool none_of ( InputIterator first, InputIterator last, Predicate p ) | ||||
| { | ||||
|     for ( ; first != last; ++first ) | ||||
|         if ( p(*first))  | ||||
| @@ -42,7 +42,7 @@ bool none_of ( InputIterator first, InputIterator last, Predicate p ) | ||||
| /// \param p     A predicate for testing the elements of the range | ||||
| /// | ||||
| template<typename Range, typename Predicate>  | ||||
| bool none_of ( const Range &r, Predicate p ) | ||||
| BOOST_CXX14_CONSTEXPR bool none_of ( const Range &r, Predicate p ) | ||||
| { | ||||
|     return boost::algorithm::none_of (boost::begin (r), boost::end (r), p ); | ||||
| }  | ||||
| @@ -56,7 +56,7 @@ bool none_of ( const Range &r, Predicate p ) | ||||
| /// \param val   A value to compare against | ||||
| /// | ||||
| template<typename InputIterator, typename V>  | ||||
| bool none_of_equal ( InputIterator first, InputIterator last, const V &val )  | ||||
| BOOST_CXX14_CONSTEXPR bool none_of_equal ( InputIterator first, InputIterator last, const V &val )  | ||||
| { | ||||
|     for ( ; first != last; ++first ) | ||||
|         if ( val == *first ) | ||||
| @@ -72,7 +72,7 @@ bool none_of_equal ( InputIterator first, InputIterator last, const V &val ) | ||||
| /// \param val   A value to compare against | ||||
| /// | ||||
| template<typename Range, typename V>  | ||||
| bool none_of_equal ( const Range &r, const V & val )  | ||||
| BOOST_CXX14_CONSTEXPR bool none_of_equal ( const Range &r, const V & val )  | ||||
| { | ||||
|     return boost::algorithm::none_of_equal (boost::begin (r), boost::end (r), val); | ||||
| }  | ||||
|   | ||||
| @@ -28,7 +28,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param p     A predicate for testing the elements of the sequence | ||||
| /// | ||||
| template<typename InputIterator, typename Predicate>  | ||||
| bool one_of ( InputIterator first, InputIterator last, Predicate p ) | ||||
| BOOST_CXX14_CONSTEXPR bool one_of ( InputIterator first, InputIterator last, Predicate p ) | ||||
| { | ||||
|     InputIterator i = std::find_if (first, last, p); | ||||
|     if (i == last) | ||||
| @@ -43,7 +43,7 @@ bool one_of ( InputIterator first, InputIterator last, Predicate p ) | ||||
| /// \param p    A predicate for testing the elements of the range | ||||
| /// | ||||
| template<typename Range, typename Predicate>  | ||||
| bool one_of ( const Range &r, Predicate p )  | ||||
| BOOST_CXX14_CONSTEXPR bool one_of ( const Range &r, Predicate p )  | ||||
| { | ||||
|     return boost::algorithm::one_of ( boost::begin (r), boost::end (r), p ); | ||||
| } | ||||
|   | ||||
| @@ -14,6 +14,7 @@ | ||||
|  | ||||
| #include <utility>  // for std::pair | ||||
|  | ||||
| #include <boost/config.hpp> | ||||
| #include <boost/range/begin.hpp> | ||||
| #include <boost/range/end.hpp> | ||||
|  | ||||
| @@ -35,7 +36,7 @@ namespace boost { namespace algorithm { | ||||
| /// \note            This function is part of the C++2011 standard library. | ||||
| template <typename InputIterator,  | ||||
|         typename OutputIterator1, typename OutputIterator2, typename UnaryPredicate> | ||||
| std::pair<OutputIterator1, OutputIterator2> | ||||
| BOOST_CXX14_CONSTEXPR std::pair<OutputIterator1, OutputIterator2> | ||||
| partition_copy ( InputIterator first, InputIterator last, | ||||
|         OutputIterator1 out_true, OutputIterator2 out_false, UnaryPredicate p ) | ||||
| { | ||||
| @@ -57,7 +58,7 @@ partition_copy ( InputIterator first, InputIterator last, | ||||
| /// | ||||
| template <typename Range, typename OutputIterator1, typename OutputIterator2,  | ||||
|             typename UnaryPredicate> | ||||
| std::pair<OutputIterator1, OutputIterator2> | ||||
| BOOST_CXX14_CONSTEXPR std::pair<OutputIterator1, OutputIterator2> | ||||
| partition_copy ( const Range &r, OutputIterator1 out_true, OutputIterator2 out_false,  | ||||
|                                 UnaryPredicate p ) | ||||
| { | ||||
|   | ||||
| @@ -15,16 +15,24 @@ | ||||
| #include <algorithm>    // for std::equal | ||||
| #include <iterator> | ||||
|  | ||||
| #ifdef __cpp_lib_array_constexpr // or cpp17 compiler | ||||
| // if compiled according to C++17 standard or std functions are constexpr | ||||
| #define BOOST_CONSTEXPR_IF_STD_CONSTEXPR constexpr | ||||
| #else | ||||
| #define BOOST_CONSTEXPR_IF_STD_CONSTEXPR | ||||
| #endif | ||||
|  | ||||
| namespace boost { namespace algorithm { | ||||
|  | ||||
| namespace detail { | ||||
|  | ||||
|     template <class T1, class T2> | ||||
|     struct eq { | ||||
|         bool operator () ( const T1& v1, const T2& v2 ) const { return v1 == v2 ;} | ||||
|         BOOST_CONSTEXPR bool operator () ( const T1& v1, const T2& v2 ) const { return v1 == v2 ;} | ||||
|         }; | ||||
|      | ||||
|     template <class RandomAccessIterator1, class RandomAccessIterator2, class BinaryPredicate> | ||||
|     BOOST_CONSTEXPR_IF_STD_CONSTEXPR  | ||||
|     bool equal ( RandomAccessIterator1 first1, RandomAccessIterator1 last1,  | ||||
|                  RandomAccessIterator2 first2, RandomAccessIterator2 last2, BinaryPredicate pred, | ||||
|                  std::random_access_iterator_tag, std::random_access_iterator_tag ) | ||||
| @@ -37,6 +45,7 @@ namespace detail { | ||||
|     } | ||||
|  | ||||
|     template <class InputIterator1, class InputIterator2, class BinaryPredicate> | ||||
|     BOOST_CXX14_CONSTEXPR  | ||||
|     bool equal ( InputIterator1 first1, InputIterator1 last1,  | ||||
|                  InputIterator2 first2, InputIterator2 last2, BinaryPredicate pred, | ||||
|                  std::input_iterator_tag, std::input_iterator_tag ) | ||||
| @@ -60,6 +69,7 @@ namespace detail { | ||||
| /// \param last2     One past the end of the second range. | ||||
| /// \param pred      A predicate for comparing the elements of the ranges | ||||
| template <class InputIterator1, class InputIterator2, class BinaryPredicate> | ||||
| BOOST_CXX14_CONSTEXPR | ||||
| bool equal ( InputIterator1 first1, InputIterator1 last1,  | ||||
|              InputIterator2 first2, InputIterator2 last2, BinaryPredicate pred ) | ||||
| { | ||||
| @@ -78,6 +88,7 @@ bool equal ( InputIterator1 first1, InputIterator1 last1, | ||||
| /// \param first2    The start of the second range. | ||||
| /// \param last2     One past the end of the second range. | ||||
| template <class InputIterator1, class InputIterator2> | ||||
| BOOST_CXX14_CONSTEXPR | ||||
| bool equal ( InputIterator1 first1, InputIterator1 last1,  | ||||
|              InputIterator2 first2, InputIterator2 last2 ) | ||||
| { | ||||
|   | ||||
| @@ -13,6 +13,7 @@ | ||||
| #define BOOST_ALGORITHM_MISMATCH_HPP | ||||
|  | ||||
| #include <utility>      // for std::pair | ||||
| #include <boost/config.hpp> | ||||
|  | ||||
| namespace boost { namespace algorithm { | ||||
|  | ||||
| @@ -27,7 +28,7 @@ namespace boost { namespace algorithm { | ||||
| /// \param last2     One past the end of the second range. | ||||
| /// \param pred      A predicate for comparing the elements of the ranges | ||||
| template <class InputIterator1, class InputIterator2, class BinaryPredicate> | ||||
| std::pair<InputIterator1, InputIterator2> mismatch ( | ||||
| BOOST_CXX14_CONSTEXPR std::pair<InputIterator1, InputIterator2> mismatch ( | ||||
|                     InputIterator1 first1, InputIterator1 last1, | ||||
|                     InputIterator2 first2, InputIterator2 last2, | ||||
|                     BinaryPredicate pred ) | ||||
| @@ -47,7 +48,7 @@ std::pair<InputIterator1, InputIterator2> mismatch ( | ||||
| /// \param first2    The start of the second range. | ||||
| /// \param last2     One past the end of the second range. | ||||
| template <class InputIterator1, class InputIterator2> | ||||
| std::pair<InputIterator1, InputIterator2> mismatch ( | ||||
| BOOST_CXX14_CONSTEXPR std::pair<InputIterator1, InputIterator2> mismatch ( | ||||
|                     InputIterator1 first1, InputIterator1 last1, | ||||
|                     InputIterator2 first2, InputIterator2 last2 ) | ||||
| { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user