INET Framework for OMNeT++/OMNEST
inet::InitStageRegistry Class Reference

#include <InitStageRegistry.h>

Public Member Functions

void addInitStage (InitStage &initStage)
 
void addInitStageDependency (const char *source, const char *target)
 
int getNumInitStages ()
 
void ensureInitStageNumbersAssigned ()
 

Protected Member Functions

InitStagegetInitStage (const char *name)
 
void assignInitStageNumbers ()
 

Protected Attributes

int numInitStages = -1
 
std::vector< InitStage * > stages
 
std::vector< std::pair< const char *, const char * > > dependencies
 

Member Function Documentation

◆ addInitStage()

void inet::InitStageRegistry::addInitStage ( InitStage initStage)
25 {
26  stages.push_back(&initStage);
27  numInitStages = -1;
28 }

◆ addInitStageDependency()

void inet::InitStageRegistry::addInitStageDependency ( const char *  source,
const char *  target 
)
31 {
32  dependencies.push_back({source, target});
33  numInitStages = -1;
34 }

◆ assignInitStageNumbers()

void inet::InitStageRegistry::assignInitStageNumbers ( )
protected
43 {
44  EV_DEBUG << "Assigning initialization stage numbers" << EV_ENDL;
45  for (auto stage : stages) {
46  stage->number = -1;
47  stage->followingStages.clear();
48  stage->precedingStages.clear();
49  }
50  for (auto &dependency : dependencies) {
51  auto following = getInitStage(dependency.first);
52  auto preceding = getInitStage(dependency.second);
53  preceding->followingStages.push_back(following);
54  following->precedingStages.push_back(preceding);
55  }
56  numInitStages = 0;
57  while (numInitStages < stages.size()) {
58  bool assigned = false;
59  for (auto stage : stages) {
60  if (stage->number == -1) {
61  for (auto precedingStage : stage->precedingStages)
62  if (precedingStage->number == -1)
63  goto next;
64  stage->number = numInitStages++;
65  assigned = true;
66  }
67  next:;
68  }
69  if (!assigned)
70  throw cRuntimeError("Circle detected in initialization stage dependency graph");
71  }
72  std::sort(stages.begin(), stages.end(), [] (const InitStage *s1, const InitStage *s2) -> bool {
73  return s1->number < s2->number;
74  });
75  EV_STATICCONTEXT;
76  for (auto stage : stages)
77  EV_DEBUG << "Initialization stage: " << stage->name << " = " << stage->number << std::endl;
78  EV_DEBUG << "Total number of initialization stages: " << numInitStages << std::endl;
79 }

◆ ensureInitStageNumbersAssigned()

void inet::InitStageRegistry::ensureInitStageNumbersAssigned ( )
inline
39  {
40  if (numInitStages == -1)
42  }

Referenced by getNumInitStages(), and inet::InitStage::operator int().

◆ getInitStage()

inet::InitStage * inet::InitStageRegistry::getInitStage ( const char *  name)
protected
17 {
18  for (auto stage : stages)
19  if (!strcmp(stage->name, name))
20  return stage;
21  throw cRuntimeError("Cannot find initialization stage: %s", name);
22 }

Referenced by assignInitStageNumbers().

◆ getNumInitStages()

int inet::InitStageRegistry::getNumInitStages ( )
37 {
39  return numInitStages;
40 }

Member Data Documentation

◆ dependencies

std::vector<std::pair<const char *, const char *> > inet::InitStageRegistry::dependencies
protected

◆ numInitStages

int inet::InitStageRegistry::numInitStages = -1
protected

◆ stages

std::vector<InitStage *> inet::InitStageRegistry::stages
protected

The documentation for this class was generated from the following files:
inet::sort
void sort(std::vector< T > &v)
Definition: stlutils.h:129
inet::InitStageRegistry::stages
std::vector< InitStage * > stages
Definition: InitStageRegistry.h:24
inet::InitStageRegistry::assignInitStageNumbers
void assignInitStageNumbers()
Definition: InitStageRegistry.cc:42
inet::InitStageRegistry::numInitStages
int numInitStages
Definition: InitStageRegistry.h:23
inet::InitStageRegistry::dependencies
std::vector< std::pair< const char *, const char * > > dependencies
Definition: InitStageRegistry.h:25
inet::InitStageRegistry::ensureInitStageNumbersAssigned
void ensureInitStageNumbersAssigned()
Definition: InitStageRegistry.h:39
EV_ENDL
#define EV_ENDL
Definition: INETDefs.h:114
inet::InitStageRegistry::getInitStage
InitStage * getInitStage(const char *name)
Definition: InitStageRegistry.cc:16