Line data Source code
1 : /*=============================================================================
2 : Boost.Wave: A Standard compliant C++ preprocessor library
3 :
4 : http://www.boost.org/
5 :
6 : Copyright (c) 2001-2012 Hartmut Kaiser. Distributed under the Boost
7 : Software License, Version 1.0. (See accompanying file
8 : LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 : =============================================================================*/
10 :
11 : #if !defined(BOOST_WAVE_CPP_THROW_HPP_INCLUDED)
12 : #define BOOST_WAVE_CPP_THROW_HPP_INCLUDED
13 :
14 : #include <string>
15 : #include <boost/throw_exception.hpp>
16 :
17 : #ifdef BOOST_NO_STRINGSTREAM
18 : #include <strstream>
19 : #else
20 : #include <sstream>
21 : #endif
22 :
23 : namespace boost { namespace wave { namespace util
24 : {
25 : #ifdef BOOST_NO_STRINGSTREAM
26 : template <typename Exception, typename S1, typename Pos>
27 : void throw_(typename Exception::error_code code, S1 msg, Pos const& pos)
28 : {
29 : std::strstream stream;
30 : stream << Exception::severity_text(code) << ": "
31 : << Exception::error_text(code);
32 : if (msg[0] != 0)
33 : stream << ": " << msg;
34 : stream << std::ends;
35 : std::string throwmsg = stream.str(); stream.freeze(false);
36 : boost::throw_exception(Exception(throwmsg.c_str(), code,
37 : pos.get_line(), pos.get_column(), pos.get_file().c_str()));
38 : }
39 :
40 : template <typename Exception, typename Context, typename S1, typename Pos>
41 : void throw_(Context& ctx, typename Exception::error_code code,
42 : S1 msg, Pos const& pos)
43 : {
44 : std::strstream stream;
45 : stream << Exception::severity_text(code) << ": "
46 : << Exception::error_text(code);
47 : if (msg[0] != 0)
48 : stream << ": " << msg;
49 : stream << std::ends;
50 : std::string throwmsg = stream.str(); stream.freeze(false);
51 : ctx.get_hooks().throw_exception(ctx.derived(),
52 : Exception(throwmsg.c_str(), code, pos.get_line(), pos.get_column(),
53 : pos.get_file().c_str()));
54 : }
55 :
56 : template <typename Exception, typename S1, typename Pos, typename S2>
57 : void throw_(typename Exception::error_code code, S1 msg, Pos const& pos,
58 : S2 name)
59 : {
60 : std::strstream stream;
61 : stream << Exception::severity_text(code) << ": "
62 : << Exception::error_text(code);
63 : if (msg[0] != 0)
64 : stream << ": " << msg;
65 : stream << std::ends;
66 : std::string throwmsg = stream.str(); stream.freeze(false);
67 : boost::throw_exception(Exception(throwmsg.c_str(), code,
68 : pos.get_line(), pos.get_column(), pos.get_file().c_str(), name));
69 : }
70 :
71 : template <typename Exception, typename Context, typename S1, typename Pos,
72 : typename S2>
73 : void throw_(Context& ctx, typename Exception::error_code code,
74 : S1 msg, Pos const& pos, S2 name)
75 : {
76 : std::strstream stream;
77 : stream << Exception::severity_text(code) << ": "
78 : << Exception::error_text(code);
79 : if (msg[0] != 0)
80 : stream << ": " << msg;
81 : stream << std::ends;
82 : std::string throwmsg = stream.str(); stream.freeze(false);
83 : ctx.get_hooks().throw_exception(ctx.derived(),
84 : Exception(throwmsg.c_str(), code, pos.get_line(), pos.get_column(),
85 : pos.get_file().c_str(), name));
86 : }
87 : #else
88 : template <typename Exception, typename S1, typename Pos>
89 : void throw_(typename Exception::error_code code, S1 msg, Pos const& pos)
90 : {
91 : std::stringstream stream;
92 : stream << Exception::severity_text(code) << ": "
93 : << Exception::error_text(code);
94 : if (msg[0] != 0)
95 : stream << ": " << msg;
96 : stream << std::ends;
97 : std::string throwmsg = stream.str();
98 : boost::throw_exception(Exception(throwmsg.c_str(), code,
99 : pos.get_line(), pos.get_column(), pos.get_file().c_str()));
100 : }
101 :
102 : template <typename Exception, typename Context, typename S1, typename Pos>
103 0 : void throw_(Context& ctx, typename Exception::error_code code,
104 : S1 msg, Pos const& pos)
105 : {
106 0 : std::stringstream stream;
107 : stream << Exception::severity_text(code) << ": "
108 0 : << Exception::error_text(code);
109 0 : if (msg[0] != 0)
110 0 : stream << ": " << msg;
111 0 : stream << std::ends;
112 0 : std::string throwmsg = stream.str();
113 0 : ctx.get_hooks().throw_exception(ctx.derived(),
114 : Exception(throwmsg.c_str(), code, pos.get_line(), pos.get_column(),
115 0 : pos.get_file().c_str()));
116 0 : }
117 :
118 : template <typename Exception, typename S1, typename Pos, typename S2>
119 0 : void throw_(typename Exception::error_code code, S1 msg, Pos const& pos,
120 : S2 name)
121 : {
122 0 : std::stringstream stream;
123 : stream << Exception::severity_text(code) << ": "
124 0 : << Exception::error_text(code);
125 0 : if (msg[0] != 0)
126 0 : stream << ": " << msg;
127 0 : stream << std::ends;
128 0 : std::string throwmsg = stream.str();
129 0 : boost::throw_exception(Exception(throwmsg.c_str(), code,
130 0 : pos.get_line(), pos.get_column(), pos.get_file().c_str(), name));
131 : }
132 :
133 : template <typename Exception, typename Context, typename S1, typename Pos1,
134 : typename S2>
135 : void throw_(Context& ctx, typename Exception::error_code code,
136 : S1 msg, Pos1 const& pos, S2 name)
137 : {
138 : std::stringstream stream;
139 : stream << Exception::severity_text(code) << ": "
140 : << Exception::error_text(code);
141 : if (msg[0] != 0)
142 : stream << ": " << msg;
143 : stream << std::ends;
144 : std::string throwmsg = stream.str();
145 : ctx.get_hooks().throw_exception(ctx.derived(),
146 : Exception(throwmsg.c_str(), code, pos.get_line(), pos.get_column(),
147 : pos.get_file().c_str(), name));
148 : }
149 : #endif
150 : }}}
151 :
152 : ///////////////////////////////////////////////////////////////////////////////
153 : // helper macro for throwing exceptions
154 : #if !defined(BOOST_WAVE_THROW)
155 : #define BOOST_WAVE_THROW(cls, code, msg, act_pos) \
156 : boost::wave::util::throw_<cls>(cls::code, msg, act_pos) \
157 : /**/
158 :
159 : #define BOOST_WAVE_THROW_CTX(ctx, cls, code, msg, act_pos) \
160 : boost::wave::util::throw_<cls>(ctx, cls::code, msg, act_pos) \
161 : /**/
162 : #endif // BOOST_WAVE_THROW
163 :
164 : ///////////////////////////////////////////////////////////////////////////////
165 : // helper macro for throwing exceptions with additional parameter
166 : #if !defined(BOOST_WAVE_THROW_NAME_CTX)
167 : #define BOOST_WAVE_THROW_NAME_CTX(ctx, cls, code, msg, act_pos, name) \
168 : boost::wave::util::throw_<cls>(cls::code, msg, act_pos, name) \
169 : /**/
170 : #endif // BOOST_WAVE_THROW_NAME_CTX
171 :
172 : ///////////////////////////////////////////////////////////////////////////////
173 : // helper macro for throwing exceptions with additional parameter
174 : #if !defined(BOOST_WAVE_THROW_VAR_CTX)
175 : #define BOOST_WAVE_THROW_VAR_CTX(ctx, cls, code, msg, act_pos) \
176 : boost::wave::util::throw_<cls>(ctx, code, msg, act_pos) \
177 : /**/
178 : #endif // BOOST_WAVE_THROW_VAR_CTX
179 :
180 : #endif // !defined(BOOST_WAVE_CPP_THROW_HPP_INCLUDED)
|