1
1
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2
2
// -----------------------------------------------------------------------------
3
- // Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3
+ // Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4
4
// See the top-level COPYRIGHT file for details.
5
5
// SPDX-License-Identifier: Apache-2.0
6
6
// -----------------------------------------------------------------------------
7
7
/* ---------------------------------------------------------------------------*/
8
- /* Event.cc (C) 2000-2023 */
8
+ /* Event.cc (C) 2000-2025 */
9
9
/* */
10
10
/* Gestionnaires d'évènements. */
11
11
/* ---------------------------------------------------------------------------*/
@@ -37,19 +37,13 @@ namespace Arcane
37
37
class EventObservableBase ::Impl
38
38
{
39
39
public:
40
- Impl (){}
41
- public:
42
- void rebuildOberversArray ()
43
- {
44
- m_observers_array.clear ();
45
- m_observers_array.reserve (arcaneCheckArraySize (m_observers.size ()));
46
- for ( auto o : m_observers )
47
- m_observers_array.add (o);
48
- }
40
+
41
+ Impl () {}
42
+
49
43
public:
44
+
50
45
std::set<EventObserverBase*> m_auto_destroy_observers;
51
46
std::set<EventObserverBase*> m_observers;
52
- UniqueArray<EventObserverBase*> m_observers_array;
53
47
};
54
48
55
49
/* ---------------------------------------------------------------------------*/
@@ -80,14 +74,26 @@ EventObservableBase::
80
74
/* ---------------------------------------------------------------------------*/
81
75
82
76
void EventObservableBase::
83
- _attachObserver (EventObserverBase* obs,bool is_auto_destroy)
77
+ _rebuildObserversArray ()
78
+ {
79
+ m_observers_array.clear ();
80
+ m_observers_array.reserve (m_p->m_observers .size ());
81
+ for (auto o : m_p->m_observers )
82
+ m_observers_array.add (o);
83
+ }
84
+
85
+ /* ---------------------------------------------------------------------------*/
86
+ /* ---------------------------------------------------------------------------*/
87
+
88
+ void EventObservableBase::
89
+ _attachObserver (EventObserverBase* obs, bool is_auto_destroy)
84
90
{
85
91
// Vérifie que l'observeur n'est pas dans la liste.
86
- if (m_p->m_observers .find (obs)!= m_p->m_observers .end ())
92
+ if (m_p->m_observers .find (obs) != m_p->m_observers .end ())
87
93
ARCANE_FATAL (" Observer is already attached to this observable" );
88
94
obs->_notifyAttach (this );
89
95
m_p->m_observers .insert (obs);
90
- m_p-> rebuildOberversArray ();
96
+ _rebuildObserversArray ();
91
97
if (is_auto_destroy)
92
98
m_p->m_auto_destroy_observers .insert (obs);
93
99
}
@@ -102,8 +108,8 @@ _detachObserver(EventObserverBase* obs)
102
108
// dynamiquement. Il n'y a donc pas besoin de mettre à jour
103
109
// m_p->m_auto_destroy_observers.
104
110
bool is_ok = false ;
105
- for ( auto o : m_p->m_observers )
106
- if (o== obs){
111
+ for ( auto o : m_p->m_observers )
112
+ if (o == obs) {
107
113
m_p->m_observers .erase (o);
108
114
is_ok = true ;
109
115
break ;
@@ -113,16 +119,7 @@ _detachObserver(EventObserverBase* obs)
113
119
if (!is_ok)
114
120
ARCANE_FATAL (" observer is not registered to this observable" );
115
121
obs->_notifyDetach ();
116
- m_p->rebuildOberversArray ();
117
- }
118
-
119
- /* ---------------------------------------------------------------------------*/
120
- /* ---------------------------------------------------------------------------*/
121
-
122
- ConstArrayView<EventObserverBase*> EventObservableBase::
123
- _observers () const
124
- {
125
- return m_p->m_observers_array ;
122
+ _rebuildObserversArray ();
126
123
}
127
124
128
125
/* ---------------------------------------------------------------------------*/
@@ -138,16 +135,6 @@ detachAllObservers()
138
135
delete o;
139
136
}
140
137
141
- /* ---------------------------------------------------------------------------*/
142
- /* ---------------------------------------------------------------------------*/
143
-
144
- bool EventObservableBase::
145
- hasObservers () const
146
- {
147
- return (m_p->m_observers .size ()!=0 );
148
- }
149
-
150
-
151
138
/* ---------------------------------------------------------------------------*/
152
139
/* ---------------------------------------------------------------------------*/
153
140
@@ -218,79 +205,6 @@ add(EventObserverBase* obs)
218
205
/* ---------------------------------------------------------------------------*/
219
206
/* ---------------------------------------------------------------------------*/
220
207
221
- /* ---------------------------------------------------------------------------*/
222
- /* ---------------------------------------------------------------------------*/
223
-
224
- namespace
225
- {
226
- class TestMemberCall
227
- {
228
- public:
229
- void my_func (int a,int b)
230
- {
231
- std::cout << " THIS_IS_MY FUNC XA=" << a << " B=" << b << ' \n ' ;
232
- }
233
- void operator ()(int a,int b)
234
- {
235
- std::cout << " THIS_IS OPERATOR() FUNC XA=" << a << " B=" << b << ' \n ' ;
236
- }
237
- };
238
- }
239
- extern " C++" ARCANE_UTILS_EXPORT void
240
- _internalTestEvent ()
241
- {
242
- using std::placeholders::_1;
243
- using std::placeholders::_2;
244
-
245
- int f = 3 ;
246
- auto func = [&](int a,int b){
247
- std::cout << " XA=" << a << " B=" << b << " f=" << f << ' \n ' ;
248
- f = a+b;
249
- };
250
- auto func2 = [&](int a,int b){
251
- std::cout << " FUNC2: XA=" << a << " B=" << b << " f=" << f << ' \n ' ;
252
- };
253
- TestMemberCall tmc;
254
- EventObserver<int ,int > x2 (func);
255
- {
256
- EventObservable<int ,int > xevent;
257
- EventObserverPool pool;
258
- {
259
- EventObserver<int ,int > xobserver;
260
- // NOTE: le test suivnant ne marche pas avec MSVS2013
261
- // std::function<void(TestMemberCall*,int,int)> kk1(&TestMemberCall::my_func);
262
- std::function<void (int ,int )> kk ( std::bind ( &TestMemberCall::my_func, tmc, _1, _2 ) );
263
- // std::function<void(int,int)> kk2( std::bind( &TestMemberCall::my_func, tmc ) );
264
- // auto kk( std::bind( &TestMemberCall::my_func, &tmc ) );
265
- EventObserver<int ,int > x4 (kk);
266
- EventObserver<int ,int > x3 (tmc);
267
- xevent.attach (&x2);
268
- xevent.attach (&x3);
269
- xevent.attach (&x4);
270
- xevent.attach (&xobserver);
271
- xevent.notify (2 ,3 );
272
- xevent.detach (&x4);
273
- }
274
- xevent.attach (pool,func2);
275
- }
276
- std::cout << " (After) F=" << f << ' \n ' ;
277
- if (f!=5 )
278
- ARCANE_FATAL (" Bad value for f" );
279
- {
280
- EventObserver<int ,int >* eo1 = nullptr ;
281
- EventObservable<int ,int > xevent;
282
- {
283
- eo1 = new EventObserver<int ,int >( std::bind ( &TestMemberCall::my_func, tmc, _1, _2 ) );
284
- xevent.attach (eo1);
285
- }
286
- xevent.notify (2 ,4 );
287
- delete eo1;
288
- }
289
- }
290
-
291
- /* ---------------------------------------------------------------------------*/
292
- /* ---------------------------------------------------------------------------*/
293
-
294
208
} // End namespace Arcane
295
209
296
210
/* ---------------------------------------------------------------------------*/
0 commit comments