NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.0: NDN, CCN, CCNx, content centric networks
API Documentation
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
ndnSIM
ndnSIM documentation
All Attributes
All GlobalValues
All LogComponents
All TraceSources
Todo List
Deprecated List
Modules
Namespaces
Classes
Files
File List
File Members
•
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Modules
Pages
signal-signal.hpp
Go to the documentation of this file.
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
22
#ifndef NDN_UTIL_SIGNAL_SIGNAL_HPP
23
#define NDN_UTIL_SIGNAL_SIGNAL_HPP
24
25
#include "
signal-connection.hpp
"
26
#include <list>
27
28
namespace
ndn
{
29
namespace
util {
30
namespace
signal
{
31
32
class
DummyExtraArg;
33
49
template
<
typename
Owner,
typename
...TArgs>
50
class
Signal
: noncopyable
51
{
52
public
:
// API for anyone
55
typedef
function
<void(
const
TArgs&...)>
Handler
;
56
57
Signal
();
58
59
~Signal
();
60
65
Connection
66
connect
(
const
Handler& handler);
67
72
Connection
73
connectSingleShot
(
const
Handler& handler);
74
75
private
:
// API for owner
78
bool
79
isEmpty()
const
;
80
88
void
89
operator()(
const
TArgs&...args);
90
94
void
95
operator()(
const
TArgs&...args,
const
DummyExtraArg
&);
96
97
// make Owner a friend of Signal<Owner, ...> so that API for owner can be called
98
#if NDN_CXX_HAVE_CXX_FRIEND_TYPENAME
99
friend
Owner;
100
#elif NDN_CXX_HAVE_CXX_FRIEND_TYPENAME_WRAPPER
101
template
<
typename
T>
102
struct
TypeWrapper
103
{
104
typedef
T Type;
105
};
// http://stackoverflow.com/a/5608542/3729203
106
friend
class
TypeWrapper<Owner>::Type;
107
#else
108
# error "cannot declare Owner as friend"
109
#endif
110
111
private
:
// internal implementation
112
typedef
Signal
<Owner, TArgs...>
Self
;
113
struct Slot;
114
119
typedef std::list<Slot> SlotList;
120
123
struct Slot
124
{
127
Handler handler;
128
138
shared_ptr<function<void()>> disconnect;
139
};
140
143
SlotList m_slots;
144
147
bool
m_isExecuting;
148
152
typename
SlotList::iterator
m_currentSlot;
153
156
void
157
disconnect(
typename
SlotList::iterator
it);
158
};
159
160
template
<
typename
Owner,
typename
...TArgs>
161
Signal<Owner, TArgs...>::Signal
()
162
: m_isExecuting(false)
163
{
164
}
165
166
template
<
typename
Owner,
typename
...TArgs>
167
Signal<Owner, TArgs...>::~Signal
()
168
{
169
BOOST_ASSERT(!m_isExecuting);
170
}
171
172
template
<
typename
Owner,
typename
...TArgs>
173
inline
Connection
174
Signal<Owner, TArgs...>::connect
(
const
Handler
& handler)
175
{
176
typename
SlotList::iterator
it = m_slots.insert(m_slots.end(), {handler,
nullptr
});
177
it->disconnect = make_shared<function<void()>>(bind(&Self::disconnect,
this
, it));
178
179
return
signal::Connection
(weak_ptr<
function
<
void
()>>(it->disconnect));
180
}
181
182
template
<
typename
Owner,
typename
...TArgs>
183
inline
Connection
184
Signal<Owner, TArgs...>::connectSingleShot
(
const
Handler
& handler)
185
{
186
typename
SlotList::iterator
it = m_slots.insert(m_slots.end(), {
nullptr
,
nullptr
});
187
it->disconnect = make_shared<function<void()>>(bind(&Self::disconnect,
this
, it));
188
signal::Connection
conn(weak_ptr<
function
<
void
()>>(it->disconnect));
189
190
it->handler = [conn, handler] (
const
TArgs&... args)
mutable
{
191
handler(args...);
192
conn.disconnect();
193
};
194
195
return
conn;
196
}
197
198
template
<
typename
Owner,
typename
...TArgs>
199
inline
void
200
Signal<Owner, TArgs...>::disconnect
(
typename
SlotList::iterator
it)
201
{
202
// it could be const_iterator, but gcc 4.6 doesn't support std::list::erase(const_iterator)
203
204
if
(m_isExecuting) {
205
// during signal emission, only the currently executing handler can be disconnected
206
BOOST_ASSERT_MSG(it == m_currentSlot,
207
"cannot disconnect another handler from a handler"
);
208
m_currentSlot = m_slots.end();
// prevent disconnect twice
209
}
210
m_slots.erase(it);
211
}
212
213
template
<
typename
Owner,
typename
...TArgs>
214
inline
bool
215
Signal<Owner, TArgs...>::isEmpty
()
const
216
{
217
return
!m_isExecuting && m_slots.empty();
218
}
219
220
template
<
typename
Owner,
typename
...TArgs>
221
inline
void
222
Signal<Owner, TArgs...>::operator()
(
const
TArgs&... args)
223
{
224
BOOST_ASSERT_MSG(!m_isExecuting,
"cannot emit signal from a handler"
);
225
if
(m_slots.empty()) {
226
return
;
227
}
228
m_isExecuting =
true
;
229
230
typename
SlotList::iterator
it = m_slots.begin();
231
typename
SlotList::iterator
last = m_slots.end();
232
--last;
233
234
try
{
235
bool
isLast =
false
;
236
while
(!isLast) {
237
m_currentSlot = it;
238
isLast = it == last;
239
++it;
240
241
m_currentSlot->handler(args...);
242
}
243
}
244
catch
(...) {
245
m_isExecuting =
false
;
246
throw
;
247
}
248
m_isExecuting =
false
;
249
}
250
251
template
<
typename
Owner,
typename
...TArgs>
252
inline
void
253
Signal<Owner, TArgs...>::operator()
(
const
TArgs&... args,
const
DummyExtraArg
&)
254
{
255
this->operator()(args...);
256
}
257
258
}
// namespace signal
259
260
// expose as ndn::util::Signal
261
using
signal::Signal
;
262
263
}
// namespace util
264
}
// namespace ndn
265
266
#endif // NDN_UTIL_SIGNAL_SIGNAL_HPP
ndn::util::signal::Signal::connectSingleShot
Connection connectSingleShot(const Handler &handler)
connects a single-shot handler to the signal
Definition:
signal-signal.hpp:184
ndn
Copyright (c) 2011-2015 Regents of the University of California.
Definition:
ndn-strategy-choice-helper.hpp:34
ndn::util::signal::Connection
represents a connection to a signal
Definition:
signal-connection.hpp:34
ndn::util::signal::Signal
provides a lightweight signal / event system
Definition:
signal-signal.hpp:50
nfd::cs::iterator
Table::const_iterator iterator
Definition:
cs-internal.hpp:41
ndn::util::signal::Signal::connect
Connection connect(const Handler &handler)
connects a handler to the signal
Definition:
signal-signal.hpp:174
ndn::util::signal::Signal::Signal
Signal()
Definition:
signal-signal.hpp:161
signal-connection.hpp
ndn::util::signal::Signal::~Signal
~Signal()
Definition:
signal-signal.hpp:167
ndn::util::signal::DummyExtraArg
(implementation detail) a filler for extra argument
Definition:
signal-emit.hpp:42
ndn::util::signal
Definition:
signal-connection.cpp:26
ndn::util::signal::Signal::Handler
function< void(const TArgs &...)> Handler
represents a function that can connect to the signal
Definition:
signal-signal.hpp:55
ndnSIM
ndn-cxx
src
util
signal-signal.hpp
Generated on Tue Feb 23 2016 22:18:44 for ndnSIM by
1.8.11