mirror of
https://github.com/boostorg/functional.git
synced 2025-08-02 22:14:28 +02:00
Merge branch 'develop' (early part)
This commit is contained in:
47
.travis.yml
Normal file
47
.travis.yml
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# Copyright (C) 2016 Daniel James.
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
# Use Trusty to get a reasonably recent version of Boost.
|
||||||
|
sudo: required
|
||||||
|
dist: trusty
|
||||||
|
|
||||||
|
language: c++
|
||||||
|
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- libboost-dev
|
||||||
|
- libboost-tools-dev
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- compiler: gcc
|
||||||
|
env: BJAM_TOOLSET=gcc
|
||||||
|
- compiler: gcc
|
||||||
|
env: BJAM_TOOLSET=gcc-std11
|
||||||
|
- compiler: clang
|
||||||
|
env: BJAM_TOOLSET=clang
|
||||||
|
- compiler: clang
|
||||||
|
env: BJAM_TOOLSET=clang-std11
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- |
|
||||||
|
echo "using gcc : : g++-4.8 ;" > ~/user-config.jam
|
||||||
|
echo "using gcc : std11 : g++-4.8 --std=c++11 ;" >> ~/user-config.jam
|
||||||
|
echo "using clang : : clang++ ;" >> ~/user-config.jam
|
||||||
|
echo "using clang : std11 : clang++ --std=c++11 ;" >> ~/user-config.jam
|
||||||
|
- cat ~/user-config.jam
|
||||||
|
- touch Jamroot.jam
|
||||||
|
|
||||||
|
script:
|
||||||
|
- cd ${TRAVIS_BUILD_DIR}/test
|
||||||
|
- bjam -q ${BJAM_TOOLSET} include=${TRAVIS_BUILD_DIR}/include
|
||||||
|
- cd ${TRAVIS_BUILD_DIR}/hash/test
|
||||||
|
- bjam -q ${BJAM_TOOLSET} include=${TRAVIS_BUILD_DIR}/include
|
||||||
|
- cd ${TRAVIS_BUILD_DIR}/forward/test
|
||||||
|
- bjam -q ${BJAM_TOOLSET} include=${TRAVIS_BUILD_DIR}/include
|
||||||
|
- cd ${TRAVIS_BUILD_DIR}/factory/test
|
||||||
|
- bjam -q ${BJAM_TOOLSET} include=${TRAVIS_BUILD_DIR}/include
|
||||||
|
- cd ${TRAVIS_BUILD_DIR}/overloaded_function/test
|
||||||
|
- bjam -q ${BJAM_TOOLSET} include=${TRAVIS_BUILD_DIR}/include
|
@@ -44,6 +44,10 @@ public:
|
|||||||
{
|
{
|
||||||
return -(l=r+val);
|
return -(l=r+val);
|
||||||
}
|
}
|
||||||
|
char operator()(int& l, int& r)
|
||||||
|
{
|
||||||
|
return l=r+val;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Sig>
|
template <typename Sig>
|
||||||
struct result
|
struct result
|
||||||
@@ -89,8 +93,11 @@ int main()
|
|||||||
// lvalue,lvalue
|
// lvalue,lvalue
|
||||||
BOOST_TEST(( is_same<
|
BOOST_TEST(( is_same<
|
||||||
result_of< f(int&, int&) >::type, char >::value ));
|
result_of< f(int&, int&) >::type, char >::value ));
|
||||||
|
// result_of works differently for C++11 here, so compare
|
||||||
|
// with using it against test_func.
|
||||||
BOOST_TEST(( is_same<
|
BOOST_TEST(( is_same<
|
||||||
result_of< f const (int&, int&) >::type, char >::value ));
|
result_of< f const (int&, int&) >::type,
|
||||||
|
result_of< test_func<> const (int&, int&)>::type >::value ));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@@ -44,6 +44,10 @@ public:
|
|||||||
{
|
{
|
||||||
return -(l=r+val);
|
return -(l=r+val);
|
||||||
}
|
}
|
||||||
|
char operator()(int & l, int & r)
|
||||||
|
{
|
||||||
|
return l=r+val;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Sig>
|
template <typename Sig>
|
||||||
struct result
|
struct result
|
||||||
@@ -91,8 +95,11 @@ int main()
|
|||||||
// lvalue,lvalue
|
// lvalue,lvalue
|
||||||
BOOST_TEST(( is_same<
|
BOOST_TEST(( is_same<
|
||||||
result_of< f(ref, ref) >::type, char >::value ));
|
result_of< f(ref, ref) >::type, char >::value ));
|
||||||
|
// result_of works differently for C++11 here, so compare
|
||||||
|
// with using it against test_func.
|
||||||
BOOST_TEST(( is_same<
|
BOOST_TEST(( is_same<
|
||||||
result_of< f const (ref, ref) >::type, char >::value ));
|
result_of< f const (ref, ref) >::type,
|
||||||
|
result_of< test_func<> const (int&, int&) >::type >::value ));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
using boost::noncopyable;
|
using boost::noncopyable;
|
||||||
|
@@ -3,6 +3,11 @@
|
|||||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
// Force use of assert.
|
||||||
|
#if defined(NDEBUG)
|
||||||
|
#undef NDEBUG
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <boost/functional/hash.hpp>
|
#include <boost/functional/hash.hpp>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
@@ -3,6 +3,11 @@
|
|||||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
// 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)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
// Force use of assert.
|
||||||
|
#if defined(NDEBUG)
|
||||||
|
#undef NDEBUG
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <boost/functional/hash.hpp>
|
#include <boost/functional/hash.hpp>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
@@ -58,8 +58,6 @@ void numeric_extra_tests(typename
|
|||||||
template <class T>
|
template <class T>
|
||||||
void numeric_test(T*)
|
void numeric_test(T*)
|
||||||
{
|
{
|
||||||
typedef boost::hash_detail::limits<T> limits;
|
|
||||||
|
|
||||||
compile_time_tests((T*) 0);
|
compile_time_tests((T*) 0);
|
||||||
|
|
||||||
BOOST_HASH_TEST_NAMESPACE::hash<T> x1;
|
BOOST_HASH_TEST_NAMESPACE::hash<T> x1;
|
||||||
|
@@ -38,6 +38,23 @@ void string_tests()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void string0_tests()
|
||||||
|
{
|
||||||
|
std::string x1(1, '\0');
|
||||||
|
std::string x2(2, '\0');
|
||||||
|
std::string x3(3, '\0');
|
||||||
|
std::string x4(10, '\0');
|
||||||
|
|
||||||
|
BOOST_HASH_TEST_NAMESPACE::hash<std::string> hasher;
|
||||||
|
|
||||||
|
BOOST_TEST(hasher(x1) != hasher(x2));
|
||||||
|
BOOST_TEST(hasher(x1) != hasher(x3));
|
||||||
|
BOOST_TEST(hasher(x1) != hasher(x4));
|
||||||
|
BOOST_TEST(hasher(x2) != hasher(x3));
|
||||||
|
BOOST_TEST(hasher(x2) != hasher(x4));
|
||||||
|
BOOST_TEST(hasher(x3) != hasher(x4));
|
||||||
|
}
|
||||||
|
|
||||||
#if !defined(BOOST_NO_STD_WSTRING)
|
#if !defined(BOOST_NO_STD_WSTRING)
|
||||||
void wstring_tests()
|
void wstring_tests()
|
||||||
{
|
{
|
||||||
@@ -66,6 +83,7 @@ void wstring_tests()
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
string_tests();
|
string_tests();
|
||||||
|
string0_tests();
|
||||||
#if !defined(BOOST_NO_STD_WSTRING)
|
#if !defined(BOOST_NO_STD_WSTRING)
|
||||||
wstring_tests();
|
wstring_tests();
|
||||||
#endif
|
#endif
|
||||||
|
@@ -144,8 +144,30 @@ namespace boost
|
|||||||
: boost::result_of< BOOST_DEDUCED_TYPENAME c<Self>::t() >
|
: boost::result_of< BOOST_DEDUCED_TYPENAME c<Self>::t() >
|
||||||
{ };
|
{ };
|
||||||
|
|
||||||
template< class MD, class F, class FC >
|
// WHen operator()() doesn't have any parameters, it can't
|
||||||
struct forward_adapter_impl<MD,F,FC,0,0>
|
// be templatized and can't use SFINAE, so intead use class
|
||||||
|
// template parameter SFINAE to decide whether to instantiate it.
|
||||||
|
|
||||||
|
template <typename T, typename R = void>
|
||||||
|
struct forward_adapter_sfinae
|
||||||
|
{
|
||||||
|
typedef T type;
|
||||||
|
};
|
||||||
|
|
||||||
|
// This is the fallback for when there isn't an operator()(),
|
||||||
|
// need to create an operator() that will never instantiate
|
||||||
|
// so that using parent::operator() will work okay.
|
||||||
|
template< class MD, class F, class FC, class Enable = void>
|
||||||
|
struct forward_adapter_impl_zero
|
||||||
|
{
|
||||||
|
template <typename T> struct never_instantiate {};
|
||||||
|
template <typename T>
|
||||||
|
typename never_instantiate<T>::type operator()(T) const {}
|
||||||
|
};
|
||||||
|
|
||||||
|
template< class MD, class F, class FC>
|
||||||
|
struct forward_adapter_impl_zero<MD, F, FC,
|
||||||
|
typename forward_adapter_sfinae<typename boost::result_of< FC() >::type>::type>
|
||||||
{
|
{
|
||||||
inline typename boost::result_of< FC() >::type
|
inline typename boost::result_of< FC() >::type
|
||||||
operator()() const
|
operator()() const
|
||||||
@@ -158,6 +180,13 @@ namespace boost
|
|||||||
{
|
{
|
||||||
return static_cast<MD*>(this)->target_function()();
|
return static_cast<MD*>(this)->target_function()();
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template< class MD, class F, class FC >
|
||||||
|
struct forward_adapter_impl<MD,F,FC,0,0>
|
||||||
|
: forward_adapter_impl_zero<MD,F,FC>
|
||||||
|
{
|
||||||
|
using forward_adapter_impl_zero<MD,F,FC>::operator();
|
||||||
|
|
||||||
// closing brace gets generated by preprocessing code, below
|
// closing brace gets generated by preprocessing code, below
|
||||||
|
|
||||||
|
@@ -212,7 +212,6 @@ namespace boost
|
|||||||
seed ^= value + 0x9e3779b9 + (seed<<6) + (seed>>2);
|
seed ^= value + 0x9e3779b9 + (seed<<6) + (seed>>2);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename SizeT>
|
|
||||||
inline void hash_combine_impl(boost::uint32_t& h1,
|
inline void hash_combine_impl(boost::uint32_t& h1,
|
||||||
boost::uint32_t k1)
|
boost::uint32_t k1)
|
||||||
{
|
{
|
||||||
@@ -229,12 +228,11 @@ namespace boost
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Don't define 64-bit hash combine on platforms with 64 bit integers,
|
// Don't define 64-bit hash combine on platforms without 64 bit integers,
|
||||||
// and also not for 32-bit gcc as it warns about the 64-bit constant.
|
// and also not for 32-bit gcc as it warns about the 64-bit constant.
|
||||||
#if !defined(BOOST_NO_INT64_T) && \
|
#if !defined(BOOST_NO_INT64_T) && \
|
||||||
!(defined(__GNUC__) && ULONG_MAX == 0xffffffff)
|
!(defined(__GNUC__) && ULONG_MAX == 0xffffffff)
|
||||||
|
|
||||||
template <typename SizeT>
|
|
||||||
inline void hash_combine_impl(boost::uint64_t& h,
|
inline void hash_combine_impl(boost::uint64_t& h,
|
||||||
boost::uint64_t k)
|
boost::uint64_t k)
|
||||||
{
|
{
|
||||||
@@ -247,6 +245,10 @@ namespace boost
|
|||||||
|
|
||||||
h ^= k;
|
h ^= k;
|
||||||
h *= m;
|
h *= m;
|
||||||
|
|
||||||
|
// Completely arbitrary number, to prevent 0's
|
||||||
|
// from hashing to 0.
|
||||||
|
h += 0xe6546b64;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // BOOST_NO_INT64_T
|
#endif // BOOST_NO_INT64_T
|
||||||
|
@@ -149,8 +149,31 @@ namespace boost
|
|||||||
: boost::result_of< BOOST_DEDUCED_TYPENAME c<Self>::t() >
|
: boost::result_of< BOOST_DEDUCED_TYPENAME c<Self>::t() >
|
||||||
{ };
|
{ };
|
||||||
|
|
||||||
template< class MD, class F, class FC >
|
// When operator() doesn't have any parameters, it can't
|
||||||
struct lightweight_forward_adapter_impl<MD,F,FC,0,0>
|
// be templatized and can't use SFINAE, so intead use class
|
||||||
|
// template parameter SFINAE to decide whether to instantiate it.
|
||||||
|
|
||||||
|
template <typename T, typename R = void>
|
||||||
|
struct lightweight_forward_adapter_sfinae
|
||||||
|
{
|
||||||
|
typedef T type;
|
||||||
|
};
|
||||||
|
|
||||||
|
// This is the fallback for when there isn't an operator()(),
|
||||||
|
// need to create an operator() that will never instantiate
|
||||||
|
// so that using parent::operator() will work okay.
|
||||||
|
template< class MD, class F, class FC, class Enable = void>
|
||||||
|
struct lightweight_forward_adapter_impl_zero
|
||||||
|
: lightweight_forward_adapter_result
|
||||||
|
{
|
||||||
|
template <typename T> struct never_instantiate {};
|
||||||
|
template <typename T>
|
||||||
|
typename never_instantiate<T>::type operator()(T) const {}
|
||||||
|
};
|
||||||
|
|
||||||
|
template< class MD, class F, class FC>
|
||||||
|
struct lightweight_forward_adapter_impl_zero<MD, F, FC,
|
||||||
|
typename lightweight_forward_adapter_sfinae<typename boost::result_of< FC() >::type>::type>
|
||||||
: lightweight_forward_adapter_result
|
: lightweight_forward_adapter_result
|
||||||
{
|
{
|
||||||
inline typename boost::result_of< FC() >::type
|
inline typename boost::result_of< FC() >::type
|
||||||
@@ -166,6 +189,12 @@ namespace boost
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template< class MD, class F, class FC >
|
||||||
|
struct lightweight_forward_adapter_impl<MD,F,FC,0,0>
|
||||||
|
: lightweight_forward_adapter_impl_zero<MD,F,FC>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
# define BOOST_PP_FILENAME_1 \
|
# define BOOST_PP_FILENAME_1 \
|
||||||
<boost/functional/lightweight_forward_adapter.hpp>
|
<boost/functional/lightweight_forward_adapter.hpp>
|
||||||
# define BOOST_PP_ITERATION_LIMITS \
|
# define BOOST_PP_ITERATION_LIMITS \
|
||||||
|
Reference in New Issue
Block a user