source: anotherchoice/tags/jsp-1.4.4-full-UTF8/cfg/base/message.h@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 14.1 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: message.h,v 1.5 2003/12/20 06:51:58 takayuki Exp $
51 */
52
53// $Header: /home/CVS/configurator/base/message.h,v 1.5 2003/12/20 06:51:58 takayuki Exp $
54
55#ifndef MESSAGE_H
56#define MESSAGE_H
57
58#ifdef _MSC_VER
59# pragma warning(disable:4290) //C++ の例外の指定は無視されます。関数が __declspec(nothrow) でないことのみ表示されます。
60# pragma warning(disable:4786) //デバッグ情
61報で識別子が255文字に切り捨てられました。
62#endif
63
64#include <string>
65#include <sstream>
66#include <stdarg.h>
67#include <stdexcept>
68
69//#include "base/testsuite.h"
70#include "base/singleton.h"
71#include "base/except.h"
72
73 /*
74 * 文字列整形ヘルパークラス
75 */
76class Formatter
77{
78protected:
79 std::string templatestring; //テンプレート文字列
80 std::stringstream content; //文字列整形と書式済み文字列可能場所用ストリーム
81 bool accept; //引数を受å…
82¥å¯èƒ½ã‹ã©ã†ã‹
83
84 //次の引数の挿å…
85¥å…
86ˆã¸ã¨ç§»å‹•
87 void shift(void) throw();
88
89 //未設定の引数を (null) で置換
90 void shift_all(void) throw();
91
92public:
93 //デフォルトコンストラクタ
94 Formatter(void) throw();
95
96 //コンストラクタ
97 Formatter(std::string src) throw();
98
99 //コピーコンストラクタ
100 Formatter(const Formatter & src) throw();
101
102 //テンプレート文字列の設定 (中身は消える)
103 void assign(std::string src) throw();
104
105 //内
106容のクリア
107 void clear(void) throw();
108
109 //代å…
110¥æ¼”算子
111 Formatter & operator =(const Formatter & src) throw();
112
113 //引数の設定
114 template<class T>
115 Formatter & operator << (const T & src) throw()
116 {
117 std::string::size_type pos;
118
119 //引数を受å…
120¥å¯èƒ½ãªã‚‰
121 if(accept) {
122 pos = content.str().size();
123 content << src;
124
125 /* 空文字でなければ次の挿å…
126¥å ´æ‰€ã«ç§»å‹• */
127 if(pos != content.str().size())
128 shift();
129 }
130 return *this;
131 }
132
133 //内
134部メッセージの取り出し
135 std::string str(void) throw();
136
137 //標準出力ストリームへの出力用 operator << 定義
138 friend inline std::ostream & operator << (std::ostream & out, Formatter msg) throw()
139 {
140 out << msg.content.str();
141 return out;
142 }
143
144// TESTSUITE_PROTOTYPE(main)
145};
146
147 /*
148 * メッセージ出力用に2言語対応を行った文字列整形ヘルパークラス
149 */
150class Message : public Formatter
151{
152public:
153 enum tagLanguage
154 {
155 ENGLISH = 0,
156 JAPANESE = 1,
157
158 LAST_LANG, //最後の位置
159 NEUTRAL = ENGLISH, //標準言語
160 };
161
162 /* 出力メッセージ言語制御クラス */
163 class MessageControl
164 {
165 protected:
166 int language; //どの言語を使用するのか
167
168 public:
169 //コンストラクタ
170 SINGLETON_CONSTRUCTOR(MessageControl) throw() : language(NEUTRAL) {};
171
172 //アクセサ
173 inline void setLanguage(int _language) throw() { language = _language; }
174 inline int getLanguage(void) const throw() { return language; }
175
176 const char * select(const char * msg1, const char * msg2, va_list vl ) throw();
177 };
178
179protected:
180
181 //派生クラス用コンストラクタ
182 void _initialize(const char * src1, const char * src2, va_list vl) throw();
183
184public:
185 //デフォルトコンストラクタ
186 Message(void) throw();
187
188 //コンストラクタ (単一言語)
189 Message(std::string src) throw();
190
191 //コンストラクタ (複数言語)
192 Message(const char * src1, const char * src2, ... ) throw();
193
194 //コピーコンストラクタ
195 Message(const Message & src) throw();
196
197 //テンプレート文字列の設定 (中身は消える)
198 void assign(std::string src) throw() { Formatter::assign(src); }
199 void assign(const char * src1, const char * src2, ... ) throw();
200
201 //言語選択
202 static void selectLanguage(enum tagLanguage lang = NEUTRAL) throw();
203
204 //言語の取得
205 static enum tagLanguage getCurrentLanguage(void) throw()
206 { return static_cast<enum tagLanguage>(Singleton<MessageControl>::getInstance()->getLanguage()); }
207
208 //TESTSUITE_PROTOTYPE(main)
209};
210
211
212 /*
213 * 冗長出力用文字列整形ヘルパークラス
214 */
215class VerboseMessage : public Message
216{
217public:
218 //å…
219±é€šã®å†—長出力情
220報を持つクラス
221 class VerboseControl
222 {
223 public:
224 bool verbose; //冗長出力を行うかどうか
225 std::ostream * out; //出力å…
226ˆ
227
228 //コンストラクタ
229 SINGLETON_CONSTRUCTOR(VerboseControl) throw() : verbose(false), out(0)
230 {}
231
232 //冗長出力制御
233 template<class T>
234 inline const VerboseControl & operator << (const T & src) const throw()
235 {
236 if(verbose && out != 0)
237 (*out) << src;
238 return *this;
239 }
240
241 //verboseアクセサ
242 void setVerbose(bool _verbose) throw()
243 { verbose = _verbose; }
244 bool getVerbose(void) const throw()
245 { return verbose; }
246
247 //outアクセサ
248 void setStream(std::ostream * _out) throw()
249 { out = _out; }
250 std::ostream * getStream(void) throw()
251 { return out; }
252 };
253
254 //冗長出力ストリーム (単純な抑止機構つきラッパークラス)
255 class VerboseStream
256 {
257 protected:
258 std::ostream * out;
259
260 public:
261 VerboseStream(std::ostream * _out = 0) throw() : out(_out) {};
262
263 template<class T>
264 VerboseStream & operator << (const T & src) throw()
265 {
266 if(out != 0)
267 (*out) << src;
268 return *this;
269 }
270 };
271
272protected:
273 //デフォルトコンストラクタ (テスト用)
274 VerboseMessage(void) throw();
275
276public:
277
278 //コンストラクタ
279 VerboseMessage(const char * src) throw();
280 VerboseMessage(const std::string & src) throw();
281 VerboseMessage(const char * src1, const char * src2, ... ) throw();
282
283 //デストラクタ
284 ~VerboseMessage(void) throw();
285
286 //冗長出力制御 (アクセサ回送)
287 inline static void setVerbose(bool _verbose) throw()
288 { Singleton<VerboseControl>::getInstance()->setVerbose(_verbose); }
289
290 //冗長出力å…
291ˆã‚¹ãƒˆãƒªãƒ¼ãƒ è¨­å®š (アクセサ回送)
292 inline static void setStream(std::ostream * _stream) throw()
293 { Singleton<VerboseControl>::getInstance()->setStream(_stream); }
294
295 //冗長出力制御の状æ…
296‹å–å¾—
297 inline static bool getVerbose(void) throw()
298 { return Singleton<VerboseControl>::getInstance()->getVerbose(); }
299
300 //冗長出力å…
301ˆã‚¹ãƒˆãƒªãƒ¼ãƒ ã®å–å¾— (設定したものと同じものは出てこない)
302 inline static VerboseStream getStream(void) throw()
303 { return VerboseStream(getVerbose() ? Singleton<VerboseControl>::getInstance()->getStream() : 0); }
304
305 //TESTSUITE_PROTOTYPE(main)
306};
307
308 /*
309 * 例外メッセージ用文字列整形ヘルパークラス
310 */
311class ExceptionMessage : public Message
312{
313public:
314 //例外の危険度レベル
315 enum tagLevel {
316 DEFAULT = 0,
317 FATAL = 1,
318 WARNING = 2
319 };
320
321#ifdef EXCEPT_H
322 class ExceptionMessageException : public Exception
323 {
324 friend class ExceptionMessage;
325 protected:
326 ExceptionMessageException(int _code, std::string _details) throw() : Exception("ExceptionMessage", _code, _details) {}
327 };
328#endif
329
330protected:
331 enum tagLevel level;
332
333public:
334 //コンストラクタ
335 ExceptionMessage(const char * src) throw();
336 ExceptionMessage(const std::string & src) throw();
337 ExceptionMessage(const char * src1, const char * src2, ...) throw();
338
339 ExceptionMessage(enum tagLevel level = DEFAULT) throw();
340 ExceptionMessage(enum tagLevel level, const char * src) throw();
341 ExceptionMessage(enum tagLevel level, const std::string & src) throw();
342 ExceptionMessage(enum tagLevel level, const char * src1, const char * src2, ...) throw();
343
344 ExceptionMessage(const ExceptionMessage & src) throw();
345
346
347 //危険度レベル参ç…
348§
349 inline bool operator == (enum tagLevel _level) const throw()
350 { return level == _level; }
351
352 //危険度レベル参ç…
353§
354 inline bool operator != (enum tagLevel _level) const throw()
355 { return !(operator ==(_level)); }
356
357 //引数の設定 (返却値の型をMessage & から ExceptionMessage & にするための小細工)
358 template<class T>
359 inline ExceptionMessage & operator << (const T & src) throw()
360 {
361 Message::operator << ( src );
362 return *this;
363 }
364
365#ifdef EXCEPT_H //Exceptionクラスを使用する場合
366 //例外の発生
367 bool throwException(void) throw(Exception)
368 {
369 ExceptionMessageException exc(level, str());
370 return exc.throwException();
371 }
372 //マニピュレータ
373 inline ExceptionMessage & operator << ( ExceptionMessage & (* func)(ExceptionMessage &) ) throw(Exception)
374 { return (*func)(*this); }
375
376#else //stdexceptを使用する場合
377 //例外の発生
378 template<class T>
379 bool throwException(void) throw(T)
380 {
381 throw T(str());
382 return true;
383 }
384 //マニピュレータ
385 inline ExceptionMessage & operator << ( ExceptionMessage & (* func)(ExceptionMessage &) ) throw(T)
386 { return (*func)(*this); }
387#endif
388
389 //TESTSUITE_PROTOTYPE(main)
390};
391
392#ifdef EXCEPT_H //Exceptionクラスを使用する場合
393
394 //例外をスローするためのマニピュレータ
395 inline ExceptionMessage & throwException(ExceptionMessage & excmsg) throw(Exception)
396 {
397 excmsg.throwException();
398 return excmsg;
399 }
400
401#else
402 //例外をスローするためのマニピュレータ
403 template<class T>
404 inline ExceptionMessage & throwException(ExceptionMessage & excmsg) throw(T)
405 {
406 excmsg.throwException<T>();
407 return excmsg;
408 }
409
410#endif
411
412
413
414 /*
415 * デバッグ情
416報出力用文字列整形ヘルパークラス
417 */
418class DebugMessage : public Formatter
419{
420public:
421 //å…
422±é€šã®å†—長出力情
423報を持つクラス (シングルトンにするのでVerboseControlを同じものをクラス化する)
424 class DebugControl : public VerboseMessage::VerboseControl
425 { public: SINGLETON_CONSTRUCTOR_(DebugControl) throw() : VerboseMessage::VerboseControl(_singleton) {} };
426
427
428protected:
429 //デフォルトコンストラクタ (テスト用)
430 DebugMessage(void) throw();
431
432public:
433
434 //コンストラクタ
435 DebugMessage(std::string src) throw();
436
437 //デストラクタ
438 ~DebugMessage(void) throw();
439
440 //冗長出力制御 (アクセサ回送)
441 inline static void setVerbose(bool _verbose) throw()
442 { Singleton<DebugControl>::getInstance()->setVerbose(_verbose); }
443
444 //冗長出力å…
445ˆã‚¹ãƒˆãƒªãƒ¼ãƒ è¨­å®š (アクセサ回送)
446 inline static void setStream(std::ostream * _stream) throw()
447 { Singleton<DebugControl>::getInstance()->setStream(_stream); }
448
449 //冗長出力制御の状æ…
450‹å–å¾—
451 inline static bool getVerbose(void) throw()
452 { return Singleton<DebugControl>::getInstance()->getVerbose(); }
453
454 //冗長出力å…
455ˆã‚¹ãƒˆãƒªãƒ¼ãƒ ã®å–å¾— (設定したものと同じものは出てこない)
456 inline static VerboseMessage::VerboseStream getStream(void) throw()
457 { return VerboseMessage::VerboseStream(getVerbose() ? Singleton<DebugControl>::getInstance()->getStream() : 0); }
458
459// TESTSUITE_PROTOTYPE(main)
460};
461
462
463#endif //MESSAGE_H
464
465
Note: See TracBrowser for help on using the repository browser.