SystemContainer.inl
Go to the documentation of this file.
1 namespace iv
2 {
3 
4 template< class TypedSystem >
5 TypedSystem * SystemContainer::getSystem() const
6 {
7  // system must inherit System
8  static_assert
9  (
10  std::is_base_of< System, TypedSystem >::value,
11  "TypedSystem must be a descendant of ivorium::System."
12  );
13 
14  // check if system exists
15  if( !this->systems.count( typeid( TypedSystem ) ) )
16  {
17  if( this->systems.count( typeid( InstanceSystem ) ) )
18  {
19  auto is = this->systems.at( typeid( InstanceSystem ) );
20  is->warning( SRC_INFO, "Requested system ", typeid( TypedSystem ).name(), " does not exist." );
21  }
22  return nullptr;
23  }
24 
25  // return system
26  return dynamic_cast< TypedSystem * >( this->systems.at( typeid(TypedSystem) ) );
27 }
28 
29 template< class TypedSystem, typename... Args >
30 TypedSystem * SystemContainer::createOwnSystem( Args... constructor_arguments )
31 {
32  // system must inherit System
33  static_assert
34  (
35  std::is_base_of<System, TypedSystem>::value,
36  "TypedSystem must be a descendant of ivorium::System."
37  );
38 
39  // not-own system exists -> remove it
40  if( this->systems.count( typeid( TypedSystem ) ) && !this->own_systems.count( this->systems[ typeid( TypedSystem ) ] ) )
41  {
42  this->removeSystem< TypedSystem >();
43  }
44 
45  // own system does not exist -> create it
46  if( !this->systems.count( typeid( TypedSystem ) ) )
47  {
48  // create the system
49  TypedSystem * system = new TypedSystem( this, constructor_arguments... );
50 
51  // increase refcounter
52  system->retain();
53 
54  // save system
55  this->systems[ typeid( TypedSystem ) ] = system;
56 
57  // mark it as own
58  this->own_systems.insert( system );
59  }
60 
61  // return system
62  return this->getSystem< TypedSystem >();
63 }
64 
65 template< class TypedSystem >
66 TypedSystem * SystemContainer::addForeignSystem( TypedSystem * system )
67 {
68  // system must inherit System
69  static_assert
70  (
71  std::is_base_of<System, TypedSystem>::value,
72  "TypedSystem must be a descendant of ivorium::System."
73  );
74 
75  // check if exists
76  if( this->systems.count( typeid( TypedSystem ) ) )
77  return this->getSystem< TypedSystem >();
78 
79  // increase refcounter
80  system->retain();
81 
82  // save system
83  this->systems[ typeid( TypedSystem ) ] = system;
84 
85  // return system
86  return system;
87 }
88 
89 template< class TypedSystem >
91 {
92  // system must inherit System
93  static_assert
94  (
95  std::is_base_of<System, TypedSystem>::value,
96  "TypedSystem must be a descendant of ivorium::System."
97  );
98 
99  // check if system exists
100  if( !this->systems.count( typeid( TypedSystem ) ) )
101  {
102  runtime_warning( SRC_INFO, "SystemContainer does not contain this type of system." );
103  return;
104  }
105 
106  // get system
107  System * system = this->systems[ typeid( TypedSystem ) ];
108 
109  // remove from container
110  this->systems.erase( typeid( TypedSystem ) );
111  this->own_systems.erase( system );
112 
113  // decrease refcounter
114  system->release();
115 }
116 
117 }