JUCE
|
Very simple container class to hold a pointer to some data on the heap. More...
Public Types | |
using | Type = ElementType |
This typedef can be used to get the type of the heapblock's elements. More... | |
Public Member Functions | |
HeapBlock ()=default | |
Creates a HeapBlock which is initially just a null pointer. More... | |
template<typename SizeType > | |
HeapBlock (SizeType numElements) | |
Creates a HeapBlock containing a number of elements. More... | |
template<typename SizeType > | |
HeapBlock (SizeType numElements, bool initialiseToZero) | |
Creates a HeapBlock containing a number of elements. More... | |
~HeapBlock () | |
Destructor. More... | |
HeapBlock (HeapBlock &&other) noexcept | |
Move constructor. More... | |
HeapBlock & | operator= (HeapBlock &&other) noexcept |
Move assignment operator. More... | |
template<class OtherElementType , bool otherThrowOnFailure, typename = AllowConversion<OtherElementType>> | |
HeapBlock (HeapBlock< OtherElementType, otherThrowOnFailure > &&other) noexcept | |
Converting move constructor. More... | |
template<class OtherElementType , bool otherThrowOnFailure, typename = AllowConversion<OtherElementType>> | |
HeapBlock & | operator= (HeapBlock< OtherElementType, otherThrowOnFailure > &&other) noexcept |
Converting move assignment operator. More... | |
operator ElementType * () const noexcept | |
Returns a raw pointer to the allocated data. More... | |
ElementType * | get () const noexcept |
Returns a raw pointer to the allocated data. More... | |
ElementType * | getData () const noexcept |
Returns a raw pointer to the allocated data. More... | |
operator void * () const noexcept | |
Returns a void pointer to the allocated data. More... | |
operator const void * () const noexcept | |
Returns a void pointer to the allocated data. More... | |
ElementType * | operator-> () const noexcept |
Lets you use indirect calls to the first element in the array. More... | |
template<typename IndexType > | |
ElementType & | operator[] (IndexType index) const noexcept |
Returns a reference to one of the data elements. More... | |
template<typename IndexType > | |
ElementType * | operator+ (IndexType index) const noexcept |
Returns a pointer to a data element at an offset from the start of the array. More... | |
bool | operator== (const ElementType *otherPointer) const noexcept |
Compares the pointer with another pointer. More... | |
bool | operator!= (const ElementType *otherPointer) const noexcept |
Compares the pointer with another pointer. More... | |
template<typename SizeType > | |
void | malloc (SizeType newNumElements, size_t elementSize=sizeof(ElementType)) |
Allocates a specified amount of memory. More... | |
template<typename SizeType > | |
void | calloc (SizeType newNumElements, const size_t elementSize=sizeof(ElementType)) |
Allocates a specified amount of memory and clears it. More... | |
template<typename SizeType > | |
void | allocate (SizeType newNumElements, bool initialiseToZero) |
Allocates a specified amount of memory and optionally clears it. More... | |
template<typename SizeType > | |
void | realloc (SizeType newNumElements, size_t elementSize=sizeof(ElementType)) |
Re-allocates a specified amount of memory. More... | |
void | free () noexcept |
Frees any currently-allocated data. More... | |
template<bool otherBlockThrows> | |
void | swapWith (HeapBlock< ElementType, otherBlockThrows > &other) noexcept |
Swaps this object's data with the data of another HeapBlock. More... | |
template<typename SizeType > | |
void | clear (SizeType numElements) noexcept |
This fills the block with zeros, up to the number of elements specified. More... | |
Very simple container class to hold a pointer to some data on the heap.
When you need to allocate some heap storage for something, always try to use this class instead of allocating the memory directly using malloc/free.
A HeapBlock<char> object can be treated in pretty much exactly the same way as an char*, but as long as you allocate it on the stack or as a class member, it's almost impossible for it to leak memory.
It also makes your code much more concise and readable than doing the same thing using direct allocations,
E.g. instead of this:
..you could just write this:
The class is extremely lightweight, containing only a pointer to the data, and exposes malloc/realloc/calloc/free methods that do the same jobs as their less object-oriented counterparts. Despite adding safety, you probably won't sacrifice any performance by using this in place of normal pointers.
The throwOnFailure template parameter can be set to true if you'd like the class to throw a std::bad_alloc exception when an allocation fails. If this is false, then a failed allocation will just leave the heapblock with a null pointer (assuming that the system's malloc() function doesn't throw).
using HeapBlock< ElementType, throwOnFailure >::Type = ElementType |
This typedef can be used to get the type of the heapblock's elements.
HeapBlock< ElementType, throwOnFailure >::HeapBlock | ( | SizeType | numElements, |
bool | initialiseToZero | ||
) |
Creates a HeapBlock containing a number of elements.
The initialiseToZero parameter determines whether the new memory should be cleared, or left uninitialised.
HeapBlock< ElementType, throwOnFailure >::~HeapBlock | ( | ) |
Destructor.
This will free the data, if any has been allocated.
|
noexcept |
Move constructor.
|
noexcept |
Converting move constructor.
Only enabled if this is a HeapBlock<Base*> and the other object is a HeapBlock<Derived*>, where std::is_base_of<Base, Derived>::value == true.
|
noexcept |
Move assignment operator.
|
noexcept |
Converting move assignment operator.
Only enabled if this is a HeapBlock<Base*> and the other object is a HeapBlock<Derived*>, where std::is_base_of<Base, Derived>::value == true.
|
noexcept |
Returns a raw pointer to the allocated data.
This may be a null pointer if the data hasn't yet been allocated, or if it has been freed by calling the free() method.
|
noexcept |
Returns a raw pointer to the allocated data.
This may be a null pointer if the data hasn't yet been allocated, or if it has been freed by calling the free() method.
Referenced by SpeakerMappings::VstSpeakerConfigurationHolder::get(), and AudioBuffer< float >::setSize().
|
noexcept |
Returns a raw pointer to the allocated data.
This may be a null pointer if the data hasn't yet been allocated, or if it has been freed by calling the free() method.
Referenced by dsp::FIR::Filter< SampleType >::reset().
|
noexcept |
Returns a void pointer to the allocated data.
This may be a null pointer if the data hasn't yet been allocated, or if it has been freed by calling the free() method.
|
noexcept |
Returns a void pointer to the allocated data.
This may be a null pointer if the data hasn't yet been allocated, or if it has been freed by calling the free() method.
|
noexcept |
Lets you use indirect calls to the first element in the array.
Obviously this will cause problems if the array hasn't been initialised, because it'll be referencing a null pointer.
|
noexcept |
Returns a reference to one of the data elements.
Obviously there's no bounds-checking here, as this object is just a dumb pointer and has no idea of the size it currently has allocated.
|
noexcept |
Returns a pointer to a data element at an offset from the start of the array.
This is the same as doing pointer arithmetic on the raw pointer itself.
|
noexcept |
Compares the pointer with another pointer.
This can be handy for checking whether this is a null pointer.
|
noexcept |
Compares the pointer with another pointer.
This can be handy for checking whether this is a null pointer.
void HeapBlock< ElementType, throwOnFailure >::malloc | ( | SizeType | newNumElements, |
size_t | elementSize = sizeof (ElementType) |
||
) |
Allocates a specified amount of memory.
This uses the normal malloc to allocate an amount of memory for this object. Any previously allocated memory will be freed by this method.
The number of bytes allocated will be (newNumElements * elementSize). Normally you wouldn't need to specify the second parameter, but it can be handy if you need to allocate a size in bytes rather than in terms of the number of elements.
The data that is allocated will be freed when this object is deleted, or when you call free() or any of the allocation methods.
Referenced by SpeakerMappings::VstSpeakerConfigurationHolder::get(), and dsp::FIR::Filter< SampleType >::reset().
void HeapBlock< ElementType, throwOnFailure >::calloc | ( | SizeType | newNumElements, |
const size_t | elementSize = sizeof (ElementType) |
||
) |
Allocates a specified amount of memory and clears it.
This does the same job as the malloc() method, but clears the memory that it allocates.
void HeapBlock< ElementType, throwOnFailure >::allocate | ( | SizeType | newNumElements, |
bool | initialiseToZero | ||
) |
Allocates a specified amount of memory and optionally clears it.
This does the same job as either malloc() or calloc(), depending on the initialiseToZero parameter.
Referenced by AudioBuffer< float >::setSize().
void HeapBlock< ElementType, throwOnFailure >::realloc | ( | SizeType | newNumElements, |
size_t | elementSize = sizeof (ElementType) |
||
) |
Re-allocates a specified amount of memory.
The semantics of this method are the same as malloc() and calloc(), but it uses realloc() to keep as much of the existing data as possible.
Referenced by ArrayBase< ProgressBar *, DummyCriticalSection >::move(), and ArrayAllocationBase< ElementType, TypeOfCriticalSectionToUse >::setAllocatedSize().
|
noexcept |
Frees any currently-allocated data.
This will free the data and reset this object to be a null pointer.
Referenced by ArrayAllocationBase< ElementType, TypeOfCriticalSectionToUse >::setAllocatedSize(), and ArrayBase< ProgressBar *, DummyCriticalSection >::setAllocatedSize().
|
noexcept |
Swaps this object's data with the data of another HeapBlock.
The two objects simply exchange their data pointers.
Referenced by ArrayAllocationBase< ElementType, TypeOfCriticalSectionToUse >::swapWith(), and ArrayBase< ProgressBar *, DummyCriticalSection >::swapWith().
|
noexcept |
This fills the block with zeros, up to the number of elements specified.
Since the block has no way of knowing its own size, you must make sure that the number of elements you specify doesn't exceed the allocated size.