diff options
Diffstat (limited to '3rdParty/Boost/src/boost/variant/detail/forced_return.hpp')
-rw-r--r-- | 3rdParty/Boost/src/boost/variant/detail/forced_return.hpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/variant/detail/forced_return.hpp b/3rdParty/Boost/src/boost/variant/detail/forced_return.hpp new file mode 100644 index 0000000..cc1f25b --- /dev/null +++ b/3rdParty/Boost/src/boost/variant/detail/forced_return.hpp @@ -0,0 +1,104 @@ +//----------------------------------------------------------------------------- +// boost variant/detail/forced_return.hpp header file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2003 +// Eric Friedman +// +// 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) + +#ifndef BOOST_VARIANT_DETAIL_FORCED_RETURN_HPP +#define BOOST_VARIANT_DETAIL_FORCED_RETURN_HPP + +#include "boost/config.hpp" +#include "boost/variant/detail/generic_result_type.hpp" +#include "boost/assert.hpp" + +#if !defined(BOOST_MSVC) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) +# include "boost/type_traits/remove_reference.hpp" +#endif + +namespace boost { +namespace detail { namespace variant { + +/////////////////////////////////////////////////////////////////////////////// +// (detail) function template forced_return +// +// Logical error to permit invocation at runtime, but (artificially) satisfies +// compile-time requirement of returning a result value. +// + +#if !defined(BOOST_MSVC) \ + && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ + && !defined(BOOST_NO_VOID_RETURNS) + +// "standard" implementation: + +template <typename T> +inline T forced_return( BOOST_EXPLICIT_TEMPLATE_TYPE(T) ) +{ + // logical error: should never be here! (see above) + BOOST_ASSERT(false); + + typedef typename boost::remove_reference<T>::type basic_type; + basic_type* dummy = 0; + return *static_cast< basic_type* >(dummy); +} + +template <> +inline void forced_return<void>( BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(void) ) +{ + // logical error: should never be here! (see above) + BOOST_ASSERT(false); +} + +#elif !defined(BOOST_MSVC) + +// workaround implementation +// +// TODO: Determine the most efficient way to handle this -- as below? by +// throwing? by recursive call to forced_return itself? etc. +// + +template <typename T> +inline + BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(T) +forced_return( BOOST_EXPLICIT_TEMPLATE_TYPE(T) ) +{ + // logical error: should never be here! (see above) + BOOST_ASSERT(false); + + BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(T) (*dummy)() = 0; + return dummy(); +} + +#else // defined(BOOST_MSVC) + +// msvc-specific implementation +// +// Leverages __declspec(noreturn) for optimized implementation. +// + +__declspec(noreturn) +inline void forced_return_no_return() {}; + +template <typename T> +inline + BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(T) +forced_return( BOOST_EXPLICIT_TEMPLATE_TYPE(T) ) +{ + // logical error: should never be here! (see above) + BOOST_ASSERT(false); + + forced_return_no_return(); +} + +#endif // BOOST_MSVC optimization + +}} // namespace detail::variant +} // namespace boost + +#endif // BOOST_VARIANT_DETAIL_FORCED_RETURN_HPP |