Chris@102: // Copyright Kevlin Henney, 2000-2005. Chris@102: // Copyright Alexander Nasonov, 2006-2010. Chris@102: // Copyright Antony Polukhin, 2011-2014. Chris@102: // Chris@102: // Distributed under the Boost Software License, Version 1.0. (See Chris@102: // accompanying file LICENSE_1_0.txt or copy at Chris@102: // http://www.boost.org/LICENSE_1_0.txt) Chris@102: // Chris@102: // what: lexical_cast custom keyword cast Chris@102: // who: contributed by Kevlin Henney, Chris@102: // enhanced with contributions from Terje Slettebo, Chris@102: // with additional fixes and suggestions from Gennaro Prota, Chris@102: // Beman Dawes, Dave Abrahams, Daryle Walker, Peter Dimov, Chris@102: // Alexander Nasonov, Antony Polukhin, Justin Viiret, Michael Hofmann, Chris@102: // Cheng Yang, Matthew Bradbury, David W. Birdsall, Pavel Korzh and other Boosters Chris@102: // when: November 2000, March 2003, June 2005, June 2006, March 2011 - 2014 Chris@102: Chris@102: #ifndef BOOST_LEXICAL_CAST_LEXICAL_CAST_OLD_HPP Chris@102: #define BOOST_LEXICAL_CAST_LEXICAL_CAST_OLD_HPP Chris@102: Chris@102: #include Chris@102: #ifdef BOOST_HAS_PRAGMA_ONCE Chris@102: # pragma once Chris@102: #endif Chris@102: Chris@102: #if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING) Chris@102: #define BOOST_LCAST_NO_WCHAR_T Chris@102: #endif Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #ifdef BOOST_NO_STRINGSTREAM Chris@102: #include Chris@102: #else Chris@102: #include Chris@102: #endif Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost { Chris@102: namespace detail Chris@102: { Chris@102: Chris@102: // selectors for choosing stream character type Chris@102: template Chris@102: struct stream_char Chris@102: { Chris@102: typedef char type; Chris@102: }; Chris@102: Chris@102: #ifndef BOOST_LCAST_NO_WCHAR_T Chris@102: #ifndef BOOST_NO_INTRINSIC_WCHAR_T Chris@102: template<> Chris@102: struct stream_char Chris@102: { Chris@102: typedef wchar_t type; Chris@102: }; Chris@102: #endif Chris@102: Chris@102: template<> Chris@102: struct stream_char Chris@102: { Chris@102: typedef wchar_t type; Chris@102: }; Chris@102: Chris@102: template<> Chris@102: struct stream_char Chris@102: { Chris@102: typedef wchar_t type; Chris@102: }; Chris@102: Chris@102: template<> Chris@102: struct stream_char Chris@102: { Chris@102: typedef wchar_t type; Chris@102: }; Chris@102: #endif Chris@102: Chris@102: // stream wrapper for handling lexical conversions Chris@102: template Chris@102: class lexical_stream Chris@102: { Chris@102: private: Chris@102: typedef typename widest_char< Chris@102: typename stream_char::type, Chris@102: typename stream_char::type>::type char_type; Chris@102: Chris@102: typedef Traits traits_type; Chris@102: Chris@102: public: Chris@102: lexical_stream(char_type* = 0, char_type* = 0) Chris@102: { Chris@102: stream.unsetf(std::ios::skipws); Chris@102: lcast_set_precision(stream, static_cast(0), static_cast(0) ); Chris@102: } Chris@102: ~lexical_stream() Chris@102: { Chris@102: #if defined(BOOST_NO_STRINGSTREAM) Chris@102: stream.freeze(false); Chris@102: #endif Chris@102: } Chris@102: bool operator<<(const Source &input) Chris@102: { Chris@102: return !(stream << input).fail(); Chris@102: } Chris@102: template Chris@102: bool operator>>(InputStreamable &output) Chris@102: { Chris@102: return !is_pointer::value && Chris@102: stream >> output && Chris@102: stream.get() == traits_type::eof(); Chris@102: } Chris@102: Chris@102: bool operator>>(std::string &output) Chris@102: { Chris@102: #if defined(BOOST_NO_STRINGSTREAM) Chris@102: stream << '\0'; Chris@102: #endif Chris@102: stream.str().swap(output); Chris@102: return true; Chris@102: } Chris@102: #ifndef BOOST_LCAST_NO_WCHAR_T Chris@102: bool operator>>(std::wstring &output) Chris@102: { Chris@102: stream.str().swap(output); Chris@102: return true; Chris@102: } Chris@102: #endif Chris@102: Chris@102: private: Chris@102: #if defined(BOOST_NO_STRINGSTREAM) Chris@102: std::strstream stream; Chris@102: #elif defined(BOOST_NO_STD_LOCALE) Chris@102: std::stringstream stream; Chris@102: #else Chris@102: std::basic_stringstream stream; Chris@102: #endif Chris@102: }; Chris@102: } Chris@102: Chris@102: // call-by-value fallback version (deprecated) Chris@102: Chris@102: template Chris@102: Target lexical_cast(Source arg) Chris@102: { Chris@102: typedef typename detail::widest_char< Chris@102: BOOST_DEDUCED_TYPENAME detail::stream_char::type Chris@102: , BOOST_DEDUCED_TYPENAME detail::stream_char::type Chris@102: >::type char_type; Chris@102: Chris@102: typedef std::char_traits traits; Chris@102: detail::lexical_stream interpreter; Chris@102: Target result; Chris@102: Chris@102: if(!(interpreter << arg && interpreter >> result)) Chris@102: boost::conversion::detail::throw_bad_cast(); Chris@102: return result; Chris@102: } Chris@102: Chris@102: } // namespace boost Chris@102: Chris@102: #undef BOOST_LCAST_NO_WCHAR_T Chris@102: Chris@102: #endif // BOOST_LEXICAL_CAST_LEXICAL_CAST_OLD_HPP Chris@102: