Throw errors for incorrect method calls rather than assert.

[SVN r69290]
This commit is contained in:
Daniel James
2011-02-25 23:07:07 +00:00
parent 937e30aa53
commit d94ecdd77b
2 changed files with 45 additions and 5 deletions

View File

@@ -8,9 +8,24 @@
#include "values.hpp"
#include <boost/intrusive_ptr.hpp>
#include <boost/current_function.hpp>
#define UNDEFINED_ERROR() \
throw value_error( \
std::string(BOOST_CURRENT_FUNCTION) +\
" not defined for " + \
this->type_name() + \
" values." \
);
namespace quickbook
{
////////////////////////////////////////////////////////////////////////////
// Value Error
value_error::value_error(std::string const& x)
: std::logic_error(x) {}
////////////////////////////////////////////////////////////////////////////
// Node
@@ -25,10 +40,10 @@ namespace quickbook
value_node* value_node::store() { return this; }
file_position value_node::get_position() const { assert(false); }
std::string value_node::get_quickbook() const { assert(false); }
std::string value_node::get_boostbook() const { assert(false); }
value_node* value_node::get_list() const { assert(false); }
file_position value_node::get_position() const { UNDEFINED_ERROR(); }
std::string value_node::get_quickbook() const { UNDEFINED_ERROR(); }
std::string value_node::get_boostbook() const { UNDEFINED_ERROR(); }
value_node* value_node::get_list() const { UNDEFINED_ERROR(); }
bool value_node::empty() const { return false; }
bool value_node::is_list() const { return false; }
@@ -52,6 +67,8 @@ namespace quickbook
: value_node(t) {}
private:
char const* type_name() const { return "empty"; }
virtual value_node* clone() const
{ return new value_empty_impl(tag_); }
@@ -188,6 +205,8 @@ namespace quickbook
public:
explicit value_string_impl(std::string const&, value::tag_type);
private:
char const* type_name() const { return "boostbook"; }
virtual ~value_string_impl();
virtual value_node* clone() const;
virtual std::string get_boostbook() const;
@@ -206,6 +225,8 @@ namespace quickbook
quickbook::iterator begin, quickbook::iterator end,
value::tag_type);
private:
char const* type_name() const { return "quickbook"; }
virtual ~value_qbk_string_impl();
virtual value_node* clone() const;
virtual file_position get_position() const;
@@ -222,6 +243,8 @@ namespace quickbook
public:
explicit value_qbk_ref_impl(quickbook::iterator begin, quickbook::iterator end, value::tag_type);
private:
char const* type_name() const { return "quickbook"; }
virtual ~value_qbk_ref_impl();
virtual value_node* clone() const;
virtual value_node* store();
@@ -237,6 +260,8 @@ namespace quickbook
struct value_qbk_bbk_impl : public value_node
{
private:
char const* type_name() const { return "quickbook/boostbook"; }
value_qbk_bbk_impl(
std::string const& qbk, std::string const& bbk,
file_position const&, value::tag_type);
@@ -571,6 +596,8 @@ namespace quickbook
value_list_impl(value::tag_type);
value_list_impl(value_node*, value::tag_type);
private:
char const* type_name() const { return "list"; }
virtual ~value_list_impl();
virtual value_node* clone() const;
virtual value_node* store();

View File

@@ -16,12 +16,14 @@
#include <cassert>
#include <boost/scoped_ptr.hpp>
#include <boost/iterator/iterator_traits.hpp>
#include <stdexcept>
#include "fwd.hpp"
namespace quickbook
{
class value;
class value_builder;
class value_error;
namespace detail
{
@@ -42,6 +44,7 @@ namespace quickbook
virtual ~value_node();
public:
virtual char const* type_name() const = 0;
virtual value_node* clone() const = 0;
virtual value_node* store();
@@ -54,7 +57,7 @@ namespace quickbook
virtual bool is_string() const;
virtual value_node* get_list() const;
int ref_count_;
const tag_type tag_;
value_node* next_;
@@ -258,6 +261,16 @@ namespace quickbook
boost::scoped_ptr<value_builder> saved;
};
////////////////////////////////////////////////////////////////////////////
// Value Error
//
class value_error : std::logic_error
{
public:
value_error(std::string const&);
};
////////////////////////////////////////////////////////////////////////////
// Value Consumer
//