epoc32/include/stdapis/boost/cast.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
     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