diff --git a/include/boost/bind.hpp b/include/boost/bind.hpp index 0a72571..f6b65a4 100644 --- a/include/boost/bind.hpp +++ b/include/boost/bind.hpp @@ -1134,6 +1134,21 @@ template type; }; +// operator! + +struct logical_not +{ + template bool operator()(V const & v) const { return !v; } +}; + +template + bind_t< bool, logical_not, list1< bind_t > > + operator! (bind_t const & f) +{ + typedef list1< bind_t > list_type; + return bind_t ( logical_not(), list_type(f) ); +} + } // namespace _bi // visit_each diff --git a/test/Jamfile b/test/Jamfile index 35a6dd2..3eda1e1 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -23,6 +23,7 @@ DEPENDS all : bind ; [ run bind_const_test.cpp ] [ run bind_cv_test.cpp ] [ run bind_stateful_test.cpp ] + [ run bind_not_test.cpp ] [ run mem_fn_test.cpp ] [ run mem_fn_void_test.cpp ] [ run mem_fn_derived_test.cpp ] diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index c0ffb2f..53721a0 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -17,6 +17,7 @@ test-suite "bind" [ run bind_const_test.cpp ] [ run bind_cv_test.cpp ] [ run bind_stateful_test.cpp ] + [ run bind_not_test.cpp ] [ run mem_fn_test.cpp ] [ run mem_fn_void_test.cpp ] [ run mem_fn_derived_test.cpp ] diff --git a/test/bind_not_test.cpp b/test/bind_not_test.cpp new file mode 100644 index 0000000..27da3f2 --- /dev/null +++ b/test/bind_not_test.cpp @@ -0,0 +1,57 @@ +#include + +#if defined(BOOST_MSVC) +#pragma warning(disable: 4786) // identifier truncated in debug info +#pragma warning(disable: 4710) // function not inlined +#pragma warning(disable: 4711) // function selected for automatic inline expansion +#pragma warning(disable: 4514) // unreferenced inline removed +#endif + +// +// bind_not_test.cpp - operator! +// +// Copyright (c) 2005 Peter Dimov +// +// 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) +// + +#include + +#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) +#pragma warning(push, 3) +#endif + +#include + +#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) +#pragma warning(pop) +#endif + +#include + +template void test( F f, A1 a1, R r ) +{ + BOOST_TEST( f(a1) == r ); +} + +bool f( bool v ) +{ + return v; +} + +int g( int v ) +{ + return v; +} + +int main() +{ + test( !boost::bind( f, true ), 0, !f( true ) ); + test( !boost::bind( g, _1 ), 5, !g( 5 ) ); + test( boost::bind( f, !boost::bind( f, true ) ), 0, f( !f( true ) ) ); + test( boost::bind( f, !boost::bind( f, _1 ) ), true, f( !f( true ) ) ); + + return boost::report_errors(); +}