Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/cast.hpp @ 101:c530137014c0
Update Boost headers (1.58.0)
author | Chris Cannam |
---|---|
date | Mon, 07 Sep 2015 11:12:49 +0100 |
parents | 2665513ce2d3 |
children |
comparison
equal
deleted
inserted
replaced
100:793467b5e61c | 101:c530137014c0 |
---|---|
1 // boost cast.hpp header file ----------------------------------------------// | 1 // boost cast.hpp header file |
2 | 2 // |
3 // (C) Copyright Kevlin Henney and Dave Abrahams 1999. | 3 // (C) Copyright Antony Polukhin 2014. |
4 // | |
4 // Distributed under the Boost | 5 // Distributed under the Boost |
5 // Software License, Version 1.0. (See accompanying file | 6 // 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 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
7 | 8 // |
8 // See http://www.boost.org/libs/conversion for Documentation. | 9 // See http://www.boost.org/libs/conversion for Documentation. |
9 | 10 |
10 // Revision History | 11 // This is a DEPRECATED header file! |
11 // 23 JUn 05 numeric_cast removed and redirected to the new verion (Fernando Cacciola) | 12 // Use <boost/polymorphic_cast.hpp> or <boost/numeric/conversion/cast.hpp> instead |
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 | 13 |
43 #ifndef BOOST_CAST_HPP | 14 #ifndef BOOST_CAST_HPP |
44 #define BOOST_CAST_HPP | 15 #define BOOST_CAST_HPP |
45 | 16 |
46 # include <boost/config.hpp> | 17 # include <boost/polymorphic_cast.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> | 18 # include <boost/numeric/conversion/cast.hpp> |
106 | 19 |
107 #endif // BOOST_CAST_HPP | 20 #endif // BOOST_CAST_HPP |