228 lines
6.6 KiB
C++
228 lines
6.6 KiB
C++
|
/**
|
||
|
******************************************************************************
|
||
|
* This file is part of the TouchGFX 4.16.1 distribution.
|
||
|
*
|
||
|
* <h2><center>© Copyright (c) 2021 STMicroelectronics.
|
||
|
* All rights reserved.</center></h2>
|
||
|
*
|
||
|
* This software component is licensed by ST under Ultimate Liberty license
|
||
|
* SLA0044, the "License"; You may not use this file except in compliance with
|
||
|
* the License. You may obtain a copy of the License at:
|
||
|
* www.st.com/SLA0044
|
||
|
*
|
||
|
******************************************************************************
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @file common/AbstractPartition.hpp
|
||
|
*
|
||
|
* Declares the touchgfx::AbstractPartition class.
|
||
|
*/
|
||
|
#ifndef ABSTRACTPARTITION_HPP
|
||
|
#define ABSTRACTPARTITION_HPP
|
||
|
|
||
|
#include <touchgfx/hal/Types.hpp>
|
||
|
|
||
|
namespace touchgfx
|
||
|
{
|
||
|
/**
|
||
|
* This type defines an abstract interface to a storage partition for allocating memory slots of
|
||
|
* equal size. The "partition" is not aware of the actual types stored in the partition
|
||
|
* memory, hence it provides no mechanism for deleting C++ objects when clear()'ed.
|
||
|
*/
|
||
|
class AbstractPartition
|
||
|
{
|
||
|
public:
|
||
|
/** Finalizes an instance of the AbstractPartition class. */
|
||
|
virtual ~AbstractPartition();
|
||
|
|
||
|
/**
|
||
|
* Gets the address of the next available storage slot. The slot size is compared with
|
||
|
* the specified size.
|
||
|
*
|
||
|
* @param size The size.
|
||
|
*
|
||
|
* @return The address of an empty storage slot which contains minimum 'size' bytes.
|
||
|
*
|
||
|
* @note Asserts if 'size' is too large, or the storage is depleted.
|
||
|
*/
|
||
|
virtual void* allocate(uint16_t size);
|
||
|
|
||
|
/**
|
||
|
* Gets the address of the specified index.
|
||
|
*
|
||
|
* @param index Zero-based index of the.
|
||
|
* @param size The size.
|
||
|
*
|
||
|
* @return The address of the appropriate storage slot which contains minimum 'size'
|
||
|
* bytes.
|
||
|
*
|
||
|
* @note Asserts if 'size' is too large.
|
||
|
*/
|
||
|
virtual void* allocateAt(uint16_t index, uint16_t size);
|
||
|
|
||
|
/**
|
||
|
* Gets allocation count.
|
||
|
*
|
||
|
* @return The currently allocated storage slots.
|
||
|
*/
|
||
|
virtual uint16_t getAllocationCount() const;
|
||
|
|
||
|
/**
|
||
|
* Determines index of previously allocated location. Since the Partition concept is
|
||
|
* loosely typed this method shall be used with care. The method does not guarantee that
|
||
|
* the found object at the returned index is a valid object. It only tests whether or
|
||
|
* not the object is within the bounds of the current partition allocations.
|
||
|
*
|
||
|
* @param address The location address to lookup.
|
||
|
*
|
||
|
* @return An uint16_t.
|
||
|
*/
|
||
|
virtual uint16_t indexOf(const void* address);
|
||
|
|
||
|
/**
|
||
|
* Prepares the Partition for new allocations. Any objects present in the Partition
|
||
|
* shall not be used after invoking this method.
|
||
|
*/
|
||
|
virtual void clear();
|
||
|
|
||
|
/**
|
||
|
* Gets the capacity, i.e. the maximum allocation count.
|
||
|
*
|
||
|
* @return The maximum allocation count.
|
||
|
*/
|
||
|
virtual uint16_t capacity() const = 0;
|
||
|
|
||
|
/**
|
||
|
* Gets the address of the next available storage slot. The slot size is determined from
|
||
|
* the size of type T.
|
||
|
*
|
||
|
* @tparam T Generic type parameter.
|
||
|
*
|
||
|
* @return The address of an empty storage slot.
|
||
|
*
|
||
|
* @note Asserts if T is too large, or the storage is depleted.
|
||
|
*/
|
||
|
template <typename T>
|
||
|
void* allocate()
|
||
|
{
|
||
|
return allocate(static_cast<uint16_t>(sizeof(T)));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the address of the specified storage slot. The slot size is determined from the
|
||
|
* size of type T.
|
||
|
*
|
||
|
* @tparam T Generic type parameter.
|
||
|
* @param index Zero-based index of the.
|
||
|
*
|
||
|
* @return The address of the appropriate storage slot.
|
||
|
*
|
||
|
* @note Asserts if T is too large.
|
||
|
*/
|
||
|
template <typename T>
|
||
|
void* allocateAt(uint16_t index)
|
||
|
{
|
||
|
return allocateAt(index, static_cast<uint16_t>(sizeof(T)));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the object at the specified index.
|
||
|
*
|
||
|
* @tparam T Generic type parameter.
|
||
|
* @param index The index into the Partition storage where the returned object is located.
|
||
|
*
|
||
|
* @return A typed reference to the object at the specified index.
|
||
|
*/
|
||
|
template <typename T>
|
||
|
T& at(const uint16_t index)
|
||
|
{
|
||
|
return *static_cast<T*>(element(index));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* const version of at().
|
||
|
*
|
||
|
* @tparam T Generic type parameter.
|
||
|
* @param index Zero-based index of the.
|
||
|
*
|
||
|
* @return A T&
|
||
|
*/
|
||
|
template <typename T>
|
||
|
const T& at(const uint16_t index) const
|
||
|
{
|
||
|
return *static_cast<const T*>(element(index));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Determines if the specified object could have been previously allocated in the
|
||
|
* partition. Since the Partition concept is loosely typed this method shall be used
|
||
|
* with care. The method does not guarantee that the found object at the returned index
|
||
|
* is a valid object. It only tests whether or not the object is within the bounds of
|
||
|
* the current partition allocations.
|
||
|
*
|
||
|
* @tparam T Generic type parameter.
|
||
|
* @param pT Pointer to the object to look up.
|
||
|
*
|
||
|
* @return If the object seems to be allocated in the Partition, a Pair object
|
||
|
* containing a typed pointer to the object and an index into the Partition
|
||
|
* storage is returned. Otherwise, a Pair<0, 0> is returned.
|
||
|
*/
|
||
|
template <class T>
|
||
|
Pair<T*, uint16_t> find(const void* pT)
|
||
|
{
|
||
|
uint16_t index = indexOf(pT);
|
||
|
if (0 < getAllocationCount() && index < getAllocationCount())
|
||
|
{
|
||
|
return Pair<T*, uint16_t>(&at<T>(index), index);
|
||
|
}
|
||
|
|
||
|
return Pair<T*, uint16_t>(0, (uint16_t) -1);
|
||
|
}
|
||
|
|
||
|
/** Decreases number of allocations. */
|
||
|
void dec()
|
||
|
{
|
||
|
if (allocations)
|
||
|
{
|
||
|
allocations--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Access to concrete element-size. Used internally.
|
||
|
*
|
||
|
* @return An uint32_t.
|
||
|
*/
|
||
|
virtual uint32_t element_size() = 0;
|
||
|
|
||
|
protected:
|
||
|
/**
|
||
|
* Access to stored element. Used internally.
|
||
|
*
|
||
|
* @param index Zero-based index of the.
|
||
|
*
|
||
|
* @return null if it fails, else a void*.
|
||
|
*/
|
||
|
virtual void* element(uint16_t index) = 0;
|
||
|
|
||
|
/**
|
||
|
* Access to stored element, const version.
|
||
|
*
|
||
|
* @param index Zero-based index of the.
|
||
|
*
|
||
|
* @return null if it fails, else a void*.
|
||
|
*/
|
||
|
virtual const void* element(uint16_t index) const = 0;
|
||
|
|
||
|
/** Initializes a new instance of the AbstractPartition class. */
|
||
|
AbstractPartition();
|
||
|
|
||
|
private:
|
||
|
uint16_t allocations;
|
||
|
};
|
||
|
|
||
|
} // namespace touchgfx
|
||
|
|
||
|
#endif // ABSTRACTPARTITION_HPP
|