//===-- rosa/app/AppAtoms.hpp -----------------------------------*- 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 rosa/app/AppAtoms.hpp
///
/// \author David Juhasz (david.juhasz@tuwien.ac.at)
///
/// \date 2017-2020
///
/// \brief Definition of \c rosa::AtomValue values and \c rosa::AtomConstant
/// types for the implementation of the *application interface*.
///
//===----------------------------------------------------------------------===//

#ifndef ROSA_APP_APPATOMS_HPP
#define ROSA_APP_APPATOMS_HPP

#include "rosa/support/atom.hpp"

namespace rosa {
namespace app {

/// Contains some definitions used in the implementation of the *application
/// interface* to denote various roles and events
///
/// \see \c rosa::app::Application
///
/// \note Do not apply `using namespace` to this namespace as that may result in
/// some identifiers in the original namespace being hidden by those of
/// \c rosa::app::atoms.
namespace atoms {

/// Value to be used as the *kind* of \c rosa::app::AppSensor.
///
/// \see \c rosa::Unit::Kind
constexpr AtomValue SensorKind = atom("ap_sensor");

/// Value to be used as the *kind* of \c rosa::app::AppAgent.
///
/// \see \c rosa::Unit::Kind
constexpr AtomValue AgentKind = atom("ap_agent");

/// Type alias denoting system trigger messages.
using Trigger = AtomConstant<atom("ap_trigger")>;

/// Type alias denoting messages from a slave.
using Slave = AtomConstant<atom("ap_slave")>;

/// Type alias denoting messages from a master.
using Master = AtomConstant<atom("ap_master")>;

} // End namespace atoms
} // End namespace app
} // End namespace rosa

#endif // ROSA_APP_APPATOMS_HPP
