A Discrete-Event Network Simulator
API
file-helper.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2013 University of Washington
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Mitch Watrous (watrous@u.washington.edu)
19 */
20
21#include <iostream>
22#include <fstream>
23#include <string>
24
25#include "file-helper.h"
26#include "ns3/abort.h"
27#include "ns3/log.h"
28#include "ns3/config.h"
29#include "ns3/get-wildcard-matches.h"
30
31namespace ns3 {
32
33NS_LOG_COMPONENT_DEFINE ("FileHelper");
34
36 : m_aggregator (0),
37 m_fileProbeCount (0),
38 m_fileType (FileAggregator::SPACE_SEPARATED),
39 m_outputFileNameWithoutExtension ("file-helper"),
40 m_hasHeadingBeenSet (false)
41{
42 NS_LOG_FUNCTION (this);
43
44 // Note that this does not construct an aggregator. It will be
45 // constructed later when needed.
46}
47
48FileHelper::FileHelper (const std::string &outputFileNameWithoutExtension,
49 enum FileAggregator::FileType fileType)
50 : m_aggregator (0),
51 m_fileProbeCount (0),
52 m_fileType (fileType),
53 m_outputFileNameWithoutExtension (outputFileNameWithoutExtension),
54 m_hasHeadingBeenSet (false)
55{
56 NS_LOG_FUNCTION (this);
57
58 // Note that this does not construct an aggregator. It will be
59 // constructed later when needed.
60}
61
63{
64 NS_LOG_FUNCTION (this);
65}
66
67void
68FileHelper::ConfigureFile (const std::string &outputFileNameWithoutExtension,
69 enum FileAggregator::FileType fileType)
70{
71 NS_LOG_FUNCTION (this << outputFileNameWithoutExtension << fileType);
72
73 // See if an aggregator has already been constructed.
74 if (m_aggregator != 0)
75 {
76 NS_LOG_WARN ("An existing aggregator object " << m_aggregator <<
77 " may be destroyed if no references remain.");
78 }
79
80 // Store these so that they can be used to construct the aggregator.
81 m_fileType = fileType;
82 m_outputFileNameWithoutExtension = outputFileNameWithoutExtension;
83 m_hasHeadingBeenSet = false;
84
85 // Note that this does not construct an aggregator. It will be
86 // constructed later when needed.
87}
88
89void
90FileHelper::WriteProbe (const std::string &typeId,
91 const std::string &path,
92 const std::string &probeTraceSource)
93{
94 NS_LOG_FUNCTION (this << typeId << path << probeTraceSource);
95
96 std::string pathWithoutLastToken;
97 std::string lastToken;
98
99 // See if the path has any wildcards.
100 bool pathHasNoWildcards = path.find ("*") == std::string::npos;
101
102 // Remove the last token from the path.
103 size_t lastSlash = path.find_last_of ("/");
104 if (lastSlash == std::string::npos)
105 {
106 pathWithoutLastToken = path;
107 lastToken = "";
108 }
109 else
110 {
111 // Chop off up to last token.
112 pathWithoutLastToken = path.substr (0, lastSlash);
113
114 // Save the last token without the last slash.
115 lastToken = path.substr (lastSlash + 1, std::string::npos);
116 }
117
118 // See if there are any matches for the probe's path with the last
119 // token removed.
120 Config::MatchContainer matches = Config::LookupMatches (pathWithoutLastToken);
121 uint32_t matchCount = matches.GetN ();
122
123 // This is used to make the probe's context be unique.
124 std::string matchIdentifier;
125
127 bool onlyOneAggregator;
128
129 // Hook one or more probes and one or more aggregators together.
130 if (matchCount == 1 && pathHasNoWildcards)
131 {
132 // Connect the probe to the aggregator only once because there
133 // is only one matching config path. There is no need to find
134 // the wildcard matches because the passed in path has none.
135 matchIdentifier = "0";
136 onlyOneAggregator = true;
138 matchIdentifier,
139 path,
140 probeTraceSource,
142 onlyOneAggregator);
143 }
144 else if (matchCount > 0)
145 {
146 // Handle all of the matches if there are more than one.
147 for (uint32_t i = 0; i < matchCount; i++)
148 {
149 // Set the match identifier.
150 std::ostringstream matchIdentifierStream;
151 matchIdentifierStream << i;
152 matchIdentifier = matchIdentifierStream.str ();
153 onlyOneAggregator = false;
154
155 // Construct the matched path and get the matches for each
156 // of the wildcards.
157 std::string wildcardSeparator = "-";
158 std::string matchedPath = matches.GetMatchedPath (i) + lastToken;
159 std::string wildcardMatches = GetWildcardMatches (path,
160 matchedPath,
161 wildcardSeparator);
162
163 // Connect the probe to the aggregator for this match.
165 matchIdentifier,
166 matchedPath,
167 probeTraceSource,
168 m_outputFileNameWithoutExtension + "-" + wildcardMatches,
169 onlyOneAggregator);
170 }
171 }
172 else
173 {
174 // There is a problem if there are no matching config paths.
175 NS_FATAL_ERROR ("Lookup of " << path << " got no matches");
176 }
177}
178
179void
180FileHelper::AddProbe (const std::string &typeId,
181 const std::string &probeName,
182 const std::string &path)
183{
184 NS_LOG_FUNCTION (this << typeId << probeName << path);
185
186 // See if this probe had already been added.
187 if (m_probeMap.count (probeName) > 0)
188 {
189 NS_ABORT_MSG ("That probe has already been added");
190 }
191
192 // Prepare the factory to create an object with the requested type.
193 m_factory.SetTypeId (typeId);
194
195 // Create a base class object in order to validate the type.
196 Ptr<Probe> probe = m_factory.Create ()->GetObject<Probe> ();
197 if (probe == 0)
198 {
199 NS_ABORT_MSG ("The requested type is not a probe");
200 }
201
202 // Set the probe's name.
203 probe->SetName (probeName);
204
205 // Set the path. Note that no return value is checked here.
206 probe->ConnectByPath (path);
207
208 // Enable logging of data for the probe.
209 probe->Enable ();
210
211 // Add this probe to the map so that its values can be used.
212 m_probeMap[probeName] = std::make_pair (probe, typeId);
213}
214
215void
216FileHelper::AddTimeSeriesAdaptor (const std::string &adaptorName)
217{
218 NS_LOG_FUNCTION (this << adaptorName);
219
220 // See if this time series adaptor had already been added.
221 if (m_timeSeriesAdaptorMap.count (adaptorName) > 0)
222 {
223 NS_ABORT_MSG ("That time series adaptor has already been added");
224 }
225
226 // Create the time series adaptor.
227 Ptr<TimeSeriesAdaptor> timeSeriesAdaptor = CreateObject<TimeSeriesAdaptor> ();
228
229 // Enable logging of data for the time series adaptor.
230 timeSeriesAdaptor->Enable ();
231
232 // Add this time series adaptor to the map so that it can be used.
233 m_timeSeriesAdaptorMap[adaptorName] = timeSeriesAdaptor;
234}
235
236void
237FileHelper::AddAggregator (const std::string &aggregatorName,
238 const std::string &outputFileName,
239 bool onlyOneAggregator)
240{
241 NS_LOG_FUNCTION (this << aggregatorName << outputFileName << onlyOneAggregator);
242
243 // See if this file aggregator had already been added.
244 if (m_aggregatorMap.count (aggregatorName) > 0)
245 {
246 NS_ABORT_MSG ("That file aggregator has already been added");
247 }
248
249 // If there is only going to be 1 file aggregator, then use the one
250 // already constructed in the map.
251 if (onlyOneAggregator)
252 {
253 // Get a pointer to the aggregator.
254 Ptr<FileAggregator> singleAggregator = GetAggregatorSingle ();
255
256 m_aggregatorMap[aggregatorName] = singleAggregator;
257 return;
258 }
259
260 // Create the file aggregator with the proper file type.
261 Ptr<FileAggregator> multipleAggregator =
262 CreateObject<FileAggregator> (outputFileName, m_fileType);
263
264 // Set all of the format strings for the aggregator.
265 multipleAggregator->Set1dFormat (m_1dFormat);
266 multipleAggregator->Set2dFormat (m_2dFormat);
267 multipleAggregator->Set3dFormat (m_3dFormat);
268 multipleAggregator->Set4dFormat (m_4dFormat);
269 multipleAggregator->Set5dFormat (m_5dFormat);
270 multipleAggregator->Set6dFormat (m_6dFormat);
271 multipleAggregator->Set7dFormat (m_7dFormat);
272 multipleAggregator->Set8dFormat (m_8dFormat);
273 multipleAggregator->Set9dFormat (m_9dFormat);
274 multipleAggregator->Set10dFormat (m_10dFormat);
275
276 // Set the heading
277 multipleAggregator->SetHeading (m_heading);
278
279 // Enable logging of data for the file aggregator.
280 multipleAggregator->Enable ();
281
282 // Add this file aggregator to the map so that it can be used.
283 m_aggregatorMap[aggregatorName] = multipleAggregator;
284}
285
287FileHelper::GetProbe (std::string probeName) const
288{
289 NS_LOG_FUNCTION (this << probeName);
290
291 // Look for the probe.
292 std::map<std::string, std::pair <Ptr<Probe>, std::string> >::const_iterator mapIterator = m_probeMap.find (probeName);
293
294 // Return the probe if it has been added.
295 if (mapIterator != m_probeMap.end ())
296 {
297 return mapIterator->second.first;
298 }
299 else
300 {
301 NS_ABORT_MSG ("That probe has not been added");
302 }
303}
304
307{
308 NS_LOG_FUNCTION (this);
309
310 // Do a lazy construction of the single aggregator if it hasn't
311 // already been constructed.
312 if (!m_aggregator)
313 {
314 // Create the aggregator.
315 std::string outputFileName = m_outputFileNameWithoutExtension + ".txt";
316 m_aggregator = CreateObject<FileAggregator> (outputFileName, m_fileType);
317
318 // Set all of the format strings for the aggregator.
319 m_aggregator->Set1dFormat (m_1dFormat);
320 m_aggregator->Set2dFormat (m_2dFormat);
321 m_aggregator->Set3dFormat (m_3dFormat);
322 m_aggregator->Set4dFormat (m_4dFormat);
323 m_aggregator->Set5dFormat (m_5dFormat);
324 m_aggregator->Set6dFormat (m_6dFormat);
325 m_aggregator->Set7dFormat (m_7dFormat);
326 m_aggregator->Set8dFormat (m_8dFormat);
327 m_aggregator->Set9dFormat (m_9dFormat);
328 m_aggregator->Set10dFormat (m_10dFormat);
329
330 // Set the heading
331 m_aggregator->SetHeading (m_heading);
332
333 // Enable logging of data for the aggregator.
334 m_aggregator->Enable ();
335 }
336 return m_aggregator;
337}
338
340FileHelper::GetAggregatorMultiple (const std::string &aggregatorName,
341 const std::string &outputFileName)
342{
343 NS_LOG_FUNCTION (this);
344
345 // See if this file aggregator had already been added.
346 if (m_aggregatorMap.count (aggregatorName) > 0)
347 {
348 return m_aggregatorMap[aggregatorName];
349 }
350
351 // Do a lazy construction of the aggregator if it hasn't already
352 // been constructed.
353 bool onlyOneAggregator = false;
354 AddAggregator (aggregatorName,
355 outputFileName,
356 onlyOneAggregator);
357
358 return m_aggregatorMap[aggregatorName];
359}
360
361void
362FileHelper::SetHeading (const std::string &heading)
363{
364 NS_LOG_FUNCTION (this << heading);
365
366 m_hasHeadingBeenSet = true;
367 m_heading = heading;
368}
369
370void
371FileHelper::Set1dFormat (const std::string &format)
372{
373 NS_LOG_FUNCTION (this << format);
374
375 m_1dFormat = format;
376}
377
378void
379FileHelper::Set2dFormat (const std::string &format)
380{
381 NS_LOG_FUNCTION (this << format);
382
383 m_2dFormat = format;
384}
385
386void
387FileHelper::Set3dFormat (const std::string &format)
388{
389 NS_LOG_FUNCTION (this << format);
390
391 m_3dFormat = format;
392}
393
394void
395FileHelper::Set4dFormat (const std::string &format)
396{
397 NS_LOG_FUNCTION (this << format);
398
399 m_4dFormat = format;
400}
401
402void
403FileHelper::Set5dFormat (const std::string &format)
404{
405 NS_LOG_FUNCTION (this << format);
406
407 m_5dFormat = format;
408}
409
410void
411FileHelper::Set6dFormat (const std::string &format)
412{
413 NS_LOG_FUNCTION (this << format);
414
415 m_6dFormat = format;
416}
417
418void
419FileHelper::Set7dFormat (const std::string &format)
420{
421 NS_LOG_FUNCTION (this << format);
422
423 m_7dFormat = format;
424}
425
426void
427FileHelper::Set8dFormat (const std::string &format)
428{
429 NS_LOG_FUNCTION (this << format);
430
431 m_8dFormat = format;
432}
433
434void
435FileHelper::Set9dFormat (const std::string &format)
436{
437 NS_LOG_FUNCTION (this << format);
438
439 m_9dFormat = format;
440}
441
442void
443FileHelper::Set10dFormat (const std::string &format)
444{
445 NS_LOG_FUNCTION (this << format);
446
447 m_10dFormat = format;
448}
449
450void
451FileHelper::ConnectProbeToAggregator (const std::string &typeId,
452 const std::string &matchIdentifier,
453 const std::string &path,
454 const std::string &probeTraceSource,
455 const std::string &outputFileNameWithoutExtension,
456 bool onlyOneAggregator)
457{
458 NS_LOG_FUNCTION (this << typeId << matchIdentifier << path << probeTraceSource
459 << outputFileNameWithoutExtension << onlyOneAggregator);
460
461 // Increment the total number of file probes that have been created.
463
464 // Create a unique name for this probe.
465 std::ostringstream probeNameStream;
466 probeNameStream << "FileProbe-" << m_fileProbeCount;
467 std::string probeName = probeNameStream.str ();
468
469 // Create a unique dataset context string for this probe.
470 std::string probeContext = probeName
471 + "/" + matchIdentifier + "/" + probeTraceSource;
472
473 // Add the probe to the map of probes, which will keep the probe in
474 // memory after this function ends.
475 AddProbe (typeId, probeName, path);
476
477 // Because the callbacks to the probes' trace sources don't use the
478 // probe's context, a unique adaptor needs to be created for each
479 // probe context so that information is not lost.
480 AddTimeSeriesAdaptor (probeContext);
481
482 // Connect the probe to the adaptor.
483 if (m_probeMap[probeName].second == "ns3::DoubleProbe")
484 {
485 m_probeMap[probeName].first->TraceConnectWithoutContext
486 (probeTraceSource,
488 m_timeSeriesAdaptorMap[probeContext]));
489 }
490 else if (m_probeMap[probeName].second == "ns3::BooleanProbe")
491 {
492 m_probeMap[probeName].first->TraceConnectWithoutContext
493 (probeTraceSource,
495 m_timeSeriesAdaptorMap[probeContext]));
496 }
497 else if (m_probeMap[probeName].second == "ns3::PacketProbe")
498 {
499 m_probeMap[probeName].first->TraceConnectWithoutContext
500 (probeTraceSource,
502 m_timeSeriesAdaptorMap[probeContext]));
503 }
504 else if (m_probeMap[probeName].second == "ns3::ApplicationPacketProbe")
505 {
506 m_probeMap[probeName].first->TraceConnectWithoutContext
507 (probeTraceSource,
509 m_timeSeriesAdaptorMap[probeContext]));
510 }
511 else if (m_probeMap[probeName].second == "ns3::Ipv4PacketProbe")
512 {
513 m_probeMap[probeName].first->TraceConnectWithoutContext
514 (probeTraceSource,
516 m_timeSeriesAdaptorMap[probeContext]));
517 }
518 else if (m_probeMap[probeName].second == "ns3::Ipv6PacketProbe")
519 {
520 m_probeMap[probeName].first->TraceConnectWithoutContext
521 (probeTraceSource,
523 m_timeSeriesAdaptorMap[probeContext]));
524 }
525 else if (m_probeMap[probeName].second == "ns3::Uinteger8Probe")
526 {
527 m_probeMap[probeName].first->TraceConnectWithoutContext
528 (probeTraceSource,
530 m_timeSeriesAdaptorMap[probeContext]));
531 }
532 else if (m_probeMap[probeName].second == "ns3::Uinteger16Probe")
533 {
534 m_probeMap[probeName].first->TraceConnectWithoutContext
535 (probeTraceSource,
537 m_timeSeriesAdaptorMap[probeContext]));
538 }
539 else if (m_probeMap[probeName].second == "ns3::Uinteger32Probe")
540 {
541 m_probeMap[probeName].first->TraceConnectWithoutContext
542 (probeTraceSource,
544 m_timeSeriesAdaptorMap[probeContext]));
545 }
546 else if (m_probeMap[probeName].second == "ns3::TimeProbe")
547 {
548 m_probeMap[probeName].first->TraceConnectWithoutContext
549 (probeTraceSource,
551 m_timeSeriesAdaptorMap[probeContext]));
552 }
553 else
554 {
555 NS_FATAL_ERROR ("Unknown probe type " << m_probeMap[probeName].second << "; need to add support in the helper for this");
556 }
557
558 // Add the aggregator to the map of aggregators, which will keep the
559 // aggregator in memory after this function ends.
560 std::string outputFileName = outputFileNameWithoutExtension + ".txt";
561 AddAggregator (probeContext, outputFileName, onlyOneAggregator);
562
563 // Connect the adaptor to the aggregator.
564 std::string adaptorTraceSource = "Output";
565 m_timeSeriesAdaptorMap[probeContext]->TraceConnect
566 (adaptorTraceSource,
567 probeContext,
569 m_aggregatorMap[probeContext]));
570}
571
572} // namespace ns3
573
hold a set of objects which match a specific search string.
Definition: config.h:193
std::string GetMatchedPath(uint32_t i) const
Definition: config.cc:81
std::size_t GetN(void) const
Definition: config.cc:69
This aggregator sends values it receives to a file.
void Write2d(std::string context, double v1, double v2)
Writes 2 values to the file.
FileType
The type of file written by the aggregator.
void Set2dFormat(const std::string &format)
Sets the 2D format string for the C-style sprintf() function.
Definition: file-helper.cc:379
void SetHeading(const std::string &heading)
Sets the heading string that will be printed on the first line of the file.
Definition: file-helper.cc:362
void Set5dFormat(const std::string &format)
Sets the 5D format string for the C-style sprintf() function.
Definition: file-helper.cc:403
void AddTimeSeriesAdaptor(const std::string &adaptorName)
Adds a time series adaptor to be used to write the file.
Definition: file-helper.cc:216
Ptr< FileAggregator > GetAggregatorSingle()
Gets the single aggregator that is always constructed.
Definition: file-helper.cc:306
std::string m_6dFormat
Format string for 6D format C-style sprintf() function.
Definition: file-helper.h:318
void Set3dFormat(const std::string &format)
Sets the 3D format string for the C-style sprintf() function.
Definition: file-helper.cc:387
Ptr< Probe > GetProbe(std::string probeName) const
Gets the specified probe.
Definition: file-helper.cc:287
std::map< std::string, Ptr< TimeSeriesAdaptor > > m_timeSeriesAdaptorMap
Maps time series adaptor names to time series adaptors.
Definition: file-helper.h:296
void WriteProbe(const std::string &typeId, const std::string &path, const std::string &probeTraceSource)
Definition: file-helper.cc:90
std::map< std::string, Ptr< FileAggregator > > m_aggregatorMap
Maps aggregator names to aggregators when multiple aggregators are needed.
Definition: file-helper.h:290
enum FileAggregator::FileType m_fileType
Determines the kind of file written by the aggregator.
Definition: file-helper.h:302
FileHelper()
Constructs a file helper that will create a space separated file named "file-helper....
Definition: file-helper.cc:35
void Set6dFormat(const std::string &format)
Sets the 6D format string for the C-style sprintf() function.
Definition: file-helper.cc:411
ObjectFactory m_factory
Used to create the probes and collectors as they are added.
Definition: file-helper.h:283
uint32_t m_fileProbeCount
Number of file probes that have been created.
Definition: file-helper.h:299
std::string m_heading
Heading line for the outputfile.
Definition: file-helper.h:311
std::string m_outputFileNameWithoutExtension
The name of the output file to created without its extension.
Definition: file-helper.h:305
std::string m_8dFormat
Format string for 8D format C-style sprintf() function.
Definition: file-helper.h:320
std::string m_9dFormat
Format string for 9D format C-style sprintf() function.
Definition: file-helper.h:321
std::map< std::string, std::pair< Ptr< Probe >, std::string > > m_probeMap
Maps probe names to probes.
Definition: file-helper.h:293
bool m_hasHeadingBeenSet
Indicates if the heading line for the file has been set.
Definition: file-helper.h:308
std::string m_2dFormat
Format string for 2D format C-style sprintf() function.
Definition: file-helper.h:314
void AddAggregator(const std::string &aggregatorName, const std::string &outputFileName, bool onlyOneAggregator)
Adds an aggregator to be used to write values to files.
Definition: file-helper.cc:237
void Set1dFormat(const std::string &format)
Sets the 1D format string for the C-style sprintf() function.
Definition: file-helper.cc:371
void AddProbe(const std::string &typeId, const std::string &probeName, const std::string &path)
Adds a probe to be used to write values to files.
Definition: file-helper.cc:180
std::string m_1dFormat
Format string for 1D format C-style sprintf() function.
Definition: file-helper.h:313
std::string m_10dFormat
Format string for 10D format C-style sprintf() function.
Definition: file-helper.h:322
std::string m_4dFormat
Format string for 4D format C-style sprintf() function.
Definition: file-helper.h:316
std::string m_7dFormat
Format string for 7D format C-style sprintf() function.
Definition: file-helper.h:319
void Set4dFormat(const std::string &format)
Sets the 4D format string for the C-style sprintf() function.
Definition: file-helper.cc:395
void Set7dFormat(const std::string &format)
Sets the 7D format string for the C-style sprintf() function.
Definition: file-helper.cc:419
Ptr< FileAggregator > m_aggregator
The single aggregator that is always created in the constructor.
Definition: file-helper.h:286
virtual ~FileHelper()
Definition: file-helper.cc:62
void ConfigureFile(const std::string &outputFileNameWithoutExtension, enum FileAggregator::FileType fileType=FileAggregator::SPACE_SEPARATED)
Definition: file-helper.cc:68
std::string m_5dFormat
Format string for 5D format C-style sprintf() function.
Definition: file-helper.h:317
std::string m_3dFormat
Format string for 3D format C-style sprintf() function.
Definition: file-helper.h:315
void Set8dFormat(const std::string &format)
Sets the 8D format string for the C-style sprintf() function.
Definition: file-helper.cc:427
Ptr< FileAggregator > GetAggregatorMultiple(const std::string &aggregatorName, const std::string &outputFileName)
Gets one of the multiple aggregators from the map.
Definition: file-helper.cc:340
void Set10dFormat(const std::string &format)
Sets the 10D format string for the C-style sprintf() function.
Definition: file-helper.cc:443
void ConnectProbeToAggregator(const std::string &typeId, const std::string &matchIdentifier, const std::string &path, const std::string &probeTraceSource, const std::string &outputFileNameWithoutExtension, bool onlyOneAggregator)
Connects the probe to the aggregator.
Definition: file-helper.cc:451
void Set9dFormat(const std::string &format)
Sets the 9D format string for the C-style sprintf() function.
Definition: file-helper.cc:435
Ptr< Object > Create(void) const
Create an Object instance of the configured TypeId.
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
Base class for probes.
Definition: probe.h:40
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
void TraceSinkUinteger8(uint8_t oldData, uint8_t newData)
Trace sink for receiving data from uint8_t valued trace sources.
void TraceSinkDouble(double oldData, double newData)
Trace sink for receiving data from double valued trace sources.
void TraceSinkBoolean(bool oldData, bool newData)
Trace sink for receiving data from bool valued trace sources.
void TraceSinkUinteger32(uint32_t oldData, uint32_t newData)
Trace sink for receiving data from uint32_t valued trace sources.
void TraceSinkUinteger16(uint16_t oldData, uint16_t newData)
Trace sink for receiving data from uint16_t valued trace sources.
MatchContainer LookupMatches(std::string path)
Definition: config.cc:940
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
Definition: abort.h:50
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:265
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::string GetWildcardMatches(const std::string &configPath, const std::string &matchedPath, const std::string &wildcardSeparator)
Returns the text matches from the matched path for each of the wildcards in the Config path,...
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648
Definition: second.py:1