/**
 * @file      sys.Scheduler.hpp
 * @author    Sergey Baigudin, sergey@baigudin.software
 * @copyright 2017-2022, Sergey Baigudin, Baigudin Software
 */
#ifndef SYS_SCHEDULER_HPP_
#define SYS_SCHEDULER_HPP_

#include "sys.NonCopyable.hpp"
#include "api.Scheduler.hpp"

namespace eoos
{
namespace sys
{

/**
 * @class Scheduler
 * @brief Thread tasks scheduler class.
 */
class Scheduler : public NonCopyable, public api::Scheduler
{
    using Parent = NonCopyable;

public:

    /**
     * @brief Constructor.
     */
    Scheduler();

    /**
     * @brief Destructor.
     */
    ~Scheduler() override = default;

    /**
     * @copydoc eoos::api::Object::isConstructed()
     */
    bool_t isConstructed() const override; ///< SCA AUTOSAR-C++14 Defected Rule A10-2-1

    /**
     * @copydoc eoos::api::Scheduler::createThread(api::Task&)
     */     
    api::Thread* createThread(api::Task& task) override; ///< SCA AUTOSAR-C++14 Justified Rule A8-4-8
    
    /**
     * @copydoc eoos::api::Scheduler::sleep(int32_t)
     */
    bool_t sleep(int32_t ms) override;        

    /**
     * @copydoc eoos::api::Scheduler::yield()
     */
    void yield() override;

private:

    /**
     * @brief Constructor.
     *
     * @return true if object has been constructed successfully.
     */
    bool_t construct();
    
    /**
     * @copydoc eoos::Object::Object(Object const&)
     */
    Scheduler(Scheduler const&) noexcept = delete;
    
    /**
     * @copydoc eoos::Object::operator=(Object const&)
     */       
    Scheduler& operator=(Scheduler const&) noexcept = delete;   

    /**
     * @copydoc eoos::Object::Object(Object&&)
     */       
    Scheduler(Scheduler&&) noexcept = delete;
    
    /**
     * @copydoc eoos::Object::operator=(Object&&)
     */
    Scheduler& operator=(Scheduler&&) & noexcept = delete;    
    
    /**
     * @brief A Windows handle of root application process.
     */
    ::HANDLE processHandle_{ NULLPTR };

    /**
     * @brief Priority of the root application process.
     */    
    ::DWORD processPriority_{ 0U };
};

} // namespace sys
} // namespace eoos
#endif // SYS_SCHEDULER_HPP_

Generated by OpenCppCoverage (Version: 0.9.9.0)