Clipper
clipper_message.h
00001 
00004 //C Copyright (C) 2000-2006 Kevin Cowtan and University of York
00005 //L
00006 //L  This library is free software and is distributed under the terms
00007 //L  and conditions of version 2.1 of the GNU Lesser General Public
00008 //L  Licence (LGPL) with the following additional clause:
00009 //L
00010 //L     `You may also combine or link a "work that uses the Library" to
00011 //L     produce a work containing portions of the Library, and distribute
00012 //L     that work under terms of your choice, provided that you give
00013 //L     prominent notice with each copy of the work that the specified
00014 //L     version of the Library is used in it, and that you include or
00015 //L     provide public access to the complete corresponding
00016 //L     machine-readable source code for the Library including whatever
00017 //L     changes were used in the work. (i.e. If you make changes to the
00018 //L     Library you must distribute those, but you do not need to
00019 //L     distribute source or object code to those portions of the work
00020 //L     not covered by this licence.)'
00021 //L
00022 //L  Note that this clause grants an additional right and does not impose
00023 //L  any additional restriction, and so does not affect compatibility
00024 //L  with the GNU General Public Licence (GPL). If you wish to negotiate
00025 //L  other terms, please contact the maintainer.
00026 //L
00027 //L  You can redistribute it and/or modify the library under the terms of
00028 //L  the GNU Lesser General Public License as published by the Free Software
00029 //L  Foundation; either version 2.1 of the License, or (at your option) any
00030 //L  later version.
00031 //L
00032 //L  This library is distributed in the hope that it will be useful, but
00033 //L  WITHOUT ANY WARRANTY; without even the implied warranty of
00034 //L  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00035 //L  Lesser General Public License for more details.
00036 //L
00037 //L  You should have received a copy of the CCP4 licence and/or GNU
00038 //L  Lesser General Public License along with this library; if not, write
00039 //L  to the CCP4 Secretary, Daresbury Laboratory, Warrington WA4 4AD, UK.
00040 //L  The GNU Lesser General Public can also be obtained by writing to the
00041 //L  Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
00042 //L  MA 02111-1307 USA
00043 
00044 
00045 #ifndef CLIPPER_MESSAGE
00046 #define CLIPPER_MESSAGE
00047 
00048 
00049 #include <string>
00050 #include <iostream>
00051 
00052 
00053 namespace clipper
00054 {
00055 
00057 
00077   class Message {
00078   public:
00079     Message();  
00080 
00081     static std::ostream& stream() { return *stream_; }
00083     static const int& message_level() { return message_level_; }
00085     static const int& fatal_level() { return fatal_level_; }
00087     static void set_stream( std::ostream& stream );
00089     static void set_message_level( const int& level );
00091     static void set_fatal_level( const int& level );
00093     template<class T> inline static void message( const T& message )
00094     {
00095       if ( message.level() >= Message::message_level() ) {
00096         Message::stream() << message.text() << "\n";
00097         if ( message.level() >= Message::fatal_level() ) throw message;
00098       }
00099     }
00100   private:
00101     static int message_level_;
00102     static int fatal_level_;
00103     static std::ostream* stream_;
00104   };
00105 
00106 
00108   class Message_base {
00109   public:
00110     const std::string& text() const;
00111     int level() const;
00112   protected:
00113     Message_base() {}
00114   };
00115 
00117   class Message_generic : public Message_base {
00118   public:
00119     Message_generic( const int& level, const std::string& text ) :
00120       text_( text ), level_( level ) {}
00121     const std::string& text() const { return text_; }
00122     const int& level() const { return level_; }
00123   private:
00124     std::string text_;
00125     int level_;
00126   };
00127 
00129   class Message_fatal : public Message_base {
00130   public:
00131     Message_fatal( const std::string& text ) : text_( text ) {}
00132     const std::string& text() const { return text_; }
00133     static int level() { return 9; }
00134   private:
00135     std::string text_;
00136   };
00137 
00139   class Message_warn : public Message_base  {
00140   public:
00141     Message_warn( const std::string& text ) : text_( text ) {}
00142     const std::string& text() const { return text_; }
00143     static int level() { return 5; }
00144   private:
00145     std::string text_;
00146   };
00147 
00149   class Message_info : public Message_base  {
00150   public:
00151     Message_info( const std::string& text ) : text_( text ) {}
00152     const std::string& text() const { return text_; }
00153     static int level() { return 1; }
00154   private:
00155     std::string text_;
00156   };
00157 
00159   class Message_ctor : public Message_base  {
00160   public:
00161     Message_ctor( const std::string& text ) : text_( "+"+text ) {}
00162     const std::string& text() const { return text_; }
00163     static int level() { return 2; }
00164   private:
00165     std::string text_;
00166   };
00167 
00169   class Message_dtor : public Message_base  {
00170   public:
00171     Message_dtor( const std::string& text ) : text_( "-"+text ) {}
00172     const std::string& text() const { return text_; }
00173     static int level() { return 2; }
00174   private:
00175     std::string text_;
00176   };
00177 
00178 
00179 } // namespace clipper
00180 
00181 #endif