SystemContainer.cpp
Go to the documentation of this file.
1 #include "SystemContainer.hpp"
2 
3 #include "../Basics/TextOutput.hpp"
4 #include "../Basics/utils.hpp"
5 
6 #include "InstanceSystem.hpp"
7 #include "../Defs.hpp"
8 #include "../Basics/StringIO_defs.hpp"
9 
10 namespace iv
11 {
12 
13 //--------------------- System -----------------------------------------------------
15  sc( sc ),
16  _refcounters( 0 )
17 {
18 }
19 
21 {
22  return this->sc;
23 }
24 
26 {
27  this->_refcounters++;
28 }
29 
31 {
32  this->_refcounters--;
33  if( this->_refcounters == 0 )
34  delete this;
35 }
36 
38 {
39  auto is = this->sc->getSystem< InstanceSystem >();
40  if( !is )
41  return false;
42 
43  return is->SystemLogEnabled( this, id );
44 }
45 
46 void System::log_process( SrcInfo const & info, LogId id, std::string const & message ) const
47 {
48  auto is = this->sc->getSystem< InstanceSystem >();
49  if( !is )
50  return;
51 
52  is->SystemLog( this, info, id, message );
53 }
54 
55 //--------------------- SystemContainer -----------------------------------------------------
57  systems(),
58  own_systems(),
59  _frame_id( 0 )
60 {
61 }
62 
64  systems(),
65  own_systems(),
66  _frame_id( 0 )
67 {
68  // copy pointers to systems
69  this->systems = sc->systems;
70 
71  for( auto & [ type, system ] : this->systems )
72  system->retain();
73 }
74 
76 {
77  // delete all systems
78  for( auto & [ type, system ] : this->systems )
79  system->release();
80 }
81 
83 {
84  //if( this->systems.count( typeid( InstanceSystem ) ) )
85  //{
86  // auto is = this->systems.at( typeid( InstanceSystem ) );
87  // is->log( SRC_INFO, ::ivorium::Defs::Log::NewFrame, "==========================================================================" );
88  //}
89 
90  this->_frame_id++;
91 
92  if( this->systems.count( typeid( InstanceSystem ) ) )
93  {
94  auto is = this->systems.at( typeid( InstanceSystem ) );
95  is->log( SRC_INFO, ::iv::Defs::Log::NewFrame, "============================ <frame ", this->_frame_id, "> =================================" );
96  }
97 }
98 
99 unsigned SystemContainer::frame_id() const
100 {
101  return this->_frame_id;
102 }
103 
104 System * SystemContainer::getSystem( std::type_index type ) const
105 {
106  // check if system exists
107  if( !this->systems.count( type ) )
108  return nullptr;
109 
110  // return system
111  return this->systems.at( type );
112 }
113 
114 std::unordered_map< std::type_index /*type*/, System * > const & SystemContainer::debug_GetSystems() const
115 {
116  return this->systems;
117 }
118 
120 {
121  bool changed = true;
122  while( changed )
123  {
124  changed = false;
125 
126  // flush own systems
127  for( System * system : this->own_systems )
128  changed = changed || system->flushSystem();
129  }
130 
131  return changed;
132 }
133 
135 {
136  view->out() << "============================== SystemContainer ==============================" << std::endl;
137 
138  for( auto & [ type, system ] : this->systems )
139  {
140  view->out() << system->debug_name() << ":" << std::endl;
141  view->prefix_push( " " );
142  system->status( view );
143  view->out() << std::endl;
144  view->prefix_pop();
145  }
146 
147  view->out() << "#############################################################################" << std::endl;
148 }
149 
150 }