Error.h

00001 /*****************************************************************************
00002  * Author:   Valient Gough <vgough@pobox.com>
00003  *
00004  *****************************************************************************
00005  * Copyright (c) 2004, Valient Gough
00006  *
00007  * This library is free software; you can distribute it and/or modify it under
00008  * the terms of the GNU Lesser General Public License (LGPL), as published by
00009  * the Free Software Foundation; either version 2.1 of the License, or (at your
00010  * option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful, but WITHOUT
00013  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00014  * FITNESS FOR A PARTICULAR PURPOSE.  See the LGPL in the file COPYING for more
00015  * details.
00016  *
00017  */
00018                                                                                                 
00019                              
00020 #ifndef _Error_incl_
00021 #define _Error_incl_
00022 
00023 #include <stdexcept>
00024 #include <rlog/common.h>
00025 
00026 #include <string>
00027 
00028 namespace rlog
00029 {
00030     class RLOG_DECL RLogChannel;
00031 
00032     // Documentation in implementation file
00033     class RLOG_DECL Error : public std::runtime_error
00034     {
00035     public:
00036         Error( const char *component, const char *file, const char *function,
00037                 int line, const char *msg );
00038         Error( const char *component, const char *file, const char *function,
00039                 int line, const std::string &msg );
00040         Error(const Error &src );
00041         virtual ~Error() throw();
00042 
00043         Error &operator = (const Error &src);
00044 
00045         void log( RLogChannel * channel ) const;
00046 
00047         const char *component() const;
00048         const char *file() const;
00049         const char *function() const;
00050         int line() const;
00051         const char *message() const;
00052 
00053     private:
00054         struct ErrorData *data;
00055     };
00056 
00057     std::string _format_msg( const char *fmt, ... ) PRINTF(1,2);
00058 }
00059 
00060 #define _ERROR_IMPL( COMPONENT, MSG ) \
00061     rlog::Error( STR(COMPONENT), __FILE__, __FUNCTION__, __LINE__, MSG )
00062 
00063 #define ERROR( MSG ) _ERROR_IMPL( RLOG_COMPONENT, MSG )
00064 
00065 #if C99_VARIADAC_MACROS
00066 #define _ERROR_IMPL_VA( COMPONENT, FMT, ... ) \
00067     rlog::Error( STR(COMPONENT), __FILE__, __FUNCTION__, __LINE__, \
00068             rlog::_format_msg( FMT, __VA_ARGS__ ) )
00069 #define ERROR_FMT( FMT, ... ) _ERROR_IMPL_VA( RLOG_COMPONENT, FMT, __VA_ARGS__ )
00070 #elif PREC99_VARIADIC_MACROS
00071 #define _ERROR_IMPL_VA( COMPONENT, FMT, ARGS... ) \
00072     rlog::Error( STR(COMPONENT), __FILE__, __FUNCTION__, __LINE__, \
00073             rlog::_format_msg( FMT, ##ARGS ) )
00074 #define ERROR_FMT( FMT, ARGS... ) _ERROR_IMPL_VA( RLOG_COMPONENT, FMT, ##ARGS )
00075 #else
00076 // TODO: implement for no variadics case..
00077 #endif
00078 
00079 #endif
00080 

Generated on Mon Nov 20 22:57:44 2006 for rlog by  doxygen 1.5.0