blob: 1d254f4c5a439e7553f7dbfc6a67540194aa7880 [file] [log] [blame]
/*=============================================================================
Boost.Wave: A Standard compliant C++ preprocessor library
http://www.boost.org/
Copyright (c) 2001-2011 Hartmut Kaiser. 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)
=============================================================================*/
#if !defined(BOOST_WAVE_CPP_THROW_HPP_INCLUDED)
#define BOOST_WAVE_CPP_THROW_HPP_INCLUDED
#include <string>
#include <boost/throw_exception.hpp>
#ifdef BOOST_NO_STRINGSTREAM
#include <strstream>
#else
#include <sstream>
#endif
namespace boost { namespace wave { namespace util
{
#ifdef BOOST_NO_STRINGSTREAM
template <typename Exception, typename S1, typename Pos>
void throw_(typename Exception::error_code code, S1 msg, Pos const& pos)
{
std::strstream stream;
stream << Exception::severity_text(code) << ": "
<< Exception::error_text(code);
if (msg[0] != 0)
stream << ": " << msg;
stream << std::ends;
std::string throwmsg = stream.str(); stream.freeze(false);
boost::throw_exception(Exception(throwmsg.c_str(), code,
pos.get_line(), pos.get_column(), pos.get_file().c_str()));
}
template <typename Exception, typename Context, typename S1, typename Pos>
void throw_(Context& ctx, typename Exception::error_code code,
S1 msg, Pos const& pos)
{
std::strstream stream;
stream << Exception::severity_text(code) << ": "
<< Exception::error_text(code);
if (msg[0] != 0)
stream << ": " << msg;
stream << std::ends;
std::string throwmsg = stream.str(); stream.freeze(false);
ctx.get_hooks().throw_exception(ctx.derived(),
Exception(throwmsg.c_str(), code, pos.get_line(), pos.get_column(),
pos.get_file().c_str()));
}
template <typename Exception, typename S1, typename Pos, typename S2>
void throw_(typename Exception::error_code code, S1 msg, Pos const& pos,
S2 name)
{
std::strstream stream;
stream << Exception::severity_text(code) << ": "
<< Exception::error_text(code);
if (msg[0] != 0)
stream << ": " << msg;
stream << std::ends;
std::string throwmsg = stream.str(); stream.freeze(false);
boost::throw_exception(Exception(throwmsg.c_str(), code,
pos.get_line(), pos.get_column(), pos.get_file().c_str(), name));
}
template <typename Exception, typename Context, typename S1, typename Pos,
typename S2>
void throw_(Context& ctx, typename Exception::error_code code,
S1 msg, Pos const& pos, S2 name)
{
std::strstream stream;
stream << Exception::severity_text(code) << ": "
<< Exception::error_text(code);
if (msg[0] != 0)
stream << ": " << msg;
stream << std::ends;
std::string throwmsg = stream.str(); stream.freeze(false);
ctx.get_hooks().throw_exception(ctx.derived(),
Exception(throwmsg.c_str(), code, pos.get_line(), pos.get_column(),
pos.get_file().c_str(), name));
}
#else
template <typename Exception, typename S1, typename Pos>
void throw_(typename Exception::error_code code, S1 msg, Pos const& pos)
{
std::stringstream stream;
stream << Exception::severity_text(code) << ": "
<< Exception::error_text(code);
if (msg[0] != 0)
stream << ": " << msg;
stream << std::ends;
std::string throwmsg = stream.str();
boost::throw_exception(Exception(throwmsg.c_str(), code,
pos.get_line(), pos.get_column(), pos.get_file().c_str()));
}
template <typename Exception, typename Context, typename S1, typename Pos>
void throw_(Context& ctx, typename Exception::error_code code,
S1 msg, Pos const& pos)
{
std::stringstream stream;
stream << Exception::severity_text(code) << ": "
<< Exception::error_text(code);
if (msg[0] != 0)
stream << ": " << msg;
stream << std::ends;
std::string throwmsg = stream.str();
ctx.get_hooks().throw_exception(ctx.derived(),
Exception(throwmsg.c_str(), code, pos.get_line(), pos.get_column(),
pos.get_file().c_str()));
}
template <typename Exception, typename S1, typename Pos, typename S2>
void throw_(typename Exception::error_code code, S1 msg, Pos const& pos,
S2 name)
{
std::stringstream stream;
stream << Exception::severity_text(code) << ": "
<< Exception::error_text(code);
if (msg[0] != 0)
stream << ": " << msg;
stream << std::ends;
std::string throwmsg = stream.str();
boost::throw_exception(Exception(throwmsg.c_str(), code,
pos.get_line(), pos.get_column(), pos.get_file().c_str(), name));
}
template <typename Exception, typename Context, typename S1, typename Pos1,
typename S2>
void throw_(Context& ctx, typename Exception::error_code code,
S1 msg, Pos1 const& pos, S2 name)
{
std::stringstream stream;
stream << Exception::severity_text(code) << ": "
<< Exception::error_text(code);
if (msg[0] != 0)
stream << ": " << msg;
stream << std::ends;
std::string throwmsg = stream.str();
ctx.get_hooks().throw_exception(ctx.derived(),
Exception(throwmsg.c_str(), code, pos.get_line(), pos.get_column(),
pos.get_file().c_str(), name));
}
#endif
}}}
///////////////////////////////////////////////////////////////////////////////
// helper macro for throwing exceptions
#if !defined(BOOST_WAVE_THROW)
#define BOOST_WAVE_THROW(cls, code, msg, act_pos) \
boost::wave::util::throw_<cls>(cls::code, msg, act_pos) \
/**/
#define BOOST_WAVE_THROW_CTX(ctx, cls, code, msg, act_pos) \
boost::wave::util::throw_<cls>(ctx, cls::code, msg, act_pos) \
/**/
#endif // BOOST_WAVE_THROW
///////////////////////////////////////////////////////////////////////////////
// helper macro for throwing exceptions with additional parameter
#if !defined(BOOST_WAVE_THROW_NAME_CTX)
#define BOOST_WAVE_THROW_NAME_CTX(ctx, cls, code, msg, act_pos, name) \
boost::wave::util::throw_<cls>(cls::code, msg, act_pos, name) \
/**/
#endif // BOOST_WAVE_THROW_NAME_CTX
///////////////////////////////////////////////////////////////////////////////
// helper macro for throwing exceptions with additional parameter
#if !defined(BOOST_WAVE_THROW_VAR_CTX)
#define BOOST_WAVE_THROW_VAR_CTX(ctx, cls, code, msg, act_pos) \
boost::wave::util::throw_<cls>(ctx, code, msg, act_pos) \
/**/
#endif // BOOST_WAVE_THROW_VAR_CTX
#endif // !defined(BOOST_WAVE_CPP_THROW_HPP_INCLUDED)