102 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright Kevlin Henney, 2000-2005.
 | |
| // Copyright Alexander Nasonov, 2006-2010.
 | |
| // Copyright Antony Polukhin, 2011-2014.
 | |
| //
 | |
| // 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)
 | |
| //
 | |
| // what:  lexical_cast custom keyword cast
 | |
| // who:   contributed by Kevlin Henney,
 | |
| //        enhanced with contributions from Terje Slettebo,
 | |
| //        with additional fixes and suggestions from Gennaro Prota,
 | |
| //        Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov,
 | |
| //        Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann,
 | |
| //        Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters
 | |
| // when:  November 2000, March 2003, June 2005, June 2006, March 2011 - 2014
 | |
| 
 | |
| #ifndef BOOST_LEXICAL_CAST_BAD_LEXICAL_CAST_HPP
 | |
| #define BOOST_LEXICAL_CAST_BAD_LEXICAL_CAST_HPP
 | |
| 
 | |
| #include <boost/config.hpp>
 | |
| #ifdef BOOST_HAS_PRAGMA_ONCE
 | |
| #   pragma once
 | |
| #endif
 | |
| 
 | |
| #include <typeinfo>
 | |
| #include <exception>
 | |
| #include <boost/throw_exception.hpp>
 | |
| 
 | |
| namespace boost
 | |
| {
 | |
|     // exception used to indicate runtime lexical_cast failure
 | |
|     class BOOST_SYMBOL_VISIBLE bad_lexical_cast :
 | |
|     // workaround MSVC bug with std::bad_cast when _HAS_EXCEPTIONS == 0 
 | |
| #if defined(BOOST_MSVC) && defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS 
 | |
|         public std::exception 
 | |
| #else 
 | |
|         public std::bad_cast 
 | |
| #endif 
 | |
| 
 | |
| #if defined(__BORLANDC__) && BOOST_WORKAROUND( __BORLANDC__, < 0x560 )
 | |
|         // under bcc32 5.5.1 bad_cast doesn't derive from exception
 | |
|         , public std::exception
 | |
| #endif
 | |
| 
 | |
|     {
 | |
|     public:
 | |
|         bad_lexical_cast() BOOST_NOEXCEPT
 | |
| #ifndef BOOST_NO_TYPEID
 | |
|            : source(&typeid(void)), target(&typeid(void))
 | |
| #endif
 | |
|         {}
 | |
| 
 | |
|         virtual const char *what() const BOOST_NOEXCEPT_OR_NOTHROW {
 | |
|             return "bad lexical cast: "
 | |
|                    "source type value could not be interpreted as target";
 | |
|         }
 | |
| 
 | |
|         virtual ~bad_lexical_cast() BOOST_NOEXCEPT_OR_NOTHROW
 | |
|         {}
 | |
| 
 | |
| #ifndef BOOST_NO_TYPEID
 | |
|         bad_lexical_cast(
 | |
|                 const std::type_info &source_type_arg,
 | |
|                 const std::type_info &target_type_arg) BOOST_NOEXCEPT
 | |
|             : source(&source_type_arg), target(&target_type_arg)
 | |
|         {}
 | |
| 
 | |
|         const std::type_info &source_type() const BOOST_NOEXCEPT {
 | |
|             return *source;
 | |
|         }
 | |
| 
 | |
|         const std::type_info &target_type() const BOOST_NOEXCEPT {
 | |
|             return *target;
 | |
|         }
 | |
| 
 | |
|     private:
 | |
|         const std::type_info *source;
 | |
|         const std::type_info *target;
 | |
| #endif
 | |
|     };
 | |
| 
 | |
|     namespace conversion { namespace detail {
 | |
| #ifdef BOOST_NO_TYPEID
 | |
|         template <class S, class T>
 | |
|         inline void throw_bad_cast() {
 | |
|             boost::throw_exception(bad_lexical_cast());
 | |
|         }
 | |
| #else
 | |
|         template <class S, class T>
 | |
|         inline void throw_bad_cast() {
 | |
|             boost::throw_exception(bad_lexical_cast(typeid(S), typeid(T)));
 | |
|         }
 | |
| #endif
 | |
|     }} // namespace conversion::detail
 | |
| 
 | |
| 
 | |
| } // namespace boost
 | |
| 
 | |
| #endif // BOOST_LEXICAL_CAST_BAD_LEXICAL_CAST_HPP
 | |
| 
 | 
