/**
 * @file      lib.AbstractThreadTask.hpp
 * @author    Sergey Baigudin, sergey@baigudin.software
 * @copyright 2022, Sergey Baigudin, Baigudin Software
 */
#ifndef LIB_ABSTRACTTHREADTASK_HPP_
#define LIB_ABSTRACTTHREADTASK_HPP_

#include "lib.Thread.hpp"

namespace eoos
{
namespace lib
{

/**
 * @class AbstractThreadTask<A>
 * @brief Abstract thread with a task.
 *
 * @tparam A Heap memory allocator class. 
 */
template <class A = Allocator>   
class AbstractThreadTask : public Thread<A>, public api::Task
{
    typedef Thread<A> Parent;

public:

    /**
     * @brief Constructor.
     */
    AbstractThreadTask() 
        : Thread<A>()
        , api::Task() {
        bool_t const isConstructed( construct() );
        setConstructed( isConstructed );        
    }

    /**
     * @brief Destructor.
     */
    virtual ~AbstractThreadTask() {}

    /**
     * @copydoc eoos::api::Task::start()
     */        
    virtual void start() = 0;

    /**
     * @copydoc eoos::api::Object::isConstructed()
     */
    virtual bool_t isConstructed() const
    {
        return Parent::isConstructed();
    }

    /**
     * @copydoc eoos::api::Task::getStackSize()
     */
    virtual size_t getStackSize() const
    {
        return 0U;
    }

protected:

    using Parent::setConstructed;
    using Parent::setTask;

private:

    /**
     * @brief Constructor.
     *
     * @return True if object has been constructed successfully.
     */
    bool_t construct()
    {
        return setTask(*this);
    }

};

} // namespace lib
} // namespace eoos
#endif // LIB_ABSTRACTTHREADTASK_HPP_

Generated by OpenCppCoverage (Version: 0.9.9.0)