forked from boostorg/function
Support fn.contains(f) where f is a function. Fixes #46.
This commit is contained in:
@ -25,6 +25,7 @@
|
||||
#include <boost/type_traits/alignment_of.hpp>
|
||||
#include <boost/type_traits/enable_if.hpp>
|
||||
#include <boost/type_traits/integral_constant.hpp>
|
||||
#include <boost/type_traits/is_function.hpp>
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/config/workaround.hpp>
|
||||
@ -652,7 +653,8 @@ public:
|
||||
}
|
||||
|
||||
template<typename F>
|
||||
bool contains(const F& f) const
|
||||
typename boost::enable_if_< !boost::is_function<F>::value, bool >::type
|
||||
contains(const F& f) const
|
||||
{
|
||||
if (const F* fp = this->template target<F>())
|
||||
{
|
||||
@ -662,6 +664,19 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Fn>
|
||||
typename boost::enable_if_< boost::is_function<Fn>::value, bool >::type
|
||||
contains(Fn& f) const
|
||||
{
|
||||
typedef Fn* F;
|
||||
if (const F* fp = this->template target<F>())
|
||||
{
|
||||
return function_equal(*fp, &f);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3
|
||||
// GCC 3.3 and newer cannot copy with the global operator==, due to
|
||||
// problems with instantiation of function return types before it
|
||||
|
@ -90,3 +90,6 @@ run fn_eq_bind_test.cpp ;
|
||||
# /usr/include/c++/4.4/bits/shared_ptr.h:146: error: cannot use typeid with -fno-rtti
|
||||
run contains_test.cpp : : : <rtti>off <toolset>gcc-4.4,<cxxstd>0x:<build>no : contains_test_no_rtti ;
|
||||
run contains2_test.cpp : : : <rtti>off <toolset>gcc-4.4,<cxxstd>0x:<build>no : contains2_test_no_rtti ;
|
||||
|
||||
run contains3_test.cpp ;
|
||||
run contains3_test.cpp : : : <rtti>off <toolset>gcc-4.4,<cxxstd>0x:<build>no : contains3_test_no_rtti ;
|
||||
|
33
test/contains3_test.cpp
Normal file
33
test/contains3_test.cpp
Normal file
@ -0,0 +1,33 @@
|
||||
// Copyright 2023 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/function.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
static int f()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int g()
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
boost::function<int()> fn;
|
||||
BOOST_TEST( !fn.contains( f ) );
|
||||
BOOST_TEST( !fn.contains( g ) );
|
||||
}
|
||||
|
||||
{
|
||||
boost::function<int()> fn( f );
|
||||
BOOST_TEST( fn.contains( f ) );
|
||||
BOOST_TEST( !fn.contains( g ) );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
Reference in New Issue
Block a user