Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F10550584
System.hpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Size
4 KB
Referenced Files
None
Subscribers
None
System.hpp
View Options
/*******************************************************************************
*
* File: System.hpp
*
* Contents: Declaration of System interface.
*
* Copyright 2017
*
* Author: David Juhasz (david.juhasz@tuwien.ac.at)
*
******************************************************************************/
#ifndef ROSA_CORE_SYSTEM_HPP
#define ROSA_CORE_SYSTEM_HPP
#include
"rosa/config/config.h"
#include
"rosa/core/forward_declarations.h"
#include
"rosa/support/debug.hpp"
#include
"rosa/support/log.h"
#include
<memory>
#include
<string>
namespace
rosa
{
// Base interface for actual agent-systems, the class provides facilities to
// keep track of Units of the system.
// NOTE: Any subclasses are supposed to provide thread-safe implementation.
// NOTE: The class declares only an interface to avoid trouble with multiple
// inheritance in various subclasses as in derived interfaces and derived
// implementations.
// NOTE: Actual implementations are supposed to derive from SystemBase
// implenenting a base feature-set.
class
System
{
public
:
// Signature of creator functions for Units.
template
<
typename
T
,
typename
S
>
using
UnitCreator
=
std
::
function
<
T
*
(
const
id_t
,
S
&
)
noexcept
>
;
// Returns an object implementing the interface defined by the class.
static
std
::
unique_ptr
<
System
>
createSystem
(
const
std
::
string
&
Name
)
noexcept
;
protected
:
// Protected ctor, only subclasses can instantiate.
System
(
void
)
noexcept
=
default
;
// No copy and move.
System
(
const
System
&
)
=
delete
;
System
(
System
&&
)
=
delete
;
System
&
operator
=
(
const
System
&
)
=
delete
;
System
&
operator
=
(
System
&&
)
=
delete
;
public
:
// Dtor.
// NOTE: Any implementation makes sure that only a cleaned System can be
// destroyed.
virtual
~
System
(
void
)
=
default
;
protected
:
// Tells the next Id to be used for a newly created Unit.
// NOTE: Never returs nthe same value twice.
virtual
id_t
nextId
(
void
)
noexcept
=
0
;
// Tells if the System has been marked clean and ready for destruction.
virtual
bool
isSystemCleaned
(
void
)
const
noexcept
=
0
;
// Marks the System cleaned. Can be called only once when the System does not
// have any live Units.
// PRE: !isSystemCleaned() && empty()
// POST: isSystemCleaned()
virtual
void
markCleaned
(
void
)
noexcept
=
0
;
// Registers the given Unit instance to the System.
// PRE: !isUnitRegistered(U)
// POST: isUnitRegistered(U)
virtual
void
registerUnit
(
Unit
&
U
)
noexcept
=
0
;
// Unregisters and destroys the given Unit.
// PRE: isUnitRegistered(U)
// POST: !isUnitRegistered(U) && 'U is destroyed'
virtual
void
destroyUnit
(
Unit
&
U
)
noexcept
=
0
;
// Returns if the given Unit is registered in the System.
virtual
bool
isUnitRegistered
(
const
Unit
&
U
)
const
noexcept
=
0
;
// Creates a Unit instance with the given UnitCreator and registers the new
// Unit instance
// NOTE: The type argument S must be the actual subclass whose instance
// creates the Unit. That cannot be statically enforced, it is the
// reponsibility of the caller to provide the proper System subclass.
// STATIC PRE:
// std::is_base_of<Unit, T>::value && std::is_base_of<System, S>::value
// PRE: !isSystemCleaned()
template
<
typename
T
,
typename
S
>
T
&
createUnit
(
UnitCreator
<
T
,
S
>
C
)
noexcept
;
public
:
// Tells the textual name of the System.
// NOTE: The returned reference remains valid as long as the originating
// System is not destroyed.
virtual
const
std
::
string
&
name
(
void
)
const
noexcept
=
0
;
// Returns the number of Units constructed in the System so far,
// including those being already destroyed.
virtual
size_t
numberOfConstructedUnits
(
void
)
const
noexcept
=
0
;
// Returns the number of live Units, that have been constructed and not
// destroyed yet.
virtual
size_t
numberOfLiveUnits
(
void
)
const
noexcept
=
0
;
// Returns if the System has no live Units.
virtual
bool
empty
(
void
)
const
noexcept
=
0
;
};
template
<
typename
T
,
typename
S
>
T
&
System
::
createUnit
(
UnitCreator
<
T
,
S
>
C
)
noexcept
{
STATIC_ASSERT
((
std
::
is_base_of
<
Unit
,
T
>::
value
),
"not a Unit"
);
STATIC_ASSERT
((
std
::
is_base_of
<
System
,
S
>::
value
),
"not a System"
);
if
(
isSystemCleaned
())
{
ROSA_CRITICAL
(
"Trying to create a Unit in a cleaned System ("
+
name
()
+
")"
);
}
const
id_t
Id
=
nextId
();
T
*
U
=
C
(
Id
,
static_cast
<
S
&>
(
*
this
));
registerUnit
(
*
U
);
LOG_TRACE
(
"Unit created and registered ("
+
U
->
FullName
+
")"
);
return
*
U
;
}
}
// End namespace rosa
#endif
// ROSA_CORE_SYSTEM_HPP
File Metadata
Details
Attached
Mime Type
text/x-c++
Expires
Sun, May 31, 12:05 AM (1 d, 3 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
328982
Default Alt Text
System.hpp (4 KB)
Attached To
Mode
R20 SoC_Rosa_repo
Attached
Detach File
Event Timeline
Log In to Comment