ossrv_pub/boost_apis/boost/cast.hpp
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 //  boost cast.hpp header file  ----------------------------------------------//
       
     2 
       
     3 //  (C) Copyright Kevlin Henney and Dave Abrahams 1999.
       
     4 //  Distributed under the Boost
       
     5 //  Software License, Version 1.0. (See accompanying file
       
     6 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       
     7 
       
     8 //  See http://www.boost.org/libs/conversion for Documentation.
       
     9 
       
    10 //  Revision History
       
    11 //  23 JUn 05  numeric_cast removed and redirected to the new verion (Fernando Cacciola)
       
    12 //  02 Apr 01  Removed BOOST_NO_LIMITS workarounds and included
       
    13 //             <boost/limits.hpp> instead (the workaround did not
       
    14 //             actually compile when BOOST_NO_LIMITS was defined in
       
    15 //             any case, so we loose nothing). (John Maddock)
       
    16 //  21 Jan 01  Undid a bug I introduced yesterday. numeric_cast<> never
       
    17 //             worked with stock GCC; trying to get it to do that broke
       
    18 //             vc-stlport.
       
    19 //  20 Jan 01  Moved BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS to config.hpp.
       
    20 //             Removed unused BOOST_EXPLICIT_TARGET macro. Moved
       
    21 //             boost::detail::type to boost/type.hpp. Made it compile with
       
    22 //             stock gcc again (Dave Abrahams)
       
    23 //  29 Nov 00  Remove nested namespace cast, cleanup spacing before Formal
       
    24 //             Review (Beman Dawes)
       
    25 //  19 Oct 00  Fix numeric_cast for floating-point types (Dave Abrahams)
       
    26 //  15 Jul 00  Suppress numeric_cast warnings for GCC, Borland and MSVC
       
    27 //             (Dave Abrahams)
       
    28 //  30 Jun 00  More MSVC6 wordarounds.  See comments below.  (Dave Abrahams)
       
    29 //  28 Jun 00  Removed implicit_cast<>.  See comment below. (Beman Dawes)
       
    30 //  27 Jun 00  More MSVC6 workarounds
       
    31 //  15 Jun 00  Add workarounds for MSVC6
       
    32 //   2 Feb 00  Remove bad_numeric_cast ";" syntax error (Doncho Angelov)
       
    33 //  26 Jan 00  Add missing throw() to bad_numeric_cast::what(0 (Adam Levar)
       
    34 //  29 Dec 99  Change using declarations so usages in other namespaces work
       
    35 //             correctly (Dave Abrahams)
       
    36 //  23 Sep 99  Change polymorphic_downcast assert to also detect M.I. errors
       
    37 //             as suggested Darin Adler and improved by Valentin Bonnard.
       
    38 //   2 Sep 99  Remove controversial asserts, simplify, rename.
       
    39 //  30 Aug 99  Move to cast.hpp, replace value_cast with numeric_cast,
       
    40 //             place in nested namespace.
       
    41 //   3 Aug 99  Initial version
       
    42 
       
    43 #ifndef BOOST_CAST_HPP
       
    44 #define BOOST_CAST_HPP
       
    45 
       
    46 # include <boost/config.hpp>
       
    47 # include <boost/assert.hpp>
       
    48 # include <typeinfo>
       
    49 # include <boost/type.hpp>
       
    50 # include <boost/limits.hpp>
       
    51 # include <boost/detail/select_type.hpp>
       
    52 
       
    53 //  It has been demonstrated numerous times that MSVC 6.0 fails silently at link
       
    54 //  time if you use a template function which has template parameters that don't
       
    55 //  appear in the function's argument list.
       
    56 //
       
    57 //  TODO: Add this to config.hpp?
       
    58 # if defined(BOOST_MSVC) && BOOST_MSVC < 1300
       
    59 #  define BOOST_EXPLICIT_DEFAULT_TARGET , ::boost::type<Target>* = 0
       
    60 # else
       
    61 #  define BOOST_EXPLICIT_DEFAULT_TARGET
       
    62 # endif
       
    63 
       
    64 namespace boost
       
    65 {
       
    66 //  See the documentation for descriptions of how to choose between
       
    67 //  static_cast<>, dynamic_cast<>, polymorphic_cast<> and polymorphic_downcast<>
       
    68 
       
    69 //  polymorphic_cast  --------------------------------------------------------//
       
    70 
       
    71     //  Runtime checked polymorphic downcasts and crosscasts.
       
    72     //  Suggested in The C++ Programming Language, 3rd Ed, Bjarne Stroustrup,
       
    73     //  section 15.8 exercise 1, page 425.
       
    74 
       
    75     template <class Target, class Source>
       
    76     inline Target polymorphic_cast(Source* x BOOST_EXPLICIT_DEFAULT_TARGET)
       
    77     {
       
    78         Target tmp = dynamic_cast<Target>(x);
       
    79         if ( tmp == 0 ) throw std::bad_cast();
       
    80         return tmp;
       
    81     }
       
    82 
       
    83 //  polymorphic_downcast  ----------------------------------------------------//
       
    84 
       
    85     //  BOOST_ASSERT() checked polymorphic downcast.  Crosscasts prohibited.
       
    86 
       
    87     //  WARNING: Because this cast uses BOOST_ASSERT(), it violates
       
    88     //  the One Definition Rule if used in multiple translation units
       
    89     //  where BOOST_DISABLE_ASSERTS, BOOST_ENABLE_ASSERT_HANDLER
       
    90     //  NDEBUG are defined inconsistently.
       
    91 
       
    92     //  Contributed by Dave Abrahams
       
    93 
       
    94     template <class Target, class Source>
       
    95     inline Target polymorphic_downcast(Source* x BOOST_EXPLICIT_DEFAULT_TARGET)
       
    96     {
       
    97         BOOST_ASSERT( dynamic_cast<Target>(x) == x );  // detect logic error
       
    98         return static_cast<Target>(x);
       
    99     }
       
   100 
       
   101 #  undef BOOST_EXPLICIT_DEFAULT_TARGET
       
   102 
       
   103 } // namespace boost
       
   104 
       
   105 # include <boost/numeric/conversion/cast.hpp>
       
   106 
       
   107 #endif  // BOOST_CAST_HPP