102 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // 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 | ||
|  | 
 |