diff --git a/include/boost/bind/bind.hpp b/include/boost/bind/bind.hpp index 2301234..1083efc 100644 --- a/include/boost/bind/bind.hpp +++ b/include/boost/bind/bind.hpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include diff --git a/include/boost/bind/std_placeholders.hpp b/include/boost/bind/std_placeholders.hpp new file mode 100644 index 0000000..04c9ba5 --- /dev/null +++ b/include/boost/bind/std_placeholders.hpp @@ -0,0 +1,39 @@ +#ifndef BOOST_BIND_STD_PLACEHOLDERS_HPP_INCLUDED +#define BOOST_BIND_STD_PLACEHOLDERS_HPP_INCLUDED + +// MS compatible compilers support #pragma once + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +# pragma once +#endif + +// Copyright 2021 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include + +#if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL) && !defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) + +#include +#include + +namespace boost +{ + +template<> struct is_placeholder< typename std::decay::type > { enum _vt { value = 1 }; }; +template<> struct is_placeholder< typename std::decay::type > { enum _vt { value = 2 }; }; +template<> struct is_placeholder< typename std::decay::type > { enum _vt { value = 3 }; }; +template<> struct is_placeholder< typename std::decay::type > { enum _vt { value = 4 }; }; +template<> struct is_placeholder< typename std::decay::type > { enum _vt { value = 5 }; }; +template<> struct is_placeholder< typename std::decay::type > { enum _vt { value = 6 }; }; +template<> struct is_placeholder< typename std::decay::type > { enum _vt { value = 7 }; }; +template<> struct is_placeholder< typename std::decay::type > { enum _vt { value = 8 }; }; +template<> struct is_placeholder< typename std::decay::type > { enum _vt { value = 9 }; }; + +} // namespace boost + +#endif + +#endif // #ifndef BOOST_BIND_STD_PLACEHOLDERS_HPP_INCLUDED diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 0974fca..2cf8583 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -78,3 +78,4 @@ run bind_cpp20_test.cpp ; run protect_test2.cpp ; run protect_cpp20_test.cpp ; run bind_noexcept_mf2_test.cpp ; +run std_placeholders_test.cpp ; diff --git a/test/std_placeholders_test.cpp b/test/std_placeholders_test.cpp new file mode 100644 index 0000000..66bff45 --- /dev/null +++ b/test/std_placeholders_test.cpp @@ -0,0 +1,50 @@ +// Copyright 2021 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include + +#if defined(BOOST_NO_CXX11_HDR_FUNCTIONAL) + +BOOST_PRAGMA_MESSAGE( "Skipping test due to BOOST_NO_CXX11_HDR_FUNCTIONAL being defined" ) +int main() {} + +#elif defined(BOOST_NO_CXX11_DECLTYPE) + +BOOST_PRAGMA_MESSAGE( "Skipping test due to BOOST_NO_CXX11_DECLTYPE being defined" ) +int main() {} + +#elif defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) + +BOOST_PRAGMA_MESSAGE( "Skipping test due to BOOST_NO_CXX11_HDR_TYPE_TRAITS being defined" ) +int main() {} + +#else + +int f( int x ) +{ + return -x; +} + +int main() +{ + using namespace std::placeholders; + + BOOST_TEST_EQ( boost::bind( f, _1 )( 1 ), -1 ); + BOOST_TEST_EQ( boost::bind( f, _2 )( 1, 2 ), -2 ); + BOOST_TEST_EQ( boost::bind( f, _3 )( 1, 2, 3 ), -3 ); + BOOST_TEST_EQ( boost::bind( f, _4 )( 1, 2, 3, 4 ), -4 ); + BOOST_TEST_EQ( boost::bind( f, _5 )( 1, 2, 3, 4, 5 ), -5 ); + BOOST_TEST_EQ( boost::bind( f, _6 )( 1, 2, 3, 4, 5, 6 ), -6 ); + BOOST_TEST_EQ( boost::bind( f, _7 )( 1, 2, 3, 4, 5, 6, 7 ), -7 ); + BOOST_TEST_EQ( boost::bind( f, _8 )( 1, 2, 3, 4, 5, 6, 7, 8 ), -8 ); + BOOST_TEST_EQ( boost::bind( f, _9 )( 1, 2, 3, 4, 5, 6, 7, 8, 9 ), -9 ); + + return boost::report_errors(); +} + +#endif