forked from boostorg/algorithm
		
	fix constexpr-ness of a couple of algorithhms - and tests. Based on Pull Request #44 by Flast - thanks!
This commit is contained in:
		| @@ -12,7 +12,6 @@ | ||||
| #ifndef BOOST_ALGORITHM_ONE_OF_HPP | ||||
| #define BOOST_ALGORITHM_ONE_OF_HPP | ||||
|  | ||||
| #include <algorithm>            // for std::find and std::find_if | ||||
| #include <boost/algorithm/cxx11/none_of.hpp> | ||||
|  | ||||
| #include <boost/range/begin.hpp> | ||||
| @@ -30,10 +29,14 @@ namespace boost { namespace algorithm { | ||||
| template<typename InputIterator, typename Predicate>  | ||||
| BOOST_CXX14_CONSTEXPR bool one_of ( InputIterator first, InputIterator last, Predicate p ) | ||||
| { | ||||
|     InputIterator i = std::find_if (first, last, p); | ||||
|     if (i == last) | ||||
| //  find_if | ||||
|     for (; first != last; ++first) | ||||
|         if (p(*first)) | ||||
|             break; | ||||
|  | ||||
|     if (first == last) | ||||
|         return false;    // Didn't occur at all | ||||
|     return boost::algorithm::none_of (++i, last, p); | ||||
|     return boost::algorithm::none_of (++first, last, p); | ||||
| } | ||||
|  | ||||
| /// \fn one_of ( const Range &r, Predicate p ) | ||||
| @@ -43,7 +46,7 @@ BOOST_CXX14_CONSTEXPR bool one_of ( InputIterator first, InputIterator last, Pre | ||||
| /// \param p    A predicate for testing the elements of the range | ||||
| /// | ||||
| template<typename Range, typename Predicate>  | ||||
| BOOST_CXX14_CONSTEXPR 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 ); | ||||
| } | ||||
| @@ -57,12 +60,16 @@ BOOST_CXX14_CONSTEXPR bool one_of ( const Range &r, Predicate p ) | ||||
| /// \param val      A value to compare against | ||||
| /// | ||||
| template<typename InputIterator, typename V>  | ||||
| bool one_of_equal ( InputIterator first, InputIterator last, const V &val ) | ||||
| BOOST_CXX14_CONSTEXPR bool one_of_equal ( InputIterator first, InputIterator last, const V &val ) | ||||
| { | ||||
|     InputIterator i = std::find (first, last, val); // find first occurrence of 'val' | ||||
|     if (i == last) | ||||
| //  find | ||||
|     for (; first != last; ++first) | ||||
|         if (*first == val) | ||||
|             break; | ||||
|  | ||||
|     if (first == last) | ||||
|         return false;                    // Didn't occur at all | ||||
|     return boost::algorithm::none_of_equal (++i, last, val); | ||||
|     return boost::algorithm::none_of_equal (++first, last, val); | ||||
| } | ||||
|  | ||||
| /// \fn one_of_equal ( const Range &r, const V &val ) | ||||
| @@ -72,7 +79,7 @@ bool one_of_equal ( InputIterator first, InputIterator last, const V &val ) | ||||
| /// \param val  A value to compare against | ||||
| /// | ||||
| template<typename Range, typename V>  | ||||
| bool one_of_equal ( const Range &r, const V &val ) | ||||
| BOOST_CXX14_CONSTEXPR bool one_of_equal ( const Range &r, const V &val ) | ||||
| { | ||||
|     return boost::algorithm::one_of_equal ( boost::begin (r), boost::end (r), val ); | ||||
| }  | ||||
|   | ||||
| @@ -12,16 +12,8 @@ | ||||
| #ifndef BOOST_ALGORITHM_EQUAL_HPP | ||||
| #define BOOST_ALGORITHM_EQUAL_HPP | ||||
|  | ||||
| #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 { | ||||
| @@ -32,7 +24,7 @@ namespace detail { | ||||
|         }; | ||||
|      | ||||
|     template <class RandomAccessIterator1, class RandomAccessIterator2, class BinaryPredicate> | ||||
|     BOOST_CONSTEXPR_IF_STD_CONSTEXPR  | ||||
|     BOOST_CXX14_CONSTEXPR | ||||
|     bool equal ( RandomAccessIterator1 first1, RandomAccessIterator1 last1,  | ||||
|                  RandomAccessIterator2 first2, RandomAccessIterator2 last2, BinaryPredicate pred, | ||||
|                  std::random_access_iterator_tag, std::random_access_iterator_tag ) | ||||
| @@ -40,12 +32,16 @@ namespace detail { | ||||
|     //  Random-access iterators let is check the sizes in constant time | ||||
|         if ( std::distance ( first1, last1 ) != std::distance ( first2, last2 )) | ||||
|             return false; | ||||
|     // If we know that the sequences are the same size, the original version is fine | ||||
|         return std::equal ( first1, last1, first2, pred ); | ||||
|  | ||||
|     //  std::equal | ||||
|         for (; first1 != last1; ++first1, ++first2) | ||||
|             if (!pred(*first1, *first2)) | ||||
|                 return false; | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     template <class InputIterator1, class InputIterator2, class BinaryPredicate> | ||||
|     BOOST_CXX14_CONSTEXPR  | ||||
|     BOOST_CXX14_CONSTEXPR | ||||
|     bool equal ( InputIterator1 first1, InputIterator1 last1,  | ||||
|                  InputIterator2 first2, InputIterator2 last2, BinaryPredicate pred, | ||||
|                  std::input_iterator_tag, std::input_iterator_tag ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user