//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#pragma once

#include <atomic>

#include <boost/core/ignore_unused.hpp>

namespace armnn
{

namespace  profiling
{

enum class ProfilingState
{
    Uninitialised,
    NotConnected,
    WaitingForAck,
    Active
};

class ProfilingStateMachine
{
public:
    ProfilingStateMachine() : m_State(ProfilingState::Uninitialised) {}
    ProfilingStateMachine(ProfilingState state) : m_State(state) {}

    ProfilingState GetCurrentState() const;
    void TransitionToState(ProfilingState newState);
    void Reset();

    bool IsOneOfStates(ProfilingState state1)
    {
        boost::ignore_unused(state1);
        return false;
    }

    template<typename T, typename... Args >
    bool IsOneOfStates(T state1, T state2, Args... args)
    {
        if (state1 == state2)
        {
            return true;
        }
        else
        {
            return IsOneOfStates(state1, args...);
        }
    }

private:
    std::atomic<ProfilingState> m_State;
};

constexpr char const* GetProfilingStateName(ProfilingState state)
{
    switch (state)
    {
        case ProfilingState::Uninitialised: return "Uninitialised";
        case ProfilingState::NotConnected:  return "NotConnected";
        case ProfilingState::WaitingForAck: return "WaitingForAck";
        case ProfilingState::Active:        return "Active";
        default:                            return "Unknown";
    }
}

} // namespace profiling

} // namespace armnn

