Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F27033456
Agent.hpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Authored By
Unknown
Size
4 KB
Referenced Files
None
Subscribers
None
Agent.hpp
View Options
//===-- rosa/core/Agent.hpp -------------------------------------*- C++ -*-===//
//
// The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
/// \file rosa/core/Agent.hpp
///
/// \author David Juhasz (david.juhasz@tuwien.ac.at)
///
/// \date 2017
///
/// \brief Declaration of the base \c rosa::Agent class.
///
//===----------------------------------------------------------------------===//
#ifndef ROSA_CORE_AGENT_HPP
#define ROSA_CORE_AGENT_HPP
#include
"rosa/core/AgentHandle.hpp"
#include
"rosa/core/MessageHandler.hpp"
#include
"rosa/core/MessagingSystem.hpp"
#include
"rosa/core/Unit.h"
#include
"rosa/support/log.h"
namespace
rosa
{
/// Implements an *Agent* that is a special \c rosa::Unit owned by a
/// \c rosa::MessagingSystem, capable of handling \c rosa::Message instances
/// as \c rosa::MessageHandler, and provides the \c rosa::AbstractAgent
/// interface with \c rosa::AgentHandle as reference type.
class
Agent
:
public
Unit
,
public
MessageHandler
,
public
AbstractAgent
<
AgentHandle
>
{
friend
class
AgentHandle
;
///< \c rosa::AgentHandle is our friend.
protected
:
/// A handle for \p this object.
const
AgentHandle
Self
;
public
:
/// Creates a new instance by instantiating all the base-classes.
///
/// \tparam Fun type of the first mandatory function for handling messages
/// \tparam Funs types of any further functions for handling messages
///
/// \param Kind kind of the new \c rosa::Unit instance
/// \param Id unique identifier of the new \c rosa::Unit instance
/// \param Name name of the new \c rosa::Unit instance
/// \param S \c rosa::MessagingSystem owning the new instance
/// \param F the first mandatory function for handling messages
/// \param Fs optional further functions for handling messages
template
<
typename
Fun
,
typename
...
Funs
>
Agent
(
const
AtomValue
Kind
,
const
id_t
Id
,
const
std
::
string
&
Name
,
MessagingSystem
&
S
,
Fun
&&
F
,
Funs
&&
...
Fs
);
/// Destroys \p this object.
~
Agent
(
void
);
/// Tells if \p this object is in a valid state.
///
/// \note A \c rosa::Agent instance is always valid.
///
/// \return if \p this object is in a valid state
operator
bool
(
void
)
const
noexcept
override
;
/// Tells if a given reference refers to \p this object.
///
/// \param H reference to another object
///
/// \return if \p H refers to \p this object
bool
operator
==
(
const
AgentHandle
&
H
)
const
noexcept
override
;
/// Comapres \p this object to a given reference.
///
/// The comparison is based on the memory addresses.
///
/// \param H reference to another object
///
/// \return if \p this object compares less to \p H
bool
operator
<
(
const
AgentHandle
&
H
)
const
noexcept
override
;
/// Returns a reference to \p this object.
///
/// \return a reference to \p this object
AgentHandle
self
(
void
)
noexcept
override
;
/// Sends a given \c rosa::message_t instance to \p this object.
///
/// \param M message to send
///
/// \note Since a \c rosa::Agent instance is always valid, there is no
/// precondition for this function.
/// \see \c rosa::AbstractAgent::sendMessage and
/// `rosa::Agent::operator bool() const`
void
sendMessage
(
message_t
&&
M
)
noexcept
override
;
/// Dumps \p this object into a \c std::string for tracing purposes.
///
/// \return \c std::string representing the state of \p this object
std
::
string
dump
(
void
)
const
noexcept
override
;
protected
:
/// Returns a reference to the \c rosa::MessagingSystem owning \p this object.
///
/// \return reference of \c rosa::Unit::S
MessagingSystem
&
system
(
void
)
const
noexcept
override
;
/// Gives the referenced \c rosa::Agent instance for a \c rosa::AgentHandle.
///
/// \note Intended for derived classes to be able to inspect
/// \c rosa::AgentHandle instances.
///
/// \param H \c rosa::AgentHandle to take the referenced \c rosa::Agent from
///
/// \return reference to the \c rosa::Agent instance from \p H
static
Agent
&
unwrapAgent
(
const
AgentHandle
&
H
)
noexcept
{
return
H
.
A
;
}
/// Gives the owning \c rosa::MessagingSystem of a \c rosa::Agent instance
/// for a \c rosa::AgentHandle.
///
/// \note Intended for for derived classes to be able to inspect
/// \c rosa::AgentHandle instances.
///
/// \param H \c rosa::AgentHandle to take the owning
/// \c rosa::MessagingSystem from
///
/// \return reference to the \c rosa::MessagingSystem owning the
/// \c rosa::Agent instance from \p H
static
MessagingSystem
&
unwrapSystem
(
const
AgentHandle
&
H
)
noexcept
{
return
H
.
S
;
}
};
template
<
typename
Fun
,
typename
...
Funs
>
Agent
::
Agent
(
const
AtomValue
Kind
,
const
id_t
Id
,
const
std
::
string
&
Name
,
MessagingSystem
&
S
,
Fun
&&
F
,
Funs
&&
...
Fs
)
:
Unit
(
Kind
,
Id
,
Name
,
S
),
MessageHandler
(
std
::
move
(
F
),
std
::
move
(
Fs
)...),
Self
(
*
this
,
/*valid*/
true
)
{
LOG_TRACE
(
"Agent is created."
);
}
}
// End namespace rosa
#endif
// ROSA_CORE_AGENT_HPP
File Metadata
Details
Attached
Mime Type
text/x-c++
Expires
Tue, Oct 27, 4:24 PM (1 d, 10 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
407384
Default Alt Text
Agent.hpp (4 KB)
Attached To
Mode
R20 SoC_Rosa_repo
Attached
Detach File
Event Timeline