error_context.h

Go to the documentation of this file.
00001 
00003 
00004 //
00005 // Copyright (c) 2005-2007 University of Southern California
00006 // Rob Peters <rjpeters at usc dot edu>
00007 //
00008 // created: Thu Nov 17 16:14:06 2005
00009 // commit: $Id: error_context.h 10065 2007-04-12 05:54:56Z rjpeters $
00010 // $HeadURL: file:///lab/rjpeters/svnrepo/code/trunk/groovx/src/rutz/error_context.h $
00011 //
00012 // --------------------------------------------------------------------
00013 //
00014 // This file is part of GroovX.
00015 //   [http://www.klab.caltech.edu/rjpeters/groovx/]
00016 //
00017 // GroovX is free software; you can redistribute it and/or modify it
00018 // under the terms of the GNU General Public License as published by
00019 // the Free Software Foundation; either version 2 of the License, or
00020 // (at your option) any later version.
00021 //
00022 // GroovX is distributed in the hope that it will be useful, but
00023 // WITHOUT ANY WARRANTY; without even the implied warranty of
00024 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00025 // General Public License for more details.
00026 //
00027 // You should have received a copy of the GNU General Public License
00028 // along with GroovX; if not, write to the Free Software Foundation,
00029 // Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
00030 //
00032 
00033 #ifndef GROOVX_RUTZ_ERROR_CONTEXT_H_UTC20051118001406_DEFINED
00034 #define GROOVX_RUTZ_ERROR_CONTEXT_H_UTC20051118001406_DEFINED
00035 
00036 #include "rutz/fstring.h"
00037 #include "rutz/staticstack.h"
00038 
00039 namespace rutz
00040 {
00041   class error_context;
00042   class error_context_entry;
00043 }
00044 
00046 class rutz::error_context
00047 {
00048 public:
00050   error_context();
00051 
00053   ~error_context();
00054 
00056   static const rutz::error_context& current();
00057 
00059   bool add_entry(const error_context_entry* e);
00060 
00062   void remove_entry(const error_context_entry* e);
00063 
00065   rutz::fstring get_text() const;
00066 
00068 
00080   template <class S>
00081   inline void prepend_to(S& str) const
00082   {
00083     const rutz::fstring ctx = this->get_text();
00084 
00085     if (ctx.length() > 0)
00086       {
00087         const S orig = str;
00088         str = "error context follows (innermost last):\n";
00089         str += ctx.c_str();
00090         str += "\n";
00091         str += orig;
00092       }
00093   }
00094 
00095 private:
00096   error_context(const error_context&); // not implemented
00097   error_context& operator=(const error_context&); // not implemented
00098 
00099   rutz::static_stack<const error_context_entry*, 256> m_entries;
00100 };
00101 
00103 class rutz::error_context_entry
00104 {
00105 public:
00107   error_context_entry(const rutz::fstring& msg);
00108 
00110   ~error_context_entry();
00111 
00113   const rutz::fstring& text() const { return m_text; }
00114 
00115 private:
00116   error_context_entry(const error_context_entry&);
00117   error_context_entry& operator=(const error_context_entry&);
00118 
00119   rutz::fstring m_text;
00120 
00121   // context from which to remove ourselves, or null
00122   rutz::error_context* m_context;
00123 };
00124 
00126 
00132 #define GVX_ERR_CONTEXT(msg) \
00133   rutz::error_context_entry e_c_object_(msg)
00134 
00135 static const char __attribute__((used)) vcid_groovx_rutz_error_context_h_utc20051118001406[] = "$Id: error_context.h 10065 2007-04-12 05:54:56Z rjpeters $ $HeadURL: file:
00136 #endif // !GROOVX_RUTZ_ERROR_CONTEXT_H_UTC20051118001406DEFINED

The software described here is Copyright (c) 1998-2005, Rob Peters.
This page was generated Wed Dec 3 06:49:40 2008 by Doxygen version 1.5.5.