aGrUM
0.20.3
a C++ library for (probabilistic) graphical models
signaler0_inl.h
Go to the documentation of this file.
1
/**
2
*
3
* Copyright (c) 2005-2021 by Pierre-Henri WUILLEMIN(@LIP6) & Christophe GONZALES(@AMU)
4
* info_at_agrum_dot_org
5
*
6
* This library is free software: you can redistribute it and/or modify
7
* it under the terms of the GNU Lesser General Public License as published by
8
* the Free Software Foundation, either version 3 of the License, or
9
* (at your option) any later version.
10
*
11
* This library is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public License
17
* along with this library. If not, see <http://www.gnu.org/licenses/>.
18
*
19
*/
20
21
22
/**
23
* @file
24
* @brief Class of signalers.
25
*
26
* @author Pierre-Henri WUILLEMIN(@LIP6) & Christophe GONZALES(@AMU)
27
*
28
*/
29
30
// To help IDE parsers
31
#
include
<
agrum
/
tools
/
core
/
signal
/
signaler0
.
h
>
32
33
namespace
gum
{
34
35
#
ifndef
DOXYGEN_SHOULD_SKIP_THIS
36
namespace
__sig__
{
37
38
INLINE
39
bool
BasicSignaler0
::
hasListener
() {
return
(!(
connectors_
.
empty
())); }
40
41
INLINE
42
void
BasicSignaler0
::
detach
(
Listener
*
target
) {
43
auto
it
=
std
::
find_if
(
connectors_
.
begin
(),
connectors_
.
end
(),
_find_target_
(
target
));
44
45
while
(
it
!=
connectors_
.
end
()) {
46
delete
*
it
;
47
target
->
_detachSignal_
(
this
);
48
49
it
=
connectors_
.
erase
(
it
);
// it is the next one
50
it
=
std
::
find_if
(
it
,
connectors_
.
end
(),
_find_target_
(
target
));
51
}
52
}
53
54
INLINE
55
void
BasicSignaler0
::
detachFromTarget_
(
Listener
*
target
) {
56
auto
it
=
std
::
find_if
(
connectors_
.
begin
(),
connectors_
.
end
(),
_find_target_
(
target
));
57
58
while
(
it
!=
connectors_
.
end
()) {
59
delete
*
it
;
60
61
it
=
connectors_
.
erase
(
it
);
// it is the next one
62
it
=
std
::
find_if
(
it
,
connectors_
.
end
(),
_find_target_
(
target
));
63
}
64
}
65
66
INLINE
67
void
BasicSignaler0
::
duplicateTarget_
(
const
Listener
*
oldtarget
,
Listener
*
newtarget
) {
68
auto
it
=
std
::
find_if
(
connectors_
.
begin
(),
connectors_
.
end
(),
_find_target_
(
oldtarget
));
69
70
while
(
it
!=
connectors_
.
end
()) {
71
connectors_
.
push_back
((*
it
)->
duplicate
(
newtarget
));
72
73
it
++;
74
it
=
std
::
find_if
(
it
,
connectors_
.
end
(),
_find_target_
(
oldtarget
));
75
}
76
}
77
78
INLINE
79
std
::
function
<
bool
(
IConnector0
*
el
) >
BasicSignaler0
::
_find_target_
(
const
gum
::
Listener
*
l
) {
80
return
[=](
IConnector0
*
el
) ->
bool
{
81
return
el
->
target
() ==
l
;
82
};
83
}
84
85
}
// namespace __sig__
86
#
endif
87
88
}
// namespace gum
gum::__sig__
Internal namespace for aGrUM signaler/listener components.
Definition:
agrum.h:28
gum::Set::emplace
INLINE void emplace(Args &&... args)
Definition:
set_tpl.h:643