INET Framework for OMNeT++/OMNEST
inet::physicallayer::VectorCommunicationCache Class Reference

#include <VectorCommunicationCache.h>

Inheritance diagram for inet::physicallayer::VectorCommunicationCache:
inet::physicallayer::CommunicationCacheBase inet::physicallayer::ICommunicationCache inet::IPrintableObject

Classes

class  VectorTransmissionCacheEntry
 

Public Member Functions

Radio cache
virtual void addRadio (const IRadio *radio) override
 
virtual void removeRadio (const IRadio *radio) override
 
virtual const IRadiogetRadio (int id) const override
 
virtual void mapRadios (std::function< void(const IRadio *)> f) const override
 
Transmission cache
virtual void addTransmission (const ITransmission *transmission) override
 
virtual void removeTransmission (const ITransmission *transmission) override
 
virtual const ITransmissiongetTransmission (int id) const override
 
virtual void mapTransmissions (std::function< void(const ITransmission *)> f) const override
 
Interference cache
virtual void removeNonInterferingTransmissions (std::function< void(const ITransmission *transmission)> f) override
 
- Public Member Functions inherited from inet::physicallayer::CommunicationCacheBase
virtual int getNumRadios () const override
 
virtual int getNumTransmissions () const override
 
virtual std::vector< const ITransmission * > * computeInterferingTransmissions (const IRadio *radio, const simtime_t startTime, const simtime_t endTime) override
 
virtual const simtime_t getCachedInterferenceEndTime (const ITransmission *transmission) override
 
virtual void setCachedInterferenceEndTime (const ITransmission *transmission, const simtime_t interferenceEndTime) override
 
virtual void removeCachedInterferenceEndTime (const ITransmission *transmission) override
 
virtual const IWirelessSignalgetCachedSignal (const ITransmission *transmission) override
 
virtual void setCachedSignal (const ITransmission *transmission, const IWirelessSignal *signal) override
 
virtual void removeCachedSignal (const ITransmission *transmission) override
 
virtual const IArrivalgetCachedArrival (const IRadio *receiver, const ITransmission *transmission) override
 
virtual void setCachedArrival (const IRadio *receiver, const ITransmission *transmission, const IArrival *arrival) override
 
virtual void removeCachedArrival (const IRadio *receiver, const ITransmission *transmission) override
 
virtual const IntervalTree::IntervalgetCachedInterval (const IRadio *receiver, const ITransmission *transmission) override
 
virtual void setCachedInterval (const IRadio *receiver, const ITransmission *transmission, const IntervalTree::Interval *interval) override
 
virtual void removeCachedInterval (const IRadio *receiver, const ITransmission *transmission) override
 
virtual const IListeninggetCachedListening (const IRadio *receiver, const ITransmission *transmission) override
 
virtual void setCachedListening (const IRadio *receiver, const ITransmission *transmission, const IListening *listening) override
 
virtual void removeCachedListening (const IRadio *receiver, const ITransmission *transmission) override
 
virtual const IReceptiongetCachedReception (const IRadio *receiver, const ITransmission *transmission) override
 
virtual void setCachedReception (const IRadio *receiver, const ITransmission *transmission, const IReception *reception) override
 
virtual void removeCachedReception (const IRadio *receiver, const ITransmission *transmission) override
 
virtual const IInterferencegetCachedInterference (const IRadio *receiver, const ITransmission *transmission) override
 
virtual void setCachedInterference (const IRadio *receiver, const ITransmission *transmission, const IInterference *interference) override
 
virtual void removeCachedInterference (const IRadio *receiver, const ITransmission *transmission) override
 
virtual const INoisegetCachedNoise (const IRadio *receiver, const ITransmission *transmission) override
 
virtual void setCachedNoise (const IRadio *receiver, const ITransmission *transmission, const INoise *noise) override
 
virtual void removeCachedNoise (const IRadio *receiver, const ITransmission *transmission) override
 
virtual const ISnirgetCachedSNIR (const IRadio *receiver, const ITransmission *transmission) override
 
virtual void setCachedSNIR (const IRadio *receiver, const ITransmission *transmission, const ISnir *snir) override
 
virtual void removeCachedSNIR (const IRadio *receiver, const ITransmission *transmission) override
 
