//===-- core/Agent.cpp ------------------------------------------*- C++ -*-===//
//
//                                 The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
/// \file core/Agent.cpp
///
/// \author David Juhasz (david.juhasz@tuwien.ac.at)
///
/// \date 2017
///
/// \brief Implementation of rosa/core/Agent.hpp.
///
//===----------------------------------------------------------------------===//

#include "rosa/core/Agent.hpp"

namespace rosa {

Agent::~Agent(void) { LOG_TRACE("Destroying Agent..."); }

Agent::operator bool(void) const noexcept {
  // An Agent itself is always valid.
  return true;
}

bool Agent::operator==(const AgentHandle &H) const noexcept {
  // Return if the \c rosa::Agent wrapped by \p H is this very object.
  return this == &H.A;
}

bool Agent::operator<(const AgentHandle &H) const noexcept {
  // Compare memory addresses.
  return this < &H.A;
}

AgentHandle Agent::self(void) noexcept { return Self; }

void Agent::sendMessage(message_t &&M) noexcept {
  system().send(Self, std::move(M));
}

std::string Agent::dump(void) const noexcept {
  LOG_TRACE("Dumping Agent '" + FullName + "'");
  return "[Agent] " + FullName;
}

MessagingSystem &Agent::system(void) const noexcept {
  // \note The \c rosa::System the \c rosa::Unit is created with is a
  // \c rosa::MessagingSystem.
  return static_cast<MessagingSystem &>(Unit::system());
}

} // End namespace rosa
