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

#include "rosa/core/Unit.h"

#include "rosa/core/System.hpp" // NOLINT

#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 '" +
            std::to_string(Kind) + "'");
}

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

/// The default implementation of \c rosa::Unit::dump emits
/// \c rosa::Unit::FullName.
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
