/**
* @file sys.Heap.hpp
* @author Sergey Baigudin, sergey@baigudin.software
* @copyright 2022, Sergey Baigudin, Baigudin Software
*/
#ifndef SYS_HEAP_HPP_
#define SYS_HEAP_HPP_
#include "sys.NonCopyable.hpp"
#include "api.Heap.hpp"
namespace eoos
{
namespace sys
{
/**
* @class Heap.
* @brief Heap class.
*/
class Heap : public NonCopyable, public api::Heap
{
using Parent = NonCopyable;
public:
/**
* @brief Constructor.
*/
Heap() noexcept
: NonCopyable()
, api::Heap() {
bool_t const isConstructed{ construct() };
setConstructed( isConstructed );
}
/**
* @brief Destructor.
*/
~Heap() noexcept override = default;
/**
* @copydoc eoos::api::Object::isConstructed()
*/
bool_t isConstructed() const noexcept override ///< SCA AUTOSAR-C++14 Defected Rule A10-2-1
{
return Parent::isConstructed();
}
/**
* @copydoc eoos::api::Heap::allocate(size_t,void*)
*/
void* allocate(size_t const size, void* ptr) override ///< SCA AUTOSAR-C++14 Justified Rule A8-4-8
{
static_cast<void>(ptr); // Avoid MISRA-C++:2008 Rule 0â1â3 and AUTOSAR C++14 Rule A0-1-4
#ifdef EOOS_ENABLE_DYNAMIC_HEAP_MEMORY
return new ucell_t[size];
#else
static_cast<void>(size); // Avoid MISRA-C++:2008 Rule 0â1â3 and AUTOSAR C++14 Rule A0-1-4
return NULLPTR;
#endif // EOOS_ENABLE_DYNAMIC_HEAP_MEMORY
}
/**
* @copydoc eoos::api::Heap::free(void*)
*/
void free(void* ptr) override ///< SCA AUTOSAR-C++14 Justified Rule A8-4-8
{
#ifdef EOOS_ENABLE_DYNAMIC_HEAP_MEMORY
ucell_t* addr{ static_cast<ucell_t*>(ptr) }; ///< SCA AUTOSAR-C++14 Justified Rule M5-2-8
delete[] addr;
#else
static_cast<void>(ptr); // Avoid MISRA-C++:2008 Rule 0â1â3 and AUTOSAR C++14 Rule A0-1-4
#endif // EOOS_ENABLE_DYNAMIC_HEAP_MEMORY
}
private:
/**
* @brief Constructor.
*
* @return True if object has been constructed successfully.
*/
bool_t construct() const noexcept
{
bool_t res{ false };
if( isConstructed() )
{
res = true;
}
return res;
}
/**
* @copydoc eoos::Object::Object(Object const&)
*/
Heap(Heap const&) noexcept = delete;
/**
* @copydoc eoos::Object::operator=(Object const&)
*/
Heap& operator=(Heap const&) noexcept = delete;
/**
* @copydoc eoos::Object::Object(Object&&)
*/
Heap(Heap&&) noexcept = delete;
/**
* @copydoc eoos::Object::operator=(Object&&)
*/
Heap& operator=(Heap&&) & noexcept = delete;
};
} // namespace sys
} // namespace eoos
#endif // SYS_HEAP_HPP_