mirror of
https://github.com/boostorg/conversion.git
synced 2025-07-30 12:37:24 +02:00
@ -14,9 +14,5 @@ target_link_libraries( boost_conversion
|
|||||||
INTERFACE
|
INTERFACE
|
||||||
Boost::assert
|
Boost::assert
|
||||||
Boost::config
|
Boost::config
|
||||||
Boost::core
|
|
||||||
Boost::smart_ptr
|
|
||||||
Boost::throw_exception
|
Boost::throw_exception
|
||||||
Boost::type_traits
|
|
||||||
Boost::typeof
|
|
||||||
)
|
)
|
||||||
|
@ -11,22 +11,9 @@
|
|||||||
# pragma once
|
# pragma once
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <boost/config/pragma_message.hpp>
|
|
||||||
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \
|
|
||||||
defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) || \
|
|
||||||
defined(BOOST_NO_CXX11_CONSTEXPR) || \
|
|
||||||
defined(BOOST_NO_CXX11_NULLPTR) || \
|
|
||||||
defined(BOOST_NO_CXX11_NOEXCEPT) || \
|
|
||||||
defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || \
|
|
||||||
defined(BOOST_NO_CXX11_FINAL) || \
|
|
||||||
defined(BOOST_NO_CXX11_ALIGNOF) || \
|
|
||||||
defined(BOOST_NO_CXX11_STATIC_ASSERT) || \
|
|
||||||
defined(BOOST_NO_CXX11_SMART_PTR) || \
|
|
||||||
defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) || \
|
|
||||||
defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
|
|
||||||
|
|
||||||
BOOST_PRAGMA_MESSAGE("C++03 support is deprecated in Boost.Conversion 1.82 and will be removed in Boost.Conversion 1.84.")
|
|
||||||
|
|
||||||
|
#if defined(BOOST_NO_CXX11_CONSTEXPR)
|
||||||
|
#error C++03 support is removed in Boost.Conversion 1.84
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
@ -46,7 +33,7 @@ template<class T> struct icast_identity
|
|||||||
// The use of identity creates a non-deduced form, so that the
|
// The use of identity creates a non-deduced form, so that the
|
||||||
// explicit template argument must be supplied
|
// explicit template argument must be supplied
|
||||||
template <typename T>
|
template <typename T>
|
||||||
BOOST_CONSTEXPR inline T implicit_cast (typename boost::detail::icast_identity<T>::type x) {
|
constexpr T implicit_cast (typename boost::detail::icast_identity<T>::type x) {
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,38 +49,24 @@
|
|||||||
#ifndef BOOST_POLYMORPHIC_CAST_HPP
|
#ifndef BOOST_POLYMORPHIC_CAST_HPP
|
||||||
#define BOOST_POLYMORPHIC_CAST_HPP
|
#define BOOST_POLYMORPHIC_CAST_HPP
|
||||||
|
|
||||||
# include <boost/config.hpp>
|
#include <boost/config/assert_cxx11.hpp>
|
||||||
|
|
||||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||||
# pragma once
|
# pragma once
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <boost/config/pragma_message.hpp>
|
|
||||||
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \
|
|
||||||
defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) || \
|
|
||||||
defined(BOOST_NO_CXX11_CONSTEXPR) || \
|
|
||||||
defined(BOOST_NO_CXX11_NULLPTR) || \
|
|
||||||
defined(BOOST_NO_CXX11_NOEXCEPT) || \
|
|
||||||
defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || \
|
|
||||||
defined(BOOST_NO_CXX11_FINAL) || \
|
|
||||||
defined(BOOST_NO_CXX11_ALIGNOF) || \
|
|
||||||
defined(BOOST_NO_CXX11_STATIC_ASSERT) || \
|
|
||||||
defined(BOOST_NO_CXX11_SMART_PTR) || \
|
|
||||||
defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) || \
|
|
||||||
defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
|
|
||||||
|
|
||||||
BOOST_PRAGMA_MESSAGE("C++03 support is deprecated in Boost.Conversion 1.82 and will be removed in Boost.Conversion 1.84.")
|
|
||||||
|
|
||||||
|
#if defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
|
||||||
|
#error C++03 support is removed in Boost.Conversion 1.84
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <boost/assert.hpp>
|
|
||||||
# include <boost/core/addressof.hpp>
|
|
||||||
# include <boost/core/enable_if.hpp>
|
|
||||||
# include <boost/throw_exception.hpp>
|
|
||||||
# include <boost/type_traits/is_reference.hpp>
|
|
||||||
# include <boost/type_traits/remove_reference.hpp>
|
|
||||||
|
|
||||||
|
# include <boost/assert.hpp>
|
||||||
|
# include <boost/throw_exception.hpp>
|
||||||
|
|
||||||
|
# include <memory> // std::addressof
|
||||||
# include <typeinfo>
|
# include <typeinfo>
|
||||||
|
# include <type_traits>
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
@ -129,13 +115,13 @@ namespace boost
|
|||||||
// Contributed by Julien Delacroix
|
// Contributed by Julien Delacroix
|
||||||
|
|
||||||
template <class Target, class Source>
|
template <class Target, class Source>
|
||||||
inline typename boost::enable_if_c<
|
inline typename std::enable_if<
|
||||||
boost::is_reference<Target>::value, Target
|
std::is_reference<Target>::value, Target
|
||||||
>::type polymorphic_downcast(Source& x)
|
>::type polymorphic_downcast(Source& x)
|
||||||
{
|
{
|
||||||
typedef typename boost::remove_reference<Target>::type* target_pointer_type;
|
typedef typename std::remove_reference<Target>::type* target_pointer_type;
|
||||||
return *boost::polymorphic_downcast<target_pointer_type>(
|
return *boost::polymorphic_downcast<target_pointer_type>(
|
||||||
boost::addressof(x)
|
std::addressof(x)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,31 +15,16 @@
|
|||||||
# pragma once
|
# pragma once
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) || defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) || defined(BOOST_NO_CXX11_DECLTYPE)
|
||||||
|
#error C++03 support is removed in Boost.Conversion 1.84
|
||||||
|
#endif
|
||||||
|
|
||||||
# include <boost/assert.hpp>
|
# include <boost/assert.hpp>
|
||||||
# include <boost/pointer_cast.hpp>
|
# include <boost/pointer_cast.hpp>
|
||||||
# include <boost/throw_exception.hpp>
|
# include <boost/throw_exception.hpp>
|
||||||
# include <boost/utility/declval.hpp>
|
|
||||||
# ifdef BOOST_NO_CXX11_DECLTYPE
|
|
||||||
# include <boost/typeof/typeof.hpp>
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#include <boost/config/pragma_message.hpp>
|
# include <utility> // std::declval
|
||||||
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \
|
|
||||||
defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) || \
|
|
||||||
defined(BOOST_NO_CXX11_CONSTEXPR) || \
|
|
||||||
defined(BOOST_NO_CXX11_NULLPTR) || \
|
|
||||||
defined(BOOST_NO_CXX11_NOEXCEPT) || \
|
|
||||||
defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || \
|
|
||||||
defined(BOOST_NO_CXX11_FINAL) || \
|
|
||||||
defined(BOOST_NO_CXX11_ALIGNOF) || \
|
|
||||||
defined(BOOST_NO_CXX11_STATIC_ASSERT) || \
|
|
||||||
defined(BOOST_NO_CXX11_SMART_PTR) || \
|
|
||||||
defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) || \
|
|
||||||
defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
|
|
||||||
|
|
||||||
BOOST_PRAGMA_MESSAGE("C++03 support is deprecated in Boost.Conversion 1.82 and will be removed in Boost.Conversion 1.84.")
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
@ -62,19 +47,11 @@ namespace boost
|
|||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
template <typename Target, typename Source>
|
template <typename Target, typename Source>
|
||||||
struct dynamic_pointer_cast_result
|
using dynamic_pointer_cast_result = decltype(dynamic_pointer_cast<Target>(std::declval<Source>()));
|
||||||
{
|
|
||||||
#ifdef BOOST_NO_CXX11_DECLTYPE
|
|
||||||
BOOST_TYPEOF_NESTED_TYPEDEF_TPL(nested, dynamic_pointer_cast<Target>(boost::declval<Source>()))
|
|
||||||
typedef typename nested::type type;
|
|
||||||
#else
|
|
||||||
typedef decltype(dynamic_pointer_cast<Target>(boost::declval<Source>())) type;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Target, typename Source>
|
template <typename Target, typename Source>
|
||||||
inline typename detail::dynamic_pointer_cast_result<Target, Source>::type
|
inline detail::dynamic_pointer_cast_result<Target, Source>
|
||||||
polymorphic_pointer_downcast (const Source& x)
|
polymorphic_pointer_downcast (const Source& x)
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(dynamic_pointer_cast<Target> (x) == x);
|
BOOST_ASSERT(dynamic_pointer_cast<Target> (x) == x);
|
||||||
@ -82,13 +59,11 @@ namespace boost
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename Target, typename Source>
|
template <typename Target, typename Source>
|
||||||
inline typename detail::dynamic_pointer_cast_result<Target, Source>::type
|
inline detail::dynamic_pointer_cast_result<Target, Source>
|
||||||
polymorphic_pointer_cast (const Source& x)
|
polymorphic_pointer_cast (const Source& x)
|
||||||
{
|
{
|
||||||
typename detail::dynamic_pointer_cast_result<Target, Source>::type tmp
|
auto tmp = dynamic_pointer_cast<Target> (x);
|
||||||
= dynamic_pointer_cast<Target> (x);
|
|
||||||
if ( !tmp ) boost::throw_exception( std::bad_cast() );
|
if ( !tmp ) boost::throw_exception( std::bad_cast() );
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,11 +8,11 @@
|
|||||||
import testing ;
|
import testing ;
|
||||||
import feature ;
|
import feature ;
|
||||||
|
|
||||||
|
import ../../config/checks/config : requires ;
|
||||||
|
|
||||||
project
|
project
|
||||||
: requirements
|
: requirements
|
||||||
<toolset>gcc-4.7:<cxxflags>-ftrapv
|
[ requires cxx11 ]
|
||||||
<toolset>gcc-4.6:<cxxflags>-ftrapv
|
|
||||||
<toolset>clang:<cxxflags>-ftrapv
|
|
||||||
# default to all warnings on:
|
# default to all warnings on:
|
||||||
<warnings>all
|
<warnings>all
|
||||||
# set warnings as errors for those compilers we know we get warning free:
|
# set warnings as errors for those compilers we know we get warning free:
|
||||||
|
@ -35,7 +35,7 @@ int main()
|
|||||||
(void)z;
|
(void)z;
|
||||||
|
|
||||||
|
|
||||||
BOOST_CONSTEXPR long value = boost::implicit_cast<long>(42);
|
constexpr long value = boost::implicit_cast<long>(42);
|
||||||
BOOST_TEST(value == 42L);
|
BOOST_TEST(value == 42L);
|
||||||
|
|
||||||
return boost::report_errors();
|
return boost::report_errors();
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
// Copyright 1999 Dave Abrahams
|
// Copyright 1999 Dave Abrahams
|
||||||
// Copyright 2014 Peter Dimov
|
// Copyright 2014 Peter Dimov
|
||||||
// Copyright 2014 Boris Rasin, Antony Polukhin
|
// Copyright 2014 Boris Rasin, Antony Polukhin
|
||||||
|
// Copyright 2023 Antony Polukhin
|
||||||
//
|
//
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
// Distributed under the Boost Software License, Version 1.0.
|
||||||
//
|
//
|
||||||
@ -237,8 +238,6 @@ static void test_polymorphic_pointer_downcast_intrusive()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef BOOST_NO_CXX11_SMART_PTR
|
|
||||||
|
|
||||||
static void test_polymorphic_pointer_downcast_std_shared()
|
static void test_polymorphic_pointer_downcast_std_shared()
|
||||||
{
|
{
|
||||||
std::shared_ptr<Base> base (new Derived);
|
std::shared_ptr<Base> base (new Derived);
|
||||||
@ -253,8 +252,6 @@ static void test_polymorphic_pointer_downcast_std_shared()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void test_polymorphic_cast_fail()
|
static void test_polymorphic_cast_fail()
|
||||||
{
|
{
|
||||||
Base * base = new Base;
|
Base * base = new Base;
|
||||||
@ -272,9 +269,7 @@ static void test_polymorphic_pointer_cast_fail()
|
|||||||
|
|
||||||
BOOST_TEST_THROWS( boost::polymorphic_pointer_cast<Derived>( boost::shared_ptr<Base>(new Base) ), std::bad_cast );
|
BOOST_TEST_THROWS( boost::polymorphic_pointer_cast<Derived>( boost::shared_ptr<Base>(new Base) ), std::bad_cast );
|
||||||
|
|
||||||
#ifndef BOOST_NO_CXX11_SMART_PTR
|
|
||||||
BOOST_TEST_THROWS( boost::polymorphic_pointer_cast<Derived>( std::shared_ptr<Base>(new Base) ), std::bad_cast );
|
BOOST_TEST_THROWS( boost::polymorphic_pointer_cast<Derived>( std::shared_ptr<Base>(new Base) ), std::bad_cast );
|
||||||
#endif
|
|
||||||
|
|
||||||
BOOST_TEST_THROWS( boost::polymorphic_pointer_cast<Derived>( boost::intrusive_ptr<Base>(new Base) ), std::bad_cast );
|
BOOST_TEST_THROWS( boost::polymorphic_pointer_cast<Derived>( boost::intrusive_ptr<Base>(new Base) ), std::bad_cast );
|
||||||
}
|
}
|
||||||
@ -337,7 +332,6 @@ static void test_polymorphic_pointer_downcast_boost_shared_fail()
|
|||||||
expect_assertion = false;
|
expect_assertion = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef BOOST_NO_CXX11_SMART_PTR
|
|
||||||
|
|
||||||
static void test_polymorphic_pointer_downcast_std_shared_fail()
|
static void test_polymorphic_pointer_downcast_std_shared_fail()
|
||||||
{
|
{
|
||||||
@ -352,7 +346,6 @@ static void test_polymorphic_pointer_downcast_std_shared_fail()
|
|||||||
expect_assertion = false;
|
expect_assertion = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void test_polymorphic_pointer_downcast_intrusive_fail()
|
static void test_polymorphic_pointer_downcast_intrusive_fail()
|
||||||
{
|
{
|
||||||
@ -382,10 +375,9 @@ int main()
|
|||||||
test_polymorphic_pointer_downcast_boost_shared_fail();
|
test_polymorphic_pointer_downcast_boost_shared_fail();
|
||||||
test_polymorphic_pointer_downcast_intrusive_fail();
|
test_polymorphic_pointer_downcast_intrusive_fail();
|
||||||
|
|
||||||
#ifndef BOOST_NO_CXX11_SMART_PTR
|
|
||||||
test_polymorphic_pointer_downcast_std_shared();
|
test_polymorphic_pointer_downcast_std_shared();
|
||||||
test_polymorphic_pointer_downcast_std_shared_fail();
|
test_polymorphic_pointer_downcast_std_shared_fail();
|
||||||
#endif
|
|
||||||
|
|
||||||
return boost::report_errors();
|
return boost::report_errors();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user