mirror of
https://github.com/boostorg/core.git
synced 2025-11-28 21:30:09 +01:00
Use std::data and std::size for boost equivalents, when possible.
This avoids the potential ambiguity between boost:: and std:: functions when the user calls data() or size() unqualified and both alternatives are found via ADL. Refs https://github.com/boostorg/core/issues/206.
This commit is contained in:
@@ -8,8 +8,20 @@ Distributed under the Boost Software License, Version 1.0.
|
|||||||
#ifndef BOOST_CORE_DATA_HPP
|
#ifndef BOOST_CORE_DATA_HPP
|
||||||
#define BOOST_CORE_DATA_HPP
|
#define BOOST_CORE_DATA_HPP
|
||||||
|
|
||||||
#include <initializer_list>
|
#include <iterator>
|
||||||
|
|
||||||
|
// Note: MSVC doesn't define __cpp_lib_nonmember_container_access but supports the feature even in C++14 mode
|
||||||
|
#if (defined(__cpp_lib_nonmember_container_access) && (__cpp_lib_nonmember_container_access >= 201411l)) || \
|
||||||
|
(defined(_MSC_VER) && (_MSC_VER >= 1900))
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
using std::data;
|
||||||
|
} /* boost */
|
||||||
|
|
||||||
|
#else // (defined(__cpp_lib_nonmember_container_access) ...
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <initializer_list>
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
|
|
||||||
@@ -43,4 +55,6 @@ data(std::initializer_list<T> l) noexcept
|
|||||||
|
|
||||||
} /* boost */
|
} /* boost */
|
||||||
|
|
||||||
|
#endif // (defined(__cpp_lib_nonmember_container_access) ...
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -8,6 +8,18 @@ Distributed under the Boost Software License, Version 1.0.
|
|||||||
#ifndef BOOST_CORE_SIZE_HPP
|
#ifndef BOOST_CORE_SIZE_HPP
|
||||||
#define BOOST_CORE_SIZE_HPP
|
#define BOOST_CORE_SIZE_HPP
|
||||||
|
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
|
// Note: MSVC doesn't define __cpp_lib_nonmember_container_access but supports the feature even in C++14 mode
|
||||||
|
#if (defined(__cpp_lib_nonmember_container_access) && (__cpp_lib_nonmember_container_access >= 201411l)) || \
|
||||||
|
(defined(_MSC_VER) && (_MSC_VER >= 1900))
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
using std::size;
|
||||||
|
} /* boost */
|
||||||
|
|
||||||
|
#else // (defined(__cpp_lib_nonmember_container_access) ...
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
@@ -28,4 +40,6 @@ size(T(&)[N]) noexcept
|
|||||||
|
|
||||||
} /* boost */
|
} /* boost */
|
||||||
|
|
||||||
|
#endif // (defined(__cpp_lib_nonmember_container_access) ...
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ Distributed under the Boost Software License, Version 1.0.
|
|||||||
#if !defined(BOOST_NO_CXX11_CONSTEXPR) && !defined(BOOST_NO_CXX11_DECLTYPE)
|
#if !defined(BOOST_NO_CXX11_CONSTEXPR) && !defined(BOOST_NO_CXX11_DECLTYPE)
|
||||||
#include <boost/core/data.hpp>
|
#include <boost/core/data.hpp>
|
||||||
#include <boost/core/lightweight_test.hpp>
|
#include <boost/core/lightweight_test.hpp>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
class range {
|
class range {
|
||||||
public:
|
public:
|
||||||
@@ -52,12 +53,28 @@ void test_initializer_list()
|
|||||||
BOOST_TEST_EQ(boost::data(l), l.begin());
|
BOOST_TEST_EQ(boost::data(l), l.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_ambiguity_with_std_data()
|
||||||
|
{
|
||||||
|
// Note: This preprocessor check should be equivalent to that in boost/core/data.hpp
|
||||||
|
#if (defined(__cpp_lib_nonmember_container_access) && (__cpp_lib_nonmember_container_access >= 201411l)) || \
|
||||||
|
(defined(_MSC_VER) && (_MSC_VER >= 1900))
|
||||||
|
|
||||||
|
// https://github.com/boostorg/core/issues/206
|
||||||
|
range c;
|
||||||
|
using std::data;
|
||||||
|
using boost::data;
|
||||||
|
BOOST_TEST_EQ(data(c), c.data());
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test_range();
|
test_range();
|
||||||
test_const_range();
|
test_const_range();
|
||||||
test_array();
|
test_array();
|
||||||
test_initializer_list();
|
test_initializer_list();
|
||||||
|
test_ambiguity_with_std_data();
|
||||||
return boost::report_errors();
|
return boost::report_errors();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ Distributed under the Boost Software License, Version 1.0.
|
|||||||
#if !defined(BOOST_NO_CXX11_CONSTEXPR) && !defined(BOOST_NO_CXX11_DECLTYPE)
|
#if !defined(BOOST_NO_CXX11_CONSTEXPR) && !defined(BOOST_NO_CXX11_DECLTYPE)
|
||||||
#include <boost/core/size.hpp>
|
#include <boost/core/size.hpp>
|
||||||
#include <boost/core/lightweight_test.hpp>
|
#include <boost/core/lightweight_test.hpp>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
struct range {
|
struct range {
|
||||||
std::size_t size() const {
|
std::size_t size() const {
|
||||||
@@ -28,10 +29,26 @@ void test_array()
|
|||||||
BOOST_TEST_EQ(boost::size(a), 4);
|
BOOST_TEST_EQ(boost::size(a), 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_ambiguity_with_std_size()
|
||||||
|
{
|
||||||
|
// Note: This preprocessor check should be equivalent to that in boost/core/size.hpp
|
||||||
|
#if (defined(__cpp_lib_nonmember_container_access) && (__cpp_lib_nonmember_container_access >= 201411l)) || \
|
||||||
|
(defined(_MSC_VER) && (_MSC_VER >= 1900))
|
||||||
|
|
||||||
|
// https://github.com/boostorg/core/issues/206
|
||||||
|
range c;
|
||||||
|
using std::size;
|
||||||
|
using boost::size;
|
||||||
|
BOOST_TEST_EQ(size(c), c.size());
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test_range();
|
test_range();
|
||||||
test_array();
|
test_array();
|
||||||
|
test_ambiguity_with_std_size();
|
||||||
return boost::report_errors();
|
return boost::report_errors();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|||||||
Reference in New Issue
Block a user