/***************************************************************************//**
 *
 * \file core/Unit.cpp
 *
 * \author David Juhasz (david.juhasz@tuwien.ac.at)
 *
 * \date 2017
 *
 * \brief Implementation for rosa/core/Unit.h.
 *
 ******************************************************************************/


#include "rosa/core/Unit.h"

#include "rosa/core/System.hpp"

#include "rosa/support/debug.hpp"
#include "rosa/support/log.h"

namespace rosa {

Unit::Unit(const AtomValue Kind, const id_t Id, const std::string &Name,
           System &S) noexcept : Kind(Kind),
                                 Id(Id),
                                 Name(Name),
                                 S(S),
                                 FullName(Name + "@" + S.name()) {
  ASSERT(!Name.empty());
  LOG_TRACE("Constructing Unit (" + FullName + " of kind '" + to_string(Kind) +
            "')");
}

Unit::~Unit(void) { LOG_TRACE("Destroying Unit (" + FullName + ")"); }

/// The default implementation of `rosa::Unit::dump` emits `Name` of `this`
/// object.
std::string Unit::dump(void) const noexcept {
  LOG_TRACE("Dumping Unit (" + FullName + ")");
  return "[Unit] " + FullName;
}

System &Unit::system(void) const noexcept {
  return S;
}

std::ostream &operator<<(std::ostream &OS, const Unit &U) {
  OS << U.dump();
  return OS;
}

} // End namespace rosa

