//===-- core/AgentHandle.cpp ------------------------------------*- C++ -*-===//
//
//                                 The RoSA Framework
//
// Distributed under the terms and conditions of the Boost Software License 1.0.
// See accompanying file LICENSE.
//
// If you did not receive a copy of the license file, see
// http://www.boost.org/LICENSE_1_0.txt.
//
//===----------------------------------------------------------------------===//
///
/// \file core/AgentHandle.cpp
///
/// \author David Juhasz (david.juhasz@tuwien.ac.at)
///
/// \date 2017
///
/// \brief Implementation of rosa/core/AgentHandle.hpp.
///
//===----------------------------------------------------------------------===//

#include "rosa/core/AgentHandle.hpp"

#include "rosa/core/Agent.hpp"

namespace rosa {

AgentHandle::AgentHandle(Agent &A, bool) noexcept : A(A), S(A.system()) {}

AgentHandle::AgentHandle(Agent &A) : A(A), S(A.system()) {
  ASSERT(S.isUnitRegistered(A));
}

AgentHandle::operator bool(void) const noexcept {
  // \note The referred \c rosa::MessageSystem is supposed to be still alive.
  return S.isUnitRegistered(A);
}

bool AgentHandle::operator==(const AgentHandle &H) const noexcept {
  // Return if the referred \c rosa::Agent is the same object in both
  // \c rosa::AgentHandler instances.
  return &A == &H.A;
}

bool AgentHandle::operator<(const AgentHandle &H) const noexcept {
  // Compare memory addresses of the referred \c rosa::Agent instances.
  return &A < &H.A;
}

AgentHandle AgentHandle::self(void) noexcept {
  // Return a copy of \p this object.
  return *this;
}

void AgentHandle::sendMessage(message_t &&M) noexcept {
  ASSERT(bool(*this));
  S.send(*this, std::move(M));
}

} // End namespace rosa
