Error.h

00001 #ifndef XFLTK__ERROR_H_
00002 #define XFLTK__ERROR_H_
00003 
00004 #include <exception>
00005 #include <ostream>
00006 #include <vector>
00007 
00008 #include "utils.h"
00009 
00010 namespace xfltk {
00011 
00012 class Error: public std::exception {
00013         
00014         public:
00015         
00016                 enum ParserAction {
00017                         ignor = 0, skip_arg = 1, skip_tag = 1 + 2, skip_all = 1 + 2 + 4
00018                 };
00019                 
00020                 explicit Error(int line_nr, ParserAction parser_action) throw() : _line_nr(line_nr), _parser_action(parser_action) {}
00021                 
00022                 virtual ParserAction parser_action() const { return _parser_action; };
00023                 
00024                 bool parser_skip_arg() { return parser_action() & skip_arg; }
00025                 
00026                 bool parser_skip_tag() { return parser_action() & skip_tag; }
00027                 
00028                 bool parser_skip_all() { return parser_action() & skip_all; }
00029                 
00030                 int line_nr() const { return _line_nr; }
00031                 
00032                 friend std::ostream& operator<<(std::ostream& out_stream, const Error& error);
00033                 
00034         protected:
00035         
00036                 int _line_nr;
00037                 
00038                 ParserAction _parser_action;
00039 };
00040 
00041 class GeneralStaticError: public Error {
00042         
00043         protected:
00044         
00045         const char* _static_text;
00046         
00047         public:
00048         
00049         GeneralStaticError(const char* static_text, int line_nr, ParserAction parser_action): Error(line_nr, parser_action), _static_text(static_text) {}
00050         
00051         const char* what() const throw() { return _static_text; }
00052         
00053 };
00054 
00055 class GeneralDynamicError: public Error {
00056         
00057         protected:
00058         
00059         const char* _dynamic_text;
00060         
00061         public:
00062         
00063         GeneralDynamicError(const char* dynamic_text, int line_nr, ParserAction parser_action);
00064         
00065         GeneralDynamicError(const GeneralDynamicError& to_copy);
00066         
00067         virtual ~GeneralDynamicError() throw() { delete[] _dynamic_text; }
00068         
00069         const char* what() const throw() { return _dynamic_text; }
00070         
00071 };
00072 
00073 class InvalidTagError: public GeneralDynamicError {
00074         
00075         public:
00076         
00077         static const char* make_text(const char* tag_name);
00078         
00079         InvalidTagError(const char* tag_name, int line_nr, ParserAction parser_action);
00080         
00081 };
00082 
00083 class Errors {
00084         
00085         typedef std::vector<Error*> error_vec;
00086         
00087         std::vector<Error*> errors;
00088         
00089         public:
00090         
00091         typedef error_vec::size_type size_type;
00092         
00093         ~Errors() { clear(); };
00094         
00095         size_type size() const;
00096         
00097         bool empty() const;
00098         
00099         const Error& operator[](size_type n) const;
00100                 
00101         void append(Error* error);
00102         
00103         void clear();
00104         
00105         friend std::ostream& operator<<(std::ostream& out_stream, const Errors& errors);
00106         
00107 };
00108 
00109 };
00110 
00111 #endif /*XFLTK__ERROR_H_*/

Generated on Tue Jan 3 14:32:36 2006 for xfltk by  doxygen 1.4.6-NO