Skip to content

Commit b54661d

Browse files
Merge pull request #2010 from arcaneframework/dev/gg-cleanup-event
Cleanup classes handling Events
2 parents 3996037 + 98f1c03 commit b54661d

File tree

5 files changed

+176
-157
lines changed

5 files changed

+176
-157
lines changed

arcane/src/arcane/tests/UtilsUnitTest.cc

+2-23
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* UtilsUnitTest.cc (C) 2000-2024 */
8+
/* UtilsUnitTest.cc (C) 2000-2025 */
99
/* */
1010
/* Test des fonctions utilitaires de Arcane. */
1111
/*---------------------------------------------------------------------------*/
@@ -16,7 +16,6 @@
1616
#include "arcane/utils/ArgumentException.h"
1717
#include "arcane/utils/AutoDestroyUserData.h"
1818
#include "arcane/utils/HPReal.h"
19-
#include "arcane/utils/IFunctorWithArgument.h"
2019
#include "arcane/utils/IMemoryInfo.h"
2120
#include "arcane/utils/ITraceMng.h"
2221
#include "arcane/utils/PlatformUtils.h"
@@ -33,19 +32,11 @@
3332
#include "arcane/core/FactoryService.h"
3433
#include "arcane/core/ServiceBuilder.h"
3534

36-
#include "arcane/tests/ArcaneTestGlobal.h"
37-
3835
#include <fenv.h>
3936

4037
/*---------------------------------------------------------------------------*/
4138
/*---------------------------------------------------------------------------*/
4239

43-
namespace Arcane
44-
{
45-
extern "C++" ARCANE_UTILS_EXPORT void
46-
_internalTestEvent();
47-
}
48-
4940
namespace ArcaneTest
5041
{
5142

@@ -119,7 +110,6 @@ class UtilsUnitTest
119110
void _testStackTrace();
120111
void _testSetClassConfig();
121112
void _testFloatingException();
122-
void _testEvents();
123113
void _testConvertFromString();
124114
void _testConvertFromStringToInt32Array();
125115
void _testCommandLine();
@@ -164,7 +154,6 @@ executeTest()
164154
_testUserData();
165155
_testHPReal();
166156
_testTruncateReal();
167-
_testEvents();
168157

169158
info() << Trace::Color::darkRed() << "[TEST_COLOR] DARK_RED";
170159
info() << Trace::Color::darkGreen() << "[TEST_COLOR] DARK_GREEN";
@@ -760,16 +749,6 @@ _printMemoryInfos()
760749
/*---------------------------------------------------------------------------*/
761750
/*---------------------------------------------------------------------------*/
762751

763-
void UtilsUnitTest::
764-
_testEvents()
765-
{
766-
info() << "INTERNAL TEST EVENT";
767-
_internalTestEvent();
768-
}
769-
770-
/*---------------------------------------------------------------------------*/
771-
/*---------------------------------------------------------------------------*/
772-
773752
void UtilsUnitTest::
774753
_testConvertFromString()
775754
{

arcane/src/arcane/utils/Event.cc

+24-110
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* Event.cc (C) 2000-2023 */
8+
/* Event.cc (C) 2000-2025 */
99
/* */
1010
/* Gestionnaires d'évènements. */
1111
/*---------------------------------------------------------------------------*/
@@ -37,19 +37,13 @@ namespace Arcane
3737
class EventObservableBase::Impl
3838
{
3939
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+
4943
public:
44+
5045
std::set<EventObserverBase*> m_auto_destroy_observers;
5146
std::set<EventObserverBase*> m_observers;
52-
UniqueArray<EventObserverBase*> m_observers_array;
5347
};
5448

5549
/*---------------------------------------------------------------------------*/
@@ -80,14 +74,26 @@ EventObservableBase::
8074
/*---------------------------------------------------------------------------*/
8175

8276
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)
8490
{
8591
// 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())
8793
ARCANE_FATAL("Observer is already attached to this observable");
8894
obs->_notifyAttach(this);
8995
m_p->m_observers.insert(obs);
90-
m_p->rebuildOberversArray();
96+
_rebuildObserversArray();
9197
if (is_auto_destroy)
9298
m_p->m_auto_destroy_observers.insert(obs);
9399
}
@@ -102,8 +108,8 @@ _detachObserver(EventObserverBase* obs)
102108
// dynamiquement. Il n'y a donc pas besoin de mettre à jour
103109
// m_p->m_auto_destroy_observers.
104110
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) {
107113
m_p->m_observers.erase(o);
108114
is_ok = true;
109115
break;
@@ -113,16 +119,7 @@ _detachObserver(EventObserverBase* obs)
113119
if (!is_ok)
114120
ARCANE_FATAL("observer is not registered to this observable");
115121
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();
126123
}
127124

128125
/*---------------------------------------------------------------------------*/
@@ -138,16 +135,6 @@ detachAllObservers()
138135
delete o;
139136
}
140137

141-
/*---------------------------------------------------------------------------*/
142-
/*---------------------------------------------------------------------------*/
143-
144-
bool EventObservableBase::
145-
hasObservers() const
146-
{
147-
return (m_p->m_observers.size()!=0);
148-
}
149-
150-
151138
/*---------------------------------------------------------------------------*/
152139
/*---------------------------------------------------------------------------*/
153140

@@ -218,79 +205,6 @@ add(EventObserverBase* obs)
218205
/*---------------------------------------------------------------------------*/
219206
/*---------------------------------------------------------------------------*/
220207

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-
294208
} // End namespace Arcane
295209

296210
/*---------------------------------------------------------------------------*/

0 commit comments

Comments
 (0)