virtual const IReceptionDecisiongetCachedReceptionDecision (const IRadio *receiver, const ITransmission *transmission, IRadioSignal::SignalPart part) override
 
virtual void setCachedReceptionDecision (const IRadio *receiver, const ITransmission *transmission, IRadioSignal::SignalPart part, const IReceptionDecision *receptionDecision) override
 
virtual void removeCachedReceptionDecision (const IRadio *receiver, const ITransmission *transmission, IRadioSignal::SignalPart part) override
 
virtual const IReceptionResultgetCachedReceptionResult (const IRadio *receiver, const ITransmission *transmission) override
 
virtual void setCachedReceptionResult (const IRadio *receiver, const ITransmission *transmission, const IReceptionResult *receptionResult) override
 
virtual void removeCachedReceptionResult (const IRadio *receiver, const ITransmission *transmission) override
 
virtual const IWirelessSignalgetCachedSignal (const IRadio *receiver, const ITransmission *transmission) override
 
virtual void setCachedSignal (const IRadio *receiver, const ITransmission *transmission, const IWirelessSignal *signal) override
 
virtual void removeCachedSignal (const IRadio *receiver, const ITransmission *transmission) override
 
- Public Member Functions inherited from inet::physicallayer::ICommunicationCache
virtual ~ICommunicationCache ()
 
- Public Member Functions inherited from inet::IPrintableObject
virtual ~IPrintableObject ()
 
virtual std::string printToString () const
 
virtual std::string printToString (int level, int evFlags=0) const
 
virtual std::string getInfoStringRepresentation (int evFlags=0) const
 
virtual std::string getDetailStringRepresentation (int evFlags=0) const
 
virtual std::string getDebugStringRepresentation (int evFlags=0) const
 
virtual std::string getTraceStringRepresentation (int evFlags=0) const
 
virtual std::string getCompleteStringRepresentation (int evFlags=0) const
 

Protected Attributes

Cache
int baseRadioId = -1
 The smallest radio id of all radios on the medium. More...
 
int baseTransmissionId = -1
 The smallest transmission id of all ongoing transmissions on the medium. More...
 
std::vector< VectorTransmissionCacheEntrytransmissionCache
 Caches intermediate computation results for transmissions. More...
 
std::vector< RadioCacheEntryradioCache
 Caches intermediate computation results for radios. More...
 

Cache data structures

virtual RadioCacheEntrygetRadioCacheEntry (const IRadio *radio) override
 
virtual VectorTransmissionCacheEntrygetTransmissionCacheEntry (const ITransmission *transmission) override
 
virtual ReceptionCacheEntrygetReceptionCacheEntry (const IRadio *radio, const ITransmission *transmission) override
 
virtual ~VectorCommunicationCache ()
 
virtual std::ostream & printToStream (std::ostream &stream, int level, int evFlags=0) const override
 Prints this object to the provided output stream. More...
 

Additional Inherited Members

- Public Types inherited from inet::IPrintableObject
enum  PrintLevel {
  PRINT_LEVEL_TRACE, PRINT_LEVEL_DEBUG, PRINT_LEVEL_DETAIL, PRINT_LEVEL_INFO,
  PRINT_LEVEL_COMPLETE = INT_MIN
}
 
enum  PrintFlag { PRINT_FLAG_FORMATTED = (1 << 0), PRINT_FLAG_MULTILINE = (1 << 1) }
 
Cache data structures

Constructor & Destructor Documentation

◆ ~VectorCommunicationCache()

inet::physicallayer::VectorCommunicationCache::~VectorCommunicationCache ( )
virtual
18 {
19  for (auto& transmissionCacheEntry : transmissionCache)
20  delete transmissionCacheEntry.receptionCacheEntries;
21 }

Member Function Documentation

◆ addRadio()

void inet::physicallayer::VectorCommunicationCache::addRadio ( const IRadio radio)
overridevirtual

Implements inet::physicallayer::ICommunicationCache.

