3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
9 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
10 * によって公表されている GNU General Public License の Version 2 に記
11 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
36 * @(#) $Id: message.h,v 1.1 2009/01/31 05:27:37 suikan Exp $
39 // $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/message.h,v 1.1 2009/01/31 05:27:37 suikan Exp $
45 # pragma warning(disable:4290) //C++ の例外の指定は無視されます。関数が __declspec(nothrow) でないことのみ表示されます。
46 # pragma warning(disable:4786) //デバッグ情報で識別子が255文字に切り捨てられました。
54 //#include "base/testsuite.h"
55 #include "base/singleton.h"
56 #include "base/except.h"
64 std::string templatestring; //テンプレート文字列
65 std::stringstream content; //文字列整形と書式済み文字列可能場所用ストリーム
66 bool accept; //引数を受入可能かどうか
69 void shift(void) throw();
72 void shift_all(void) throw();
76 Formatter(void) throw();
79 Formatter(std::string src) throw();
82 Formatter(const Formatter & src) throw();
84 //テンプレート文字列の設定 (中身は消える)
85 void assign(std::string src) throw();
88 void clear(void) throw();
91 Formatter & operator =(const Formatter & src) throw();
95 Formatter & operator << (const T & src) throw()
97 std::string::size_type pos;
101 pos = content.str().size();
104 /* 空文字でなければ次の挿入場所に移動 */
105 if(pos != content.str().size())
112 std::string str(void) throw();
114 //標準出力ストリームへの出力用 operator << 定義
115 friend inline std::ostream & operator << (std::ostream & out, Formatter msg) throw()
117 out << msg.content.str();
121 // TESTSUITE_PROTOTYPE(main)
125 * メッセージ出力用に2言語対応を行った文字列整形ヘルパークラス
127 class Message : public Formatter
136 NEUTRAL = ENGLISH, //標準言語
143 int language; //どの言語を使用するのか
147 SINGLETON_CONSTRUCTOR(MessageControl) throw() : language(NEUTRAL) {};
150 inline void setLanguage(int _language) throw() { language = _language; }
151 inline int getLanguage(void) const throw() { return language; }
153 const char * select(const char * msg1, const char * msg2, va_list vl ) throw();
159 void _initialize(const char * src1, const char * src2, va_list vl) throw();
163 Message(void) throw();
166 Message(std::string src) throw();
169 Message(const char * src1, const char * src2, ... ) throw();
172 Message(const Message & src) throw();
174 //テンプレート文字列の設定 (中身は消える)
175 void assign(std::string src) throw() { Formatter::assign(src); }
176 void assign(const char * src1, const char * src2, ... ) throw();
179 static void selectLanguage(enum tagLanguage lang = NEUTRAL) throw();
182 static enum tagLanguage getCurrentLanguage(void) throw()
183 { return static_cast<enum tagLanguage>(Singleton<MessageControl>::getInstance()->getLanguage()); }
185 //TESTSUITE_PROTOTYPE(main)
192 class VerboseMessage : public Message
199 bool verbose; //冗長出力を行うかどうか
200 std::ostream * out; //出力先
203 SINGLETON_CONSTRUCTOR(VerboseControl) throw() : verbose(false), out(0)
208 inline const VerboseControl & operator << (const T & src) const throw()
210 if(verbose && out != 0)
216 void setVerbose(bool _verbose) throw()
217 { verbose = _verbose; }
218 bool getVerbose(void) const throw()
222 void setStream(std::ostream * _out) throw()
224 std::ostream * getStream(void) throw()
228 //冗長出力ストリーム (単純な抑止機構つきラッパークラス)
235 VerboseStream(std::ostream * _out = 0) throw() : out(_out) {};
238 VerboseStream & operator << (const T & src) throw()
247 //デフォルトコンストラクタ (テスト用)
248 VerboseMessage(void) throw();
253 VerboseMessage(const char * src) throw();
254 VerboseMessage(const std::string & src) throw();
255 VerboseMessage(const char * src1, const char * src2, ... ) throw();
258 ~VerboseMessage(void) throw();
261 inline static void setVerbose(bool _verbose) throw()
262 { Singleton<VerboseControl>::getInstance()->setVerbose(_verbose); }
264 //冗長出力先ストリーム設定 (アクセサ回送)
265 inline static void setStream(std::ostream * _stream) throw()
266 { Singleton<VerboseControl>::getInstance()->setStream(_stream); }
269 inline static bool getVerbose(void) throw()
270 { return Singleton<VerboseControl>::getInstance()->getVerbose(); }
272 //冗長出力先ストリームの取得 (設定したものと同じものは出てこない)
273 inline static VerboseStream getStream(void) throw()
274 { return VerboseStream(getVerbose() ? Singleton<VerboseControl>::getInstance()->getStream() : 0); }
276 //TESTSUITE_PROTOTYPE(main)
280 * 例外メッセージ用文字列整形ヘルパークラス
282 class ExceptionMessage : public Message
293 class ExceptionMessageException : public Exception
295 friend class ExceptionMessage;
297 ExceptionMessageException(int _code, std::string _details) throw() : Exception("ExceptionMessage", _code, _details) {}
306 ExceptionMessage(const char * src) throw();
307 ExceptionMessage(const std::string & src) throw();
308 ExceptionMessage(const char * src1, const char * src2, ...) throw();
310 ExceptionMessage(enum tagLevel level = DEFAULT) throw();
311 ExceptionMessage(enum tagLevel level, const char * src) throw();
312 ExceptionMessage(enum tagLevel level, const std::string & src) throw();
313 ExceptionMessage(enum tagLevel level, const char * src1, const char * src2, ...) throw();
315 ExceptionMessage(const ExceptionMessage & src) throw();
319 inline bool operator == (enum tagLevel _level) const throw()
320 { return level == _level; }
323 inline bool operator != (enum tagLevel _level) const throw()
324 { return !(operator ==(_level)); }
326 //引数の設定 (返却値の型をMessage & から ExceptionMessage & にするための小細工)
328 inline ExceptionMessage & operator << (const T & src) throw()
330 Message::operator << ( src );
334 #ifdef EXCEPT_H //Exceptionクラスを使用する場合
336 bool throwException(void) throw(Exception)
338 ExceptionMessageException exc(level, str());
339 return exc.throwException();
342 inline ExceptionMessage & operator << ( ExceptionMessage & (* func)(ExceptionMessage &) ) throw(Exception)
343 { return (*func)(*this); }
345 #else //stdexceptを使用する場合
348 bool throwException(void) throw(T)
354 inline ExceptionMessage & operator << ( ExceptionMessage & (* func)(ExceptionMessage &) ) throw(T)
355 { return (*func)(*this); }
358 //TESTSUITE_PROTOTYPE(main)
361 #ifdef EXCEPT_H //Exceptionクラスを使用する場合
364 inline ExceptionMessage & throwException(ExceptionMessage & excmsg) throw(Exception)
366 excmsg.throwException();
373 inline ExceptionMessage & throwException(ExceptionMessage & excmsg) throw(T)
375 excmsg.throwException<T>();
384 * デバッグ情報出力用文字列整形ヘルパークラス
386 class DebugMessage : public Formatter
389 //共通の冗長出力情報を持つクラス (シングルトンにするのでVerboseControlを同じものをクラス化する)
390 class DebugControl : public VerboseMessage::VerboseControl
391 { public: SINGLETON_CONSTRUCTOR_(DebugControl) throw() : VerboseMessage::VerboseControl(_singleton) {} };
395 //デフォルトコンストラクタ (テスト用)
396 DebugMessage(void) throw();
401 DebugMessage(std::string src) throw();
404 ~DebugMessage(void) throw();
407 inline static void setVerbose(bool _verbose) throw()
408 { Singleton<DebugControl>::getInstance()->setVerbose(_verbose); }
410 //冗長出力先ストリーム設定 (アクセサ回送)
411 inline static void setStream(std::ostream * _stream) throw()
412 { Singleton<DebugControl>::getInstance()->setStream(_stream); }
415 inline static bool getVerbose(void) throw()
416 { return Singleton<DebugControl>::getInstance()->getVerbose(); }
418 //冗長出力先ストリームの取得 (設定したものと同じものは出てこない)
419 inline static VerboseMessage::VerboseStream getStream(void) throw()
420 { return VerboseMessage::VerboseStream(getVerbose() ? Singleton<DebugControl>::getInstance()->getStream() : 0); }
422 // TESTSUITE_PROTOTYPE(main)