]> git.lyx.org Git - lyx.git/blobdiff - boost/boost/type_traits/conversion_traits.hpp
update boost to version 1.36
[lyx.git] / boost / boost / type_traits / conversion_traits.hpp
index f5642cdb9dfc1afb7d9af86b4de471eece3064e4..c8e5139b30d2974ebff3e21310d53e0706202850 100644 (file)
 
-// Copyright (C) 2000 John Maddock (john_maddock@compuserve.com)
-// Copyright (C) 2000 Jeremy Siek (jsiek@lsc.nd.edu)
-// Copyright (C) 1999, 2000 Jaakko J\84rvi (jaakko.jarvi@cs.utu.fi)
+// Copyright 2000 John Maddock (john@johnmaddock.co.uk)
+// Copyright 2000 Jeremy Siek (jsiek@lsc.nd.edu)
+// Copyright 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
 //
-// Permission to copy and use this software is granted, 
-// provided this copyright notice appears in all copies. 
-// Permission to modify the code and to distribute modified code is granted, 
-// provided this copyright notice appears in all copies, and a notice 
-// that the code was modified is included with the copyright notice.
+//  Use, modification and distribution are subject to 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).
 //
-// This software is provided "as is" without express or implied warranty, 
-// and with no claim as to its suitability for any purpose.
-//
-
-#ifndef BOOST_CONVERSION_TYPE_TRAITS_HPP
-#define BOOST_CONVERSION_TYPE_TRAITS_HPP
-
-#ifndef BOOST_ICE_TYPE_TRAITS_HPP
-#include <boost/type_traits/ice.hpp>
-#endif
-#ifndef BOOST_FWD_TYPE_TRAITS_HPP
-#include <boost/type_traits/fwd.hpp>
-#endif
-#ifndef BOOST_ARITHMETIC_TYPE_TRAITS_HPP
-#include <boost/type_traits/arithmetic_traits.hpp>
-#endif
-//
-// is one type convertable to another?
-//
-// there are multiple versions of the is_convertible
-// template, almost every compiler seems to require its
-// own version.
-//
-// Thanks to Andrei Alexandrescu for the original version of the
-// conversion detection technique!
-//
-
-namespace boost{
-
-#if defined(BOOST_MSVC) 
-
-//
-// MS specific version:
-//
-namespace detail{
-
-   // This workaround is necessary to handle when From is void
-   // which is normally taken care of by the partial specialization
-   // of the is_convertible class.
-   using ::boost::type_traits::yes_type;
-   using ::boost::type_traits::no_type;
-
-  struct from_not_void_conversion {
-    template <class From, class To>
-    struct n_bind {
-      static no_type BOOST_TT_DECL _m_check(...);
-      static yes_type BOOST_TT_DECL _m_check(To);
-    public:
-      void foo(); // avoid warning about all members being private
-      static From _m_from;
-      enum { exists = sizeof( _m_check(_m_from) ) == sizeof(yes_type) };
-    };
-  };
-  struct from_is_void_conversion {
-    template <class From, class To>
-    struct n_bind {
-       enum { exists = ::boost::is_void<To>::value };
-    };
-  };
-
-  template <class From>
-  struct conversion_helper {
-    typedef from_not_void_conversion type;
-  };
-  template <>
-  struct conversion_helper<void> {
-    typedef from_is_void_conversion type;
-  };
-} // namespace detail
-
-template <class From, class To>
-struct is_convertible
-{
- typedef typename detail::conversion_helper<From>::type Selector;
- typedef typename Selector::template n_bind<From,To> Conversion;
-public:
- enum { value = Conversion::exists };
-};
-
-#elif defined(__BORLANDC__)
-//
-// special version for Borland compilers
-// this version breaks when used for some
-// UDT conversions:
-//
-template <class From, class To>
-struct is_convertible
-{
-private:
-#pragma option push -w-8074
-   // This workaround for Borland breaks the EDG C++ frontend,
-   // so we only use it for Borland.
-   template <class T>
-   struct checker
-   {
-      static type_traits::no_type BOOST_TT_DECL _m_check(...);
-      static type_traits::yes_type BOOST_TT_DECL _m_check(T);
-   };
-   static From _m_from;
-public:
-   static const bool value = sizeof( checker<To>::_m_check(_m_from) ) == sizeof(type_traits::yes_type);
-
-   void foo(); // avoid warning about all members being private
-#pragma option pop
-};
-
-#elif defined(__GNUC__)
-//
-// special version for gcc compiler
-//
-namespace detail{
-   struct any_conversion
-   {
-      template <class T>
-      any_conversion(const T&);
-      template <class T>
-      any_conversion(T&);
-   };
-   template <class T>
-   struct checker
-   {
-      static boost::type_traits::no_type _m_check(any_conversion ...);
-      static boost::type_traits::yes_type _m_check(T, int);
-   };
-} // namespace detail
-template <class From, class To>
-struct is_convertible
-{
-private:
-   static From _m_from;
-public:
-   static const bool value = sizeof( detail::checker<To>::_m_check(_m_from, 0) ) == sizeof(type_traits::yes_type);
-
-   void foo(); // avoid warning about all members being private
-};
-
-// Declare specializations of is_convertible for all of the floating
-// types to all of the integral types. This suppresses some nasty
-// warnings
-
-# define BOOST_IS_CONVERTIBLE(T1,T2) template<>struct is_convertible<T1,T2>{static const bool value=true;};
-# define BOOST_IS_CONVERTIBLE2(T1,T2)        \
-        BOOST_IS_CONVERTIBLE(T1,signed T2)   \
-        BOOST_IS_CONVERTIBLE(T1,unsigned T2)
-            
-# define BOOST_FLOAT_IS_CONVERTIBLE(F)  \
-   BOOST_IS_CONVERTIBLE(F,char)         \
-   BOOST_IS_CONVERTIBLE2(F,char)        \
-   BOOST_IS_CONVERTIBLE2(F,short)       \
-   BOOST_IS_CONVERTIBLE2(F,int)         \
-   BOOST_IS_CONVERTIBLE2(F,long)        \
-   BOOST_IS_CONVERTIBLE2(F,long long)
-
-BOOST_FLOAT_IS_CONVERTIBLE(float)
-BOOST_FLOAT_IS_CONVERTIBLE(double)
-BOOST_FLOAT_IS_CONVERTIBLE(long double)
-BOOST_FLOAT_IS_CONVERTIBLE(float const)
-BOOST_FLOAT_IS_CONVERTIBLE(double const)
-BOOST_FLOAT_IS_CONVERTIBLE(long double const)
-BOOST_FLOAT_IS_CONVERTIBLE(float volatile)
-BOOST_FLOAT_IS_CONVERTIBLE(double volatile)
-BOOST_FLOAT_IS_CONVERTIBLE(long double volatile)
-BOOST_FLOAT_IS_CONVERTIBLE(float const volatile)
-BOOST_FLOAT_IS_CONVERTIBLE(double const volatile)
-BOOST_FLOAT_IS_CONVERTIBLE(long double const volatile)
-# undef BOOST_FLOAT_IS_CONVERTIBLE
-# undef BOOST_IS_CONVERTIBLE2
-# undef BOOST_IS_CONVERTIBLE
-#else
-
-template <class From, class To>
-struct is_convertible
-{
-private:
-   static type_traits::no_type BOOST_TT_DECL _m_check(...);
-   static type_traits::yes_type BOOST_TT_DECL _m_check(To);
-   static From _m_from;
-public:
-   BOOST_STATIC_CONSTANT(bool, value = sizeof( _m_check(_m_from) ) == sizeof(type_traits::yes_type));
-   void foo(); // avoid warning about all members being private
-};
-
-#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
-//  A definition is required even for integral static constants
-template <class From, class To>
-const bool is_convertible<From, To>::value;
-#endif
-
-
-#endif // is_convertible
-
-//
-// Now add the full and partial specialisations
-// for void types, these are common to all the
-// implementation above:
-//
-#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
-template <class From>
-struct is_convertible<From, void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = false);
-};
-#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-template <class From>
-struct is_convertible<From, const void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = false);
-};
-template <class From>
-struct is_convertible<From, volatile void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = false);
-};
-template <class From>
-struct is_convertible<From, const volatile void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = false);
-};
-#endif // BOOST_NO_CV_VOID_SPECIALIZATIONS
-
-template <class To>
-struct is_convertible<void, To>
-{
-   BOOST_STATIC_CONSTANT(bool, value = false);
-};
-#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-template <class To>
-struct is_convertible<const void, To>
-{
-   BOOST_STATIC_CONSTANT(bool, value = false);
-};
-template <class To>
-struct is_convertible<volatile void, To>
-{
-   BOOST_STATIC_CONSTANT(bool, value = false);
-};
-template <class To>
-struct is_convertible<const volatile void, To>
-{
-   BOOST_STATIC_CONSTANT(bool, value = false);
-};
-#endif
-#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
-
-template <>
-struct is_convertible<void, void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-template <>
-struct is_convertible<void, const void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-template <>
-struct is_convertible<void, volatile void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-template <>
-struct is_convertible<void, const volatile void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-template <>
-struct is_convertible<const void, const void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-template <>
-struct is_convertible<const void, volatile void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-template <>
-struct is_convertible<const void, const volatile void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-template <>
-struct is_convertible<volatile void, const void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-template <>
-struct is_convertible<volatile void, volatile void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-template <>
-struct is_convertible<volatile void, const volatile void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-template <>
-struct is_convertible<const volatile void, const void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-template <>
-struct is_convertible<const volatile void, volatile void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-template <>
-struct is_convertible<const volatile void, const volatile void>
-{
-   BOOST_STATIC_CONSTANT(bool, value = true);
-};
-#endif
-
-} // namespace boost
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
 
-#endif  // include guard
+#ifndef BOOST_TT_CONVERSION_TRAITS_HPP_INCLUDED
+#define BOOST_TT_CONVERSION_TRAITS_HPP_INCLUDED
 
+#include <boost/type_traits/is_convertible.hpp>
 
+#endif // BOOST_TT_CONVERSION_TRAITS_HPP_INCLUDED