59 {
60  int radioId = radio->getId();
61  if (baseRadioId == -1)
62  baseRadioId = radioId;
63  int radioIndex = radio->getId() - baseRadioId;
64  if (radioIndex < 0) {
65  radioCache.insert(radioCache.begin(), -radioIndex, RadioCacheEntry());
66  for (auto& transmissionCacheEntry : transmissionCache) {
67  std::vector<ReceptionCacheEntry> *receptionCacheEntries = transmissionCacheEntry.receptionCacheEntries;
68  if (receptionCacheEntries != nullptr)
69  receptionCacheEntries->insert(receptionCacheEntries->begin(), -radioIndex, ReceptionCacheEntry());
70  }
71  baseRadioId = radioId;
72  }
73  else if (radioIndex >= (int)radioCache.size())
74  radioCache.resize(radioIndex + 1);
75  auto radioCacheEntry = getRadioCacheEntry(radio);
76  radioCacheEntry->radio = radio;
77 }

◆ addTransmission()

void inet::physicallayer::VectorCommunicationCache::addTransmission ( const ITransmission transmission)
overridevirtual

Implements inet::physicallayer::ICommunicationCache.

116 {
117  int transmissionId = transmission->getId();
118  if (baseTransmissionId == -1)
119  baseTransmissionId = transmissionId;
120  int transmissionIndex = transmission->getId() - baseTransmissionId;
121  if (transmissionIndex < 0) {
122  transmissionCache.insert(transmissionCache.begin(), -transmissionIndex, VectorTransmissionCacheEntry());
123  baseTransmissionId = transmissionId;
124  }
125  else if (transmissionIndex >= (int)transmissionCache.size())
126  transmissionCache.resize(transmissionIndex + 1);
127  auto transmissionCacheEntry = getTransmissionCacheEntry(transmission);
128  transmissionCacheEntry->transmission = transmission;
129  transmissionCacheEntry->receptionCacheEntries = new std::vector<ReceptionCacheEntry>(radioCache.size());
130 }

◆ getRadio()

const IRadio * inet::physicallayer::VectorCommunicationCache::getRadio ( int  id) const
overridevirtual

Implements inet::physicallayer::ICommunicationCache.

99 {
100  ASSERT(baseRadioId != -1);
101  int radioIndex = id - baseRadioId;
102  if (0 <= radioIndex && radioIndex < (int)radioCache.size())
103  return radioCache[radioIndex].radio;
104  else
105  return nullptr;
106 }

◆ getRadioCacheEntry()

VectorCommunicationCache::RadioCacheEntry * inet::physicallayer::VectorCommunicationCache::getRadioCacheEntry ( const IRadio radio)
overrideprotectedvirtual

Implements inet::physicallayer::CommunicationCacheBase.

24 {
25  ASSERT(baseRadioId != -1);
26  int radioIndex = radio->getId() - baseRadioId;
27  ASSERT(0 <= radioIndex && radioIndex < (int)radioCache.size());
28  return &radioCache[radioIndex];
29 }

Referenced by addRadio(), and removeRadio().

◆ getReceptionCacheEntry()

VectorCommunicationCache::ReceptionCacheEntry * inet::physicallayer::VectorCommunicationCache::getReceptionCacheEntry ( const IRadio radio,
const ITransmission transmission 
)
overrideprotectedvirtual

Implements inet::physicallayer::CommunicationCacheBase.

40 {
41  VectorTransmissionCacheEntry *transmissionCacheEntry = getTransmissionCacheEntry(transmission);
42  if (transmissionCacheEntry == nullptr)
43  return nullptr;
44  else {
45  ASSERT(baseRadioId != -1);
46  std::vector<ReceptionCacheEntry> *receptionCacheEntries = transmissionCacheEntry->receptionCacheEntries;
47  int radioIndex = radio->getId() - baseRadioId;
48  if (radioIndex < 0)
49  return nullptr;
50  else {
51  if (radioIndex >= (int)receptionCacheEntries->size())
52  receptionCacheEntries->resize(radioIndex + 1);
53  return &(*receptionCacheEntries)[radioIndex];
54  }
55  }
56 }

◆ getTransmission()

const ITransmission * inet::physicallayer::VectorCommunicationCache::getTransmission ( int  id) const
overridevirtual

Implements inet::physicallayer::ICommunicationCache.

143 {
144  ASSERT(baseTransmissionId != -1);
145  int transmissionIndex = id - baseTransmissionId;
146  if (0 <= transmissionIndex && transmissionIndex < (int)transmissionCache.size())
147  return transmissionCache[transmissionIndex].transmission;
148  else
149  return nullptr;
150 }

