#ifndef WWWI_MIND_EX_H
#define WWWI_MIND_EX_H
#include <exception>
#include <sstream>
#include "mind.h"
using std::exception;
using std::string;
using std::stringstream;
#define EX_THROW(EX,MSG,LINE) { assert((#EX": "MSG)==0); throw EX(MSG": "__FILE__":"#LINE); }
#define EX_THROW_QUIET(EX,MSG,LINE) { assert((#EX": "MSG)==0); throw EX(); }
#define EX_BAD_CAST(MSG) EX_THROW_QUIET(bad_cast,MSG,__LINE__)
#define EX_INVALID_ARGUMENT(MSG) EX_THROW(invalid_argument,MSG,__LINE__)
#define EX_OUT_OF_RANGE(MSG) EX_THROW(out_of_range,MSG,__LINE__)
#define EX_MIND(MSG) EX_THROW(MindEx,MSG,__LINE__)
class MindEx : public exception {
public:
MindEx(const char *ci_strWhat) { m_xtr = ci_strWhat; };
virtual const char *name(void) const { return "MindEx"; };
virtual const char *what(void) const throw () { return m_xtr.c_str(); };
~MindEx(void) throw () { };
protected:
string m_xtr;
};
class BadParseEx : public MindEx {
public:
BadParseEx(const char *ci_strWhat) : MindEx(ci_strWhat) {};
virtual const char* name(void) const { return "BadParseEx"; }
};
class BufferEx : public MindEx {
public:
BufferEx(const char *ci_strWhat) : MindEx(ci_strWhat) {};
virtual const char* name(void) const { return "BufferEx"; }
};
class ConfigEx : public MindEx {
public:
ConfigEx(const char *ci_strWhat) : MindEx(ci_strWhat) {};
virtual const char* name(void) const { return "ConfigEx"; }
};
#endif