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

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

initial

File size: 6.7 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) 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: event.h,v 1.9 2004/09/06 15:00:49 honda Exp $
51 */
52
53// $Header: /home/CVS/configurator/base/event.h,v 1.9 2004/09/06 15:00:49 honda Exp $
54
55#ifndef EVENT_H
56#define EVENT_H
57
58#include "base/testsuite.h"
59#include "base/singleton.h"
60
61#include <list>
62
63 //イベントフックの取りまとめ役
64template<typename T>
65class Event
66{
67public:
68 typedef void (*handler_type)(T &);
69
70 class handler_list_type : public std::list<handler_type>
71 { public: SINGLETON_CONSTRUCTOR(handler_list_type) throw() {} };
72
73 /*
74 * クラスの中のハンドラ用
75 */
76
77 class Handler
78 {
79 friend class Event;
80 public:
81 class instance_list_type : public std::list<Handler *>
82 { public: SINGLETON_CONSTRUCTOR(instance_list_type) throw() {} };
83
84 virtual void handler(T & ev) = 0;
85
86 protected:
87 //登録
88 Handler(void) throw()
89 { Singleton<instance_list_type>::getInstance()->push_back(this); }
90
91 //登録解除
92 virtual ~Handler(void) throw()
93 {
94 typename Event<T>::Handler::instance_list_type * list = Singleton<instance_list_type>::getInstance(std::nothrow);
95 typename Event<T>::Handler::instance_list_type::iterator scope;
96
97 if(list != 0) {
98 scope = list->begin();
99 while(scope != list->end()) {
100 if(*scope == this) {
101 typename Event<T>::Handler::instance_list_type::iterator target = scope;
102 ++ scope;
103 list->erase(target);
104 }
105 else
106 ++ scope;
107 }
108 }
109 }
110 };
111
112public:
113 typedef T value_type;
114
115 Event(void) {}
116 virtual ~Event(void) {}
117
118 /*
119 * スタティックなハンドラ用
120 */
121
122 //イベントにハンドラを追加
123 inline static void add(handler_type func) throw(std::bad_alloc)
124 { Singleton<handler_list_type>::getInstance()->push_back(func); }
125
126 //イベントからハンドラを削除
127 static void remove(handler_type func) throw()
128 {
129 typename Event<T>::handler_list_type * list;
130 typename Event<T>::handler_list_type::iterator scope;
131
132 list = Singleton<handler_list_type>::getInstance(std::nothrow);
133 if(list != 0) {
134 scope = list->begin();
135 while(scope != list->end()) {
136 if(*scope == func) {
137 typename handler_list_type::iterator target = scope;
138 ++ scope;
139 list->erase(target);
140 }
141 else
142 ++ scope;
143 }
144 }
145 }
146
147 /*
148 * å…
149±é€šæ“ä½œ
150 */
151 //イベントの発生
152 static void raise(T & ev)
153 {
154 typedef typename Event<T>::handler_list_type handler_list_type_t;
155 typedef typename Event<T>::Handler::instance_list_type instance_list_type_t;
156
157 /* 登録された静的な関数にイベントを発行 */ {
158 handler_list_type_t * list;
159 typename handler_list_type_t::iterator scope;
160
161 list = Singleton<handler_list_type_t>::getInstance(); //throw(bad_cast)
162
163 scope = list->begin();
164 while(scope != list->end()) {
165 (**scope)(ev);
166 ++ scope;
167 }
168 }
169
170 /* 登録されたクラスインスタンスにイベントを発行 */ {
171 instance_list_type_t * list;
172 typename instance_list_type_t::iterator scope;
173
174 list = Singleton<instance_list_type_t>::getInstance(); //throw(bad_cast)
175
176 scope = list->begin();
177 while(scope != list->end()) {
178 (*scope)->handler(ev);
179 ++ scope;
180 }
181 }
182 }
183
184 //イベントの発生 (引数なし)
185 inline static void raise(void)
186 {
187 T ev;
188 raise(ev);
189 }
190};
191
192
193 /*
194 * 汎用イベント
195 */
196
197 //コンストラクタが起動し終わったあと、真っå…
198ˆã«èµ·ã‚‹ã‚¤ãƒ™ãƒ³ãƒˆ
199class StartupEvent {};
200
201
202 //成功失敗を問わず、プログラムが終わるときに起るイベント
203struct ShutdownEvent
204{
205 int exit_code;
206};
207
208#endif
209
210
211
Note: See TracBrowser for help on using the repository browser.