• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_E788439ED9F011DCB181F25B55D89593
7 #define BOOST_EXCEPTION_E788439ED9F011DCB181F25B55D89593
8 
9 #include <boost/exception/to_string.hpp>
10 #include <boost/exception/detail/object_hex_dump.hpp>
11 #include <boost/assert.hpp>
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     namespace
29     exception_detail
30         {
31         template <bool ToStringAvailable>
32         struct
33         to_string_dispatcher
34             {
35             template <class T,class Stub>
36             static
37             std::string
convertboost::exception_detail::to_string_dispatcher38             convert( T const & x, Stub )
39                 {
40                 return to_string(x);
41                 }
42             };
43 
44         template <>
45         struct
46         to_string_dispatcher<false>
47             {
48             template <class T,class Stub>
49             static
50             std::string
convertboost::exception_detail::to_string_dispatcher51             convert( T const & x, Stub s )
52                 {
53                 return s(x);
54                 }
55 
56             template <class T>
57             static
58             std::string
convertboost::exception_detail::to_string_dispatcher59             convert( T const & x, std::string s )
60                 {
61                 return s;
62                 }
63 
64             template <class T>
65             static
66             std::string
convertboost::exception_detail::to_string_dispatcher67             convert( T const & x, char const * s )
68                 {
69                 BOOST_ASSERT(s!=0);
70                 return s;
71                 }
72             };
73 
74         namespace
75         to_string_dispatch
76             {
77             template <class T,class Stub>
78             inline
79             std::string
dispatch(T const & x,Stub s)80             dispatch( T const & x, Stub s )
81                 {
82                 return to_string_dispatcher<has_to_string<T>::value>::convert(x,s);
83                 }
84             }
85 
86         template <class T>
87         inline
88         std::string
string_stub_dump(T const & x)89         string_stub_dump( T const & x )
90             {
91             return "[ " + exception_detail::object_hex_dump(x) + " ]";
92             }
93         }
94 
95     template <class T>
96     inline
97     std::string
to_string_stub(T const & x)98     to_string_stub( T const & x )
99         {
100         return exception_detail::to_string_dispatch::dispatch(x,&exception_detail::string_stub_dump<T>);
101         }
102 
103     template <class T,class Stub>
104     inline
105     std::string
to_string_stub(T const & x,Stub s)106     to_string_stub( T const & x, Stub s )
107         {
108         return exception_detail::to_string_dispatch::dispatch(x,s);
109         }
110 
111     template <class T,class U,class Stub>
112     inline
113     std::string
to_string_stub(std::pair<T,U> const & x,Stub s)114     to_string_stub( std::pair<T,U> const & x, Stub s )
115         {
116         return std::string("(") + to_string_stub(x.first,s) + ',' + to_string_stub(x.second,s) + ')';
117         }
118     }
119 
120 #if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
121 #pragma warning(pop)
122 #endif
123 #endif
124