1 //Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. 2 3 //Distributed under the Boost Software License, Version 1.0. (See accompanying 4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #ifndef BOOST_EXCEPTION_7E48761AD92811DC9011477D56D89593 7 #define BOOST_EXCEPTION_7E48761AD92811DC9011477D56D89593 8 9 #include <boost/utility/enable_if.hpp> 10 #include <boost/exception/detail/is_output_streamable.hpp> 11 #include <sstream> 12 13 #ifndef BOOST_EXCEPTION_ENABLE_WARNINGS 14 #if __GNUC__*100+__GNUC_MINOR__>301 15 #pragma GCC system_header 16 #endif 17 #ifdef __clang__ 18 #pragma clang system_header 19 #endif 20 #ifdef _MSC_VER 21 #pragma warning(push,1) 22 #endif 23 #endif 24 25 namespace 26 boost 27 { 28 template <class T,class U> 29 std::string to_string( std::pair<T,U> const & ); 30 std::string to_string( std::exception const & ); 31 32 namespace 33 to_string_detail 34 { 35 template <class T> 36 typename disable_if<is_output_streamable<T>,char>::type to_string( T const & ); 37 using boost::to_string; 38 39 template <class,bool IsOutputStreamable> 40 struct has_to_string_impl; 41 42 template <class T> 43 struct 44 has_to_string_impl<T,true> 45 { 46 enum e { value=1 }; 47 }; 48 49 template <class T> 50 struct 51 has_to_string_impl<T,false> 52 { 53 static T const & f(); 54 enum e { value=1!=sizeof(to_string(f())) }; 55 }; 56 } 57 58 template <class T> 59 inline 60 typename enable_if<is_output_streamable<T>,std::string>::type to_string(T const & x)61 to_string( T const & x ) 62 { 63 std::ostringstream out; 64 out << x; 65 return out.str(); 66 } 67 68 template <class T> 69 struct 70 has_to_string 71 { 72 enum e { value=to_string_detail::has_to_string_impl<T,is_output_streamable<T>::value>::value }; 73 }; 74 75 template <class T,class U> 76 inline 77 std::string to_string(std::pair<T,U> const & x)78 to_string( std::pair<T,U> const & x ) 79 { 80 return std::string("(") + to_string(x.first) + ',' + to_string(x.second) + ')'; 81 } 82 83 inline 84 std::string to_string(std::exception const & x)85 to_string( std::exception const & x ) 86 { 87 return x.what(); 88 } 89 } 90 91 #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) 92 #pragma warning(pop) 93 #endif 94 #endif 95