◆ getTransmissionCacheEntry()

VectorCommunicationCache::VectorTransmissionCacheEntry * inet::physicallayer::VectorCommunicationCache::getTransmissionCacheEntry ( const ITransmission transmission)
overrideprotectedvirtual

Implements inet::physicallayer::CommunicationCacheBase.

32 {
33  ASSERT(baseTransmissionId != -1);
34  int transmissionIndex = transmission->getId() - baseTransmissionId;
35  ASSERT(0 <= transmissionIndex && transmissionIndex < (int)transmissionCache.size());
36  return &transmissionCache[transmissionIndex];
37 }

Referenced by addTransmission(), and getReceptionCacheEntry().

◆ mapRadios()

void inet::physicallayer::VectorCommunicationCache::mapRadios ( std::function< void(const IRadio *)>  f) const
overridevirtual

Implements inet::physicallayer::ICommunicationCache.

109 {
110  for (auto& radioCacheEntry : radioCache)
111  if (radioCacheEntry.radio != nullptr)
112  f(radioCacheEntry.radio);
113 }

◆ mapTransmissions()

void inet::physicallayer::VectorCommunicationCache::mapTransmissions ( std::function< void(const ITransmission *)>  f) const
overridevirtual

Implements inet::physicallayer::ICommunicationCache.

153 {
154  for (auto& transmissionCacheEntry : transmissionCache)
155  if (transmissionCacheEntry.transmission != nullptr)
156  f(transmissionCacheEntry.transmission);
157 }

◆ printToStream()

virtual std::ostream& inet::physicallayer::VectorCommunicationCache::printToStream ( std::ostream &  stream,
int  level,
int  evFlags = 0 
) const
inlineoverridevirtual

Prints this object to the provided output stream.

Reimplemented from inet::IPrintableObject.

64 { return stream << "VectorCommunicationCache"; }

◆ removeNonInterferingTransmissions()

void inet::physicallayer::VectorCommunicationCache::removeNonInterferingTransmissions ( std::function< void(const ITransmission *transmission)>  f)
overridevirtual

Implements inet::physicallayer::ICommunicationCache.

160 {
161  const simtime_t now = simTime();
162  size_t transmissionIndex = 0;
163  for (auto it = transmissionCache.begin(); it != transmissionCache.end(); ++it) {
164  VectorTransmissionCacheEntry& transmissionCacheEntry = *it;
165  if (transmissionCacheEntry.interferenceEndTime <= now) {
166  transmissionIndex++;
167  if (transmissionCacheEntry.receptionCacheEntries != nullptr) {
168  std::vector<ReceptionCacheEntry> *receptionCacheEntries = transmissionCacheEntry.receptionCacheEntries;
169  auto radioIt = radioCache.cbegin();
170  auto receptionIt = receptionCacheEntries->cbegin();
171  while (radioIt != radioCache.cend() && receptionIt != receptionCacheEntries->cend()) {
172  const RadioCacheEntry& radioCacheEntry = *radioIt;
173  const ReceptionCacheEntry& receptionCacheEntry = *receptionIt;
174  const IntervalTree::Interval *interval = receptionCacheEntry.interval;
175  if (interval != nullptr)
176  radioCacheEntry.receptionIntervals->deleteNode(interval);
177  radioIt++;
178  receptionIt++;
179  }
180  delete receptionCacheEntries;
181  transmissionCacheEntry.receptionCacheEntries = nullptr;
182  }
183  if (transmissionCacheEntry.transmission != nullptr)
184  f(transmissionCacheEntry.transmission);
185  }
186  else
187  break;
188  }
189  ASSERT(baseTransmissionId != -1);
190  baseTransmissionId += transmissionIndex;
191  transmissionCache.erase(transmissionCache.begin(), transmissionCache.begin() + transmissionIndex);
192  EV_DEBUG << "Removed " << transmissionIndex << " non interfering transmissions\n";
193 }

◆ removeRadio()

void inet::physicallayer::VectorCommunicationCache::removeRadio ( const IRadio radio)
overridevirtual

Implements inet::physicallayer::ICommunicationCache.

