Skip to content

Commit c19ee0e

Browse files
committed
common: Added DemuxRegexFilter that allows partitioning results based on the name of the details object.
For example, it could be used to partition packetLifeTime based on the packet name and thus ultimately the source application.
1 parent e5e863f commit c19ee0e

2 files changed

Lines changed: 104 additions & 0 deletions

File tree

src/inet/common/ResultFilters.cc

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,73 @@ void DemuxFlowFilter::receiveSignal(cResultFilter *prev, simtime_t_cref t, cObje
568568
});
569569
}
570570

571+
Register_ResultFilter("demuxRegex", DemuxRegexFilter);
572+
573+
void DemuxRegexFilter::init(Context *ctx)
574+
{
575+
DemuxFilter::init(ctx);
576+
std::string fullPath = ctx->component->getFullPath() + "." + ctx->attrsProperty->getIndex() + ".demuxRegex";
577+
auto config = getEnvir()->getConfig();
578+
search = cConfiguration::parseString(config->getPerObjectConfigValue(fullPath.c_str(), "search"), getDefaultSearch());
579+
replace = cConfiguration::parseString(config->getPerObjectConfigValue(fullPath.c_str(), "replace"), getDefaultReplace());
580+
}
581+
582+
const char *DemuxRegexFilter::CategoryFinder::getFullName() const
583+
{
584+
if (object == nullptr)
585+
return "";
586+
else {
587+
if (!std::regex_search(object->getFullName(), filter->search))
588+
return "";
589+
else {
590+
result = std::regex_replace(object->getFullName(), filter->search, filter->replace);
591+
return result.c_str();
592+
}
593+
}
594+
}
595+
596+
void DemuxRegexFilter::receiveSignal(cResultFilter *prev, simtime_t_cref t, bool b, cObject *details)
597+
{
598+
CategoryFinder c(this, details);
599+
DemuxFilter::receiveSignal(prev, t, b, &c);
600+
}
601+
602+
void DemuxRegexFilter::receiveSignal(cResultFilter *prev, simtime_t_cref t, intval_t l, cObject *details)
603+
{
604+
CategoryFinder c(this, details);
605+
DemuxFilter::receiveSignal(prev, t, l, &c);
606+
}
607+
608+
void DemuxRegexFilter::receiveSignal(cResultFilter *prev, simtime_t_cref t, uintval_t l, cObject *details)
609+
{
610+
CategoryFinder c(this, details);
611+
DemuxFilter::receiveSignal(prev, t, l, &c);
612+
}
613+
614+
void DemuxRegexFilter::receiveSignal(cResultFilter *prev, simtime_t_cref t, double d, cObject *details)
615+
{
616+
CategoryFinder c(this, details);
617+
DemuxFilter::receiveSignal(prev, t, d, &c);
618+
}
619+
620+
void DemuxRegexFilter::receiveSignal(cResultFilter *prev, simtime_t_cref t, const SimTime& v, cObject *details)
621+
{
622+
CategoryFinder c(this, details);
623+
DemuxFilter::receiveSignal(prev, t, v, &c);
624+
}
625+
626+
void DemuxRegexFilter::receiveSignal(cResultFilter *prev, simtime_t_cref t, const char *s, cObject *details)
627+
{
628+
CategoryFinder c(this, details);
629+
DemuxFilter::receiveSignal(prev, t, s, &c);
630+
}
631+
632+
void DemuxRegexFilter::receiveSignal(cResultFilter *prev, simtime_t_cref t, cObject *object, cObject *details)
633+
{
634+
CategoryFinder c(this, details != nullptr ? details : object);
635+
DemuxFilter::receiveSignal(prev, t, object, &c);
636+
}
637+
571638
Register_ResultFilter("residenceTimePerRegion", ResidenceTimePerRegionFilter);
572639

573640
void ResidenceTimePerRegionFilter::receiveSignal(cResultFilter *prev, simtime_t_cref t, cObject *object, cObject *details)

src/inet/common/ResultFilters.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
#include "inet/common/INETMath.h"
1212

13+
#include <regex>
14+
1315
namespace inet {
1416

1517
namespace utils {
@@ -306,6 +308,41 @@ class INET_API DemuxFlowFilter : public DemuxFilter
306308
virtual void receiveSignal(cResultFilter *prev, simtime_t_cref t, cObject *object, cObject *details) override;
307309
};
308310

311+
class INET_API DemuxRegexFilter : public DemuxFilter
312+
{
313+
protected:
314+
class CategoryFinder : public cNamedObject
315+
{
316+
protected:
317+
DemuxRegexFilter *filter = nullptr;
318+
cObject *object = nullptr;
319+
mutable std::string result;
320+
321+
public:
322+
CategoryFinder(DemuxRegexFilter *filter, cObject *object) : filter(filter), object(object) {}
323+
324+
virtual const char *getFullName() const override;
325+
};
326+
327+
protected:
328+
std::regex search;
329+
std::string replace;
330+
331+
protected:
332+
virtual void init(Context *ctx) override;
333+
virtual const char *getDefaultSearch() const { return ".*"; }
334+
virtual const char *getDefaultReplace() const { return "$0"; }
335+
336+
// NOTE: these are overridden because getFullName() called from getDelegateStartIndexByLabel() cannot be overridden
337+
virtual void receiveSignal(cResultFilter *prev, simtime_t_cref t, bool b, cObject *details) override;
338+
virtual void receiveSignal(cResultFilter *prev, simtime_t_cref t, intval_t, cObject *details) override;
339+
virtual void receiveSignal(cResultFilter *prev, simtime_t_cref t, uintval_t, cObject *details) override;
340+
virtual void receiveSignal(cResultFilter *prev, simtime_t_cref t, double d, cObject *details) override;
341+
virtual void receiveSignal(cResultFilter *prev, simtime_t_cref t, const SimTime& v, cObject *details) override;
342+
virtual void receiveSignal(cResultFilter *prev, simtime_t_cref t, const char *s, cObject *details) override;
343+
virtual void receiveSignal(cResultFilter *prev, simtime_t_cref t, cObject *object, cObject *details) override;
344+
};
345+
309346
class INET_API ResidenceTimePerRegionFilter : public cObjectResultFilter
310347
{
311348
public:

0 commit comments

Comments
 (0)