#pragma once
/**
 * @file     	IAsyncContext.h
 * @brief    	Async context interface
 * @copyright	VisionLabs LLC
 * @date     	30.05.2014
 * */

#include <cstdint>
#include "Def.h"
#include "IRefCounted.h"
#include "Types.h"

namespace fsdk {
	
	#ifndef DOXYGEN_SHOULD_SKIP_THIS
		DECLARE_SMARTPTR(IAsyncContext);
	#endif

	/**
	 * @brief Interface for running tasks asynchronously.
	 * @details Contains thread pool under hood.
	 * */
	struct IAsyncContext
	: IRefCounted {
		/**
		 * @brief Returns size of underlying thread pool.
		 * @return Count of threads.
		 * */
		virtual int8_t threads() const noexcept = 0;
		
		/**
		 * @brief Tells validness of internal state
		 * @return True if valid, false otherwise.
		 * */
		virtual bool valid() const noexcept = 0;
		
		/**
		 * @brief Clears tasks not yet taken by any thread.
		 * @return True on success, false otherwise.
		 * */
		virtual bool clearTaskQueue() noexcept = 0;
		
		/**
		 * @brief Resizes internal thread pool to some new size
		 * param newThreadCount New size of thread pool. Should not be less than 1
		 * @return True on success, false otherwise.
		 * */
		virtual bool resize(const int8_t newThreadCount) noexcept = 0;
		
		/**
		 * @brief Waits for all already running tasks to complete, then stops
		 * every thread. Do not use threadpool afterwards. Is called on destruction.
		 * @return True on success, false otherwise.
		 * */
		virtual bool stop() noexcept = 0;
	};
	
}