80 {
81  auto radioCacheEntry = getRadioCacheEntry(radio);
82  radioCacheEntry->radio = nullptr;
83  int radioCount = 0;
84  while (radioCache[radioCount].radio == nullptr && radioCount < (int)radioCache.size())
85  radioCount++;
86  if (radioCount != 0) {
87  ASSERT(baseRadioId != -1);
88  baseRadioId += radioCount;
89  radioCache.erase(radioCache.begin(), radioCache.begin() + radioCount);
90  for (auto& transmissionCacheEntry : transmissionCache) {
91  std::vector<ReceptionCacheEntry> *receptionCacheEntries = transmissionCacheEntry.receptionCacheEntries;
92  if (receptionCacheEntries != nullptr)
93  receptionCacheEntries->erase(receptionCacheEntries->begin(), receptionCacheEntries->begin() + radioCount);
94  }
95  }
96 }

◆ removeTransmission()

void inet::physicallayer::VectorCommunicationCache::removeTransmission ( const ITransmission transmission)
overridevirtual

Implements inet::physicallayer::ICommunicationCache.

133 {
134  ASSERT(baseTransmissionId != -1);
135  int transmissionIndex = transmission->getId() - baseTransmissionId;
136  if (0 <= transmissionIndex && transmissionIndex < (int)transmissionCache.size())
137  transmissionCache[transmissionIndex] = VectorTransmissionCacheEntry();
138  else
139  throw cRuntimeError("Cannot find transmission");
140 }

Member Data Documentation

◆ baseRadioId

int inet::physicallayer::VectorCommunicationCache::baseRadioId = -1
protected

The smallest radio id of all radios on the medium.

Referenced by addRadio(), getRadio(), getRadioCacheEntry(), getReceptionCacheEntry(), and removeRadio().

◆ baseTransmissionId

int inet::physicallayer::VectorCommunicationCache::baseTransmissionId = -1
protected

The smallest transmission id of all ongoing transmissions on the medium.

Referenced by addTransmission(), getTransmission(), getTransmissionCacheEntry(), removeNonInterferingTransmissions(), and removeTransmission().

◆ radioCache

std::vector<RadioCacheEntry> inet::physicallayer::VectorCommunicationCache::radioCache
protected

Caches intermediate computation results for radios.

The vector is indexed by radio id (offset with base transmission id).

Referenced by addRadio(), addTransmission(), getRadio(), getRadioCacheEntry(), mapRadios(), removeNonInterferingTransmissions(), and removeRadio().

◆ transmissionCache

std::vector<VectorTransmissionCacheEntry> inet::physicallayer::VectorCommunicationCache::transmissionCache
protected

Caches intermediate computation results for transmissions.

The outer vector is indexed by transmission id (offset with base transmission id) and the inner vector is indexed by radio id. Values that are no longer needed are removed from the beginning only. May contain nullptr values for not yet computed information.

Referenced by addRadio(), addTransmission(), getTransmission(), getTransmissionCacheEntry(), mapTransmissions(), removeNonInterferingTransmissions(), removeRadio(), removeTransmission(), and ~VectorCommunicationCache().


The documentation for this class was generated from the following files:
inet::physicallayer::VectorCommunicationCache::radioCache
std::vector< RadioCacheEntry > radioCache
Caches intermediate computation results for radios.
Definition: VectorCommunicationCache.h:50
inet::physicallayer::VectorCommunicationCache::transmissionCache
std::vector< VectorTransmissionCacheEntry > transmissionCache
Caches intermediate computation results for transmissions.
Definition: VectorCommunicationCache.h:45
inet::physicallayer::VectorCommunicationCache::baseRadioId
int baseRadioId
The smallest radio id of all radios on the medium.
Definition: VectorCommunicationCache.h:33
inet::physicallayer::VectorCommunicationCache::getRadioCacheEntry
virtual RadioCacheEntry * getRadioCacheEntry(const IRadio *radio) override
Definition: VectorCommunicationCache.cc:23
inet::physicallayer::VectorCommunicationCache::getTransmissionCacheEntry
virtual VectorTransmissionCacheEntry * getTransmissionCacheEntry(const ITransmission *transmission) override
Definition: VectorCommunicationCache.cc:31
inet::physicallayer::VectorCommunicationCache::baseTransmissionId
int baseTransmissionId
The smallest transmission id of all ongoing transmissions on the medium.
Definition: VectorCommunicationCache.h:37