diff --git a/find_if_not/test/Jamfile.v2 b/find_if_not/test/Jamfile.v2 new file mode 100644 index 0000000..0e4ec52 --- /dev/null +++ b/find_if_not/test/Jamfile.v2 @@ -0,0 +1,23 @@ +# Boost.Algorithm Library test Jamfile +# +# Copyright (C) 2002--2004, Herve Bronnimann +# +# Modified 2008, Jesse Williamson +# +# Use, modification, and distribution is subject to the Boost Software +# License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) +# + +import testing ; + +{ + test-suite algorithm/find_if_not: + : + [ run find_if_not.cpp + : : : : find_if_not ] + [ run find_if_not.cpp + : : : : find_if_not ] + ; +} + diff --git a/find_if_not/test/find_if_not.cpp b/find_if_not/test/find_if_not.cpp new file mode 100644 index 0000000..1f4cad8 --- /dev/null +++ b/find_if_not/test/find_if_not.cpp @@ -0,0 +1,58 @@ +/* Unit tests for Boost.algorithms.sequence::find_if_not() + * + * Copyright (C) 2008, Jesse Williamson + * + * Use, modification, and distribution is subject to the Boost Software + * License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + * +*/ + +#include + +#include + +#include +#include +#include + +using namespace std; + +using namespace boost::algorithm::sequence; + +int make_zero(int x) +{ + return 0; +} + +string make_z(string x) +{ + return "z"; +} + +int test_main(int, char **) +{ + // Basic test: + { + vector v(3); + + v[0] = 1; + v[1] = 2; + v[2] = 3; + + BOOST_CHECK(v[1] == *(find_if_not(v.begin(), v.end(), std::bind2nd(std::equal_to(), 1)))); + } + + // Range test: + { + vector v(3); + + v[0] = 1; + v[1] = 2; + v[2] = 3; + + BOOST_CHECK(v[1] == *(find_if_not(v, std::bind2nd(std::equal_to(), 1)))); + } + + return 0; +} diff --git a/include/boost/algorithm/find_if_not.hpp b/include/boost/algorithm/find_if_not.hpp new file mode 100644 index 0000000..138773a --- /dev/null +++ b/include/boost/algorithm/find_if_not.hpp @@ -0,0 +1,62 @@ +/* + Copyright (C) 2008 Jesse Williamson + + + 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) + +*/ + +#ifndef BOOST_ALGORITHM_SEQUENCE_FIND_IF_NOT_HPP + #define BOOST_ALGORITHM_SEQUENCE_FIND_IF_NOT_HPP + +#include + +/// \file find_if_not.hpp +/// \brief Boost implementation of find_if_not() algorithm. +/// \author Jesse Williamson + +namespace boost { namespace algorithm { namespace sequence { + +/// \fn InputIterator find_if_not ( InputIterator first, InputIterator last, Predicate pred ) +/// \brief Returns the first iterator in the range [first, last] for which pred is false. Returns [last] if +/// no such iterator exists. +/// +/// \param first The start of the input sequence. +/// \param last One past the end of the input sequence. +/// \param pred Predicate. +/// + template + InputIterator find_if_not ( InputIterator first, InputIterator last, Predicate pred ) + { + for( ; first != last; ++first ) + if(! pred( *first ) ) + return first; + + return last; + } + +/// \fn InputIterator find_if_not ( ForwardReadableRange& R, Predicate pred ) +/// \brief Returns the first iterator in the range [R] for which pred is false. Returns [R::end] if +/// no such iterator exists. +/// +/// \param R A forward readable Boost range input sequence. +/// \param pred Predicate. +/// +/* + inline typename boost::range_iterator< ForwardReadableRange >::type + find( ForwardReadableRange& c, const T& value ) + { + return std::find( boost::begin( c ), boost::end( c ), value ); + } +*/ + + template + typename boost::range_iterator::type find_if_not( ForwardReadableRange& R, Predicate pred ) + { + return find_if_not( boost::begin(R), boost::end(R), pred ); + } + +}}} // boost::algorithm::sequence + +#endif