~mok0/clipper/trunk

« back to all changes in this revision

Viewing changes to clipper/core/clipper_message.h

  • Committer: Morten Kjeldgaard
  • Date: 2011-02-09 21:25:56 UTC
  • Revision ID: mok@bioxray.dk-20110209212556-3zbon5ukh4zf3x00
Tags: 2.0.3
versionĀ 2.0.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*! \file lib/clipper_message.h
 
2
    Header file for clipper message handler
 
3
*/
 
4
//C Copyright (C) 2000-2006 Kevin Cowtan and University of York
 
5
//L
 
6
//L  This library is free software and is distributed under the terms
 
7
//L  and conditions of version 2.1 of the GNU Lesser General Public
 
8
//L  Licence (LGPL) with the following additional clause:
 
9
//L
 
10
//L     `You may also combine or link a "work that uses the Library" to
 
11
//L     produce a work containing portions of the Library, and distribute
 
12
//L     that work under terms of your choice, provided that you give
 
13
//L     prominent notice with each copy of the work that the specified
 
14
//L     version of the Library is used in it, and that you include or
 
15
//L     provide public access to the complete corresponding
 
16
//L     machine-readable source code for the Library including whatever
 
17
//L     changes were used in the work. (i.e. If you make changes to the
 
18
//L     Library you must distribute those, but you do not need to
 
19
//L     distribute source or object code to those portions of the work
 
20
//L     not covered by this licence.)'
 
21
//L
 
22
//L  Note that this clause grants an additional right and does not impose
 
23
//L  any additional restriction, and so does not affect compatibility
 
24
//L  with the GNU General Public Licence (GPL). If you wish to negotiate
 
25
//L  other terms, please contact the maintainer.
 
26
//L
 
27
//L  You can redistribute it and/or modify the library under the terms of
 
28
//L  the GNU Lesser General Public License as published by the Free Software
 
29
//L  Foundation; either version 2.1 of the License, or (at your option) any
 
30
//L  later version.
 
31
//L
 
32
//L  This library is distributed in the hope that it will be useful, but
 
33
//L  WITHOUT ANY WARRANTY; without even the implied warranty of
 
34
//L  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
35
//L  Lesser General Public License for more details.
 
36
//L
 
37
//L  You should have received a copy of the CCP4 licence and/or GNU
 
38
//L  Lesser General Public License along with this library; if not, write
 
39
//L  to the CCP4 Secretary, Daresbury Laboratory, Warrington WA4 4AD, UK.
 
40
//L  The GNU Lesser General Public can also be obtained by writing to the
 
41
//L  Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 
42
//L  MA 02111-1307 USA
 
43
 
 
44
 
 
45
#ifndef CLIPPER_MESSAGE
 
46
#define CLIPPER_MESSAGE
 
47
 
 
48
 
 
49
#include <string>
 
50
#include <iostream>
 
51
 
 
52
 
 
53
namespace clipper
 
54
{
 
55
 
 
56
  //! Message handler class
 
57
  /*! The message handler is a static class which handles messages and
 
58
    errors. It has 3 properties:
 
59
     - the output stream: to which messages will be directed (default stderr)
 
60
     - message level: messages with a level >= this will be output (default 5)
 
61
     - fatal level:   messages with a level >= this will be fatal (default 9)
 
62
 
 
63
     Levels may be in the range 1-9. They are priorotised as follows:
 
64
     - 1-4 messages, never fatal
 
65
     - 5-8 warning, may be fatal
 
66
     - 9: always fatal.
 
67
    The fatal level must be greater than or equal to the message
 
68
    level, and greater than or equal to 5.
 
69
 
 
70
    A message is any object which implements the following methods:
 
71
    \code
 
72
    const std::string& text() const;
 
73
    int level() const;
 
74
    \endcode
 
75
    The level method may be static.
 
76
    Messages are usually derived from Message_base. */
 
77
  class Message {
 
78
  public:
 
79
    Message();  //!< null constuctor
 
80
    //! return the current stream
 
81
    static std::ostream& stream() { return *stream_; }
 
82
    //! return the current message level
 
83
    static const int& message_level() { return message_level_; }
 
84
    //! return the current fatal error level
 
85
    static const int& fatal_level() { return fatal_level_; }
 
86
    //! set the output stream
 
87
    static void set_stream( std::ostream& stream );
 
88
    //! set the current message level
 
89
    static void set_message_level( const int& level );
 
90
    //! set the current fatal error level
 
91
    static void set_fatal_level( const int& level );
 
92
    //! pass a message
 
93
    template<class T> inline static void message( const T& message )
 
94
    {
 
95
      if ( message.level() >= Message::message_level() ) {
 
96
        Message::stream() << message.text() << "\n";
 
97
        if ( message.level() >= Message::fatal_level() ) throw message;
 
98
      }
 
99
    }
 
100
  private:
 
101
    static int message_level_;
 
102
    static int fatal_level_;
 
103
    static std::ostream* stream_;
 
104
  };
 
105
 
 
106
 
 
107
  //! Base type for messages
 
108
  class Message_base {
 
109
  public:
 
110
    const std::string& text() const;
 
111
    int level() const;
 
112
  protected:
 
113
    Message_base() {}
 
114
  };
 
115
 
 
116
  //! Generic message
 
117
  class Message_generic : public Message_base {
 
118
  public:
 
119
    Message_generic( const int& level, const std::string& text ) :
 
120
      text_( text ), level_( level ) {}
 
121
    const std::string& text() const { return text_; }
 
122
    const int& level() const { return level_; }
 
123
  private:
 
124
    std::string text_;
 
125
    int level_;
 
126
  };
 
127
 
 
128
  //! Fatal message (level = 9)
 
129
  class Message_fatal : public Message_base {
 
130
  public:
 
131
    Message_fatal( const std::string& text ) : text_( text ) {}
 
132
    const std::string& text() const { return text_; }
 
133
    static int level() { return 9; }
 
134
  private:
 
135
    std::string text_;
 
136
  };
 
137
 
 
138
  //! Warning message (level = 5)
 
139
  class Message_warn : public Message_base  {
 
140
  public:
 
141
    Message_warn( const std::string& text ) : text_( text ) {}
 
142
    const std::string& text() const { return text_; }
 
143
    static int level() { return 5; }
 
144
  private:
 
145
    std::string text_;
 
146
  };
 
147
 
 
148
  //! Info message (level = 1)
 
149
  class Message_info : public Message_base  {
 
150
  public:
 
151
    Message_info( const std::string& text ) : text_( text ) {}
 
152
    const std::string& text() const { return text_; }
 
153
    static int level() { return 1; }
 
154
  private:
 
155
    std::string text_;
 
156
  };
 
157
 
 
158
  //! Constructor message (level = 2)
 
159
  class Message_ctor : public Message_base  {
 
160
  public:
 
161
    Message_ctor( const std::string& text ) : text_( "+"+text ) {}
 
162
    const std::string& text() const { return text_; }
 
163
    static int level() { return 2; }
 
164
  private:
 
165
    std::string text_;
 
166
  };
 
167
 
 
168
  //! Destructor message (level = 2)
 
169
  class Message_dtor : public Message_base  {
 
170
  public:
 
171
    Message_dtor( const std::string& text ) : text_( "-"+text ) {}
 
172
    const std::string& text() const { return text_; }
 
173
    static int level() { return 2; }
 
174
  private:
 
175
    std::string text_;
 
176
  };
 
177
 
 
178
 
 
179
} // namespace clipper
 
180
 
 
181
#endif