aGrUM
0.20.2
a C++ library for (probabilistic) graphical models
signaler0_inl.h
Go to the documentation of this file.
1
/**
2
*
3
* Copyright 2005-2020 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
(),
44
connectors_
.
end
(),
45
find_target__
(
target
));
46
47
while
(
it
!=
connectors_
.
end
()) {
48
delete
*
it
;
49
target
->
detachSignal__
(
this
);
50
51
it
=
connectors_
.
erase
(
it
);
// it is the next one
52
it
=
std
::
find_if
(
it
,
connectors_
.
end
(),
find_target__
(
target
));
53
}
54
}
55
56
INLINE
57
void
BasicSignaler0
::
detachFromTarget_
(
Listener
*
target
) {
58
auto
it
=
std
::
find_if
(
connectors_
.
begin
(),
59
connectors_
.
end
(),
60
find_target__
(
target
));
61
62
while
(
it
!=
connectors_
.
end
()) {
63
delete
*
it
;
64
65
it
=
connectors_
.
erase
(
it
);
// it is the next one
66
it
=
std
::
find_if
(
it
,
connectors_
.
end
(),
find_target__
(
target
));
67
}
68
}
69
70
INLINE
71
void
BasicSignaler0
::
duplicateTarget_
(
const
Listener
*
oldtarget
,
72
Listener
*
newtarget
) {
73
auto
it
=
std
::
find_if
(
connectors_
.
begin
(),
74
connectors_
.
end
(),
75
find_target__
(
oldtarget
));
76
77
while
(
it
!=
connectors_
.
end
()) {
78
connectors_
.
push_back
((*
it
)->
duplicate
(
newtarget
));
79
80
it
++;
81
it
=
std
::
find_if
(
it
,
connectors_
.
end
(),
find_target__
(
oldtarget
));
82
}
83
}
84
85
INLINE
86
std
::
function
<
bool
(
IConnector0
*
el
) >
87
BasicSignaler0
::
find_target__
(
const
gum
::
Listener
*
l
) {
88
return
[=](
IConnector0
*
el
) ->
bool
{
89
return
el
->
target
() ==
l
;
90
};
91
}
92
93
}
// namespace __sig__
94
#
endif
95
96
}
// 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:669