diff --git a/include/etl/private/pvoidvector.h b/include/etl/private/pvoidvector.h index 4cef3c8e..5997b2e6 100644 --- a/include/etl/private/pvoidvector.h +++ b/include/etl/private/pvoidvector.h @@ -74,246 +74,41 @@ namespace etl public: - //********************************************************************* - /// Returns an iterator to the beginning of the vector. - ///\return An iterator to the beginning of the vector. - //********************************************************************* - iterator begin() - { - return p_buffer; - } + iterator begin(); + const_iterator begin() const; - //********************************************************************* - /// Returns a const_iterator to the beginning of the vector. - ///\return A const iterator to the beginning of the vector. - //********************************************************************* - const_iterator begin() const - { - return const_iterator(p_buffer); - } + iterator end(); + const_iterator end() const; - //********************************************************************* - /// Returns an iterator to the end of the vector. - ///\return An iterator to the end of the vector. - //********************************************************************* - iterator end() - { - return p_end; - } + const_iterator cbegin() const; + const_iterator cend() const; - //********************************************************************* - /// Returns a const_iterator to the end of the vector. - ///\return A const iterator to the end of the vector. - //********************************************************************* - const_iterator end() const - { - return const_iterator(p_end); - } + reverse_iterator rbegin(); + const_reverse_iterator rbegin() const; - //********************************************************************* - /// Returns a const_iterator to the beginning of the vector. - ///\return A const iterator to the beginning of the vector. - //********************************************************************* - const_iterator cbegin() const - { - return const_iterator(p_buffer); - } + reverse_iterator rend(); + const_reverse_iterator rend() const; - //********************************************************************* - /// Returns a const_iterator to the end of the vector. - ///\return A const iterator to the end of the vector. - //********************************************************************* - const_iterator cend() const - { - return const_iterator(p_end); - } + const_reverse_iterator crbegin() const; + const_reverse_iterator crend() const; - //********************************************************************* - /// Returns an reverse iterator to the reverse beginning of the vector. - ///\return Iterator to the reverse beginning of the vector. - //********************************************************************* - reverse_iterator rbegin() - { - return reverse_iterator(end()); - } + void resize(size_t new_size); + void resize(size_t new_size, value_type value); - //********************************************************************* - /// Returns a const reverse iterator to the reverse beginning of the vector. - ///\return Const iterator to the reverse beginning of the vector. - //********************************************************************* - const_reverse_iterator rbegin() const - { - return const_reverse_iterator(end()); - } + reference operator [](size_t i); + const_reference operator [](size_t i) const; - //********************************************************************* - /// Returns a reverse iterator to the end + 1 of the vector. - ///\return Reverse iterator to the end + 1 of the vector. - //********************************************************************* - reverse_iterator rend() - { - return reverse_iterator(begin()); - } + reference at(size_t i); + const_reference at(size_t i) const; - //********************************************************************* - /// Returns a const reverse iterator to the end + 1 of the vector. - ///\return Const reverse iterator to the end + 1 of the vector. - //********************************************************************* - const_reverse_iterator rend() const - { - return const_reverse_iterator(begin()); - } + reference front(); + const_reference front() const; - //********************************************************************* - /// Returns a const reverse iterator to the reverse beginning of the vector. - ///\return Const reverse iterator to the reverse beginning of the vector. - //********************************************************************* - const_reverse_iterator crbegin() const - { - return const_reverse_iterator(cend()); - } + reference back(); + const_reference back() const; - //********************************************************************* - /// Returns a const reverse iterator to the end + 1 of the vector. - ///\return Const reverse iterator to the end + 1 of the vector. - //********************************************************************* - const_reverse_iterator crend() const - { - return const_reverse_iterator(cbegin()); - } - - //********************************************************************* - /// Resizes the vector. - /// If asserts or exceptions are enabled and the new size is larger than the - /// maximum then a vector_full is thrown. - ///\param new_size The new size. - //********************************************************************* - void resize(size_t new_size) - { - ETL_ASSERT(new_size <= CAPACITY, ETL_ERROR(vector_full)); - - p_end = p_buffer + new_size; - } - - //********************************************************************* - /// Resizes the vector. - /// If asserts or exceptions are enabled and the new size is larger than the - /// maximum then a vector_full is thrown. - ///\param new_size The new size. - ///\param value The value to fill new elements with. Default = default constructed value. - //********************************************************************* - void resize(size_t new_size, value_type value) - { - ETL_ASSERT(new_size <= CAPACITY, ETL_ERROR(vector_full)); - - pointer p_new_end = p_buffer + new_size; - - // Size up if necessary. - if (p_end < p_new_end) - { - std::fill(p_end, p_new_end, value); - } - - p_end = p_new_end; - } - - //********************************************************************* - /// Returns a reference to the value at index 'i' - ///\param i The index. - ///\return A reference to the value at index 'i' - //********************************************************************* - reference operator [](size_t i) - { - return p_buffer[i]; - } - - //********************************************************************* - /// Returns a const reference to the value at index 'i' - ///\param i The index. - ///\return A const reference to the value at index 'i' - //********************************************************************* - const_reference operator [](size_t i) const - { - return const_reference(p_buffer[i]); - } - - //********************************************************************* - /// Returns a reference to the value at index 'i' - /// If asserts or exceptions are enabled, emits an etl::vector_out_of_bounds if the index is out of range. - ///\param i The index. - ///\return A reference to the value at index 'i' - //********************************************************************* - reference at(size_t i) - { - ETL_ASSERT(i < size(), ETL_ERROR(vector_out_of_bounds)); - return p_buffer[i]; - } - - //********************************************************************* - /// Returns a const reference to the value at index 'i' - /// If asserts or exceptions are enabled, emits an etl::vector_out_of_bounds if the index is out of range. - ///\param i The index. - ///\return A const reference to the value at index 'i' - //********************************************************************* - const_reference at(size_t i) const - { - ETL_ASSERT(i < size(), ETL_ERROR(vector_out_of_bounds)); - return const_reference(p_buffer[i]); - } - - //********************************************************************* - /// Returns a reference to the first element. - ///\return A reference to the first element. - //********************************************************************* - reference front() - { - return p_buffer[0]; - } - - //********************************************************************* - /// Returns a const reference to the first element. - ///\return A const reference to the first element. - //********************************************************************* - const_reference front() const - { - return const_reference(p_buffer[0]); - } - - //********************************************************************* - /// Returns a reference to the last element. - ///\return A reference to the last element. - //********************************************************************* - reference back() - { - return *(p_end -1); - } - - //********************************************************************* - /// Returns a const reference to the last element. - ///\return A const reference to the last element. - //********************************************************************* - const_reference back() const - { - return const_reference(*(p_end - 1)); - } - - //********************************************************************* - /// Returns a pointer to the beginning of the vector data. - ///\return A pointer to the beginning of the vector data. - //********************************************************************* - pointer data() - { - return p_buffer; - } - - //********************************************************************* - /// Returns a const pointer to the beginning of the vector data. - ///\return A const pointer to the beginning of the vector data. - //********************************************************************* - const_pointer data() const - { - return const_pointer(p_buffer); - } + pointer data(); + const_pointer data() const; //********************************************************************* /// Assigns values to the vector. @@ -338,110 +133,17 @@ namespace etl } } - //********************************************************************* - /// Assigns values to the vector. - /// If asserts or exceptions are enabled, emits vector_full if the vector does not have enough free space. - ///\param n The number of elements to add. - ///\param value The value to insert for each element. - //********************************************************************* - void assign(size_t n, value_type value) - { - initialise(); + void assign(size_t n, value_type value); - ETL_ASSERT(n <= CAPACITY, ETL_ERROR(vector_full)); + void clear(); - for (size_t current_size = 0; current_size < n; ++current_size) - { - *p_end++ = value; - } - } + void push_back(); + void push_back(value_type value); - //************************************************************************* - /// Clears the vector. - //************************************************************************* - void clear() - { - initialise(); - } + void pop_back(); - //************************************************************************* - /// Increases the size of the vector by one, but does not initialise the new element. - /// If asserts or exceptions are enabled, throws a vector_full if the vector is already full. - //************************************************************************* - void push_back() - { -#if defined(ETL_CHECK_PUSH_POP) - ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full)); -#endif - - ++p_end; - } - - //********************************************************************* - /// Inserts a value at the end of the vector. - /// If asserts or exceptions are enabled, emits vector_full if the vector is already full. - ///\param value The value to add. - //********************************************************************* - void push_back(value_type value) - { -#if defined(ETL_CHECK_PUSH_POP) - ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full)); -#endif - *p_end++ = value; - } - - //************************************************************************* - /// Removes an element from the end of the vector. - /// Does nothing if the vector is empty. - //************************************************************************* - void pop_back() - { -#if defined(ETL_CHECK_PUSH_POP) - ETL_ASSERT(size() > 0, ETL_ERROR(vector_empty)); -#endif - --p_end; - } - - //********************************************************************* - /// Inserts a value to the vector. - /// If asserts or exceptions are enabled, emits vector_full if the vector is already full. - ///\param position The position to insert before. - ///\param value The value to insert. - //********************************************************************* - iterator insert(iterator position, value_type value) - { - ETL_ASSERT(size() + 1 <= CAPACITY, ETL_ERROR(vector_full)); - - if (position != end()) - { - ++p_end; - std::copy_backward(position, end() - 1, end()); - *position = value; - } - else - { - *p_end++ = value; - } - - return position; - } - - //********************************************************************* - /// Inserts 'n' values to the vector. - /// If asserts or exceptions are enabled, emits vector_full if the vector does not have enough free space. - ///\param position The position to insert before. - ///\param n The number of elements to add. - ///\param value The value to insert. - //********************************************************************* - void insert(iterator position, size_t n, value_type value) - { - ETL_ASSERT((size() + 1) <= CAPACITY, ETL_ERROR(vector_full)); - - std::copy_backward(position, p_end, p_end + n); - std::fill_n(position, n, value); - - p_end += n; - } + iterator insert(iterator position, value_type value); + void insert(iterator position, size_t n, value_type value); //********************************************************************* /// Inserts a range of values to the vector. @@ -463,117 +165,26 @@ namespace etl p_end += count; } - //********************************************************************* - /// Erases an element. - ///\param i_element Iterator to the element. - ///\return An iterator pointing to the element that followed the erased element. - //********************************************************************* - iterator erase(iterator i_element) - { - std::copy(i_element + 1, end(), i_element); - --p_end; + iterator erase(iterator i_element); + iterator erase(iterator first, iterator last); - return i_element; - } + pvoidvector& operator = (const pvoidvector& rhs); - //********************************************************************* - /// Erases a range of elements. - /// The range includes all the elements between first and last, including the - /// element pointed by first, but not the one pointed by last. - ///\param first Iterator to the first element. - ///\param last Iterator to the last element. - ///\return An iterator pointing to the element that followed the erased element. - //********************************************************************* - iterator erase(iterator first, iterator last) - { - std::copy(last, end(), first); - size_t n_delete = std::distance(first, last); + size_type size() const; - // Just adjust the count. - p_end -= n_delete; + bool empty() const; - return first; - } + bool full() const; - //************************************************************************* - /// Assignment operator. - //************************************************************************* - pvoidvector& operator = (const pvoidvector& rhs) - { - if (&rhs != this) - { - assign(rhs.cbegin(), rhs.cend()); - } - - return *this; - } - - //************************************************************************* - /// Gets the current size of the vector. - ///\return The current size of the vector. - //************************************************************************* - size_type size() const - { - return size_t(p_end - p_buffer); - } - - //************************************************************************* - /// Checks the 'empty' state of the vector. - ///\return true if empty. - //************************************************************************* - bool empty() const - { - return (p_end == p_buffer); - } - - //************************************************************************* - /// Checks the 'full' state of the vector. - ///\return true if full. - //************************************************************************* - bool full() const - { - return size() == CAPACITY; - } - - //************************************************************************* - /// Returns the remaining capacity. - ///\return The remaining capacity. - //************************************************************************* - size_t available() const - { - return max_size() - size(); - } + size_t available() const; protected: - //********************************************************************* - /// Constructor. - //********************************************************************* - pvoidvector(void** p_buffer_, size_t MAX_SIZE) - : vector_base(MAX_SIZE), - p_buffer(p_buffer_), - p_end(p_buffer_) - { - } + pvoidvector(void** p_buffer_, size_t MAX_SIZE); - //********************************************************************* - /// Initialise the vector. - //********************************************************************* - void initialise() - { - p_end = p_buffer; - } + void initialise(); - //************************************************************************* - /// Fix the internal pointers after a low level memory copy. - //************************************************************************* - void repair(void** p_buffer_) - { - uintptr_t length = p_end - p_buffer; - - p_buffer = p_buffer_; - p_end = p_buffer_ + length; - } + void repair(void** p_buffer_); void** p_buffer; void** p_end; diff --git a/src/private/pvoidvector.cpp b/src/private/pvoidvector.cpp index 5b000adf..527abfbe 100644 --- a/src/private/pvoidvector.cpp +++ b/src/private/pvoidvector.cpp @@ -31,6 +31,462 @@ SOFTWARE. #include "../../include/etl/platform.h" #include "../../include/etl/private/pvoidvector.h" +//********************************************************************* +/// Returns an iterator to the beginning of the vector. +///\return An iterator to the beginning of the vector. +//********************************************************************* +etl::pvoidvector::iterator etl::pvoidvector::begin() +{ + return p_buffer; +} + +//********************************************************************* +/// Returns a const_iterator to the beginning of the vector. +///\return A const iterator to the beginning of the vector. +//********************************************************************* +etl::pvoidvector::const_iterator etl::pvoidvector::begin() const +{ + return const_iterator(p_buffer); +} + +//********************************************************************* +/// Returns an iterator to the end of the vector. +///\return An iterator to the end of the vector. +//********************************************************************* +etl::pvoidvector::iterator etl::pvoidvector::end() +{ + return p_end; +} + +//********************************************************************* +/// Returns a const_iterator to the end of the vector. +///\return A const iterator to the end of the vector. +//********************************************************************* +etl::pvoidvector::const_iterator etl::pvoidvector::end() const +{ + return const_iterator(p_end); +} + +//********************************************************************* +/// Returns a const_iterator to the beginning of the vector. +///\return A const iterator to the beginning of the vector. +//********************************************************************* +etl::pvoidvector::const_iterator etl::pvoidvector::cbegin() const +{ + return const_iterator(p_buffer); +} + +//********************************************************************* +/// Returns a const_iterator to the end of the vector. +///\return A const iterator to the end of the vector. +//********************************************************************* +etl::pvoidvector::const_iterator etl::pvoidvector::cend() const +{ + return const_iterator(p_end); +} + +//********************************************************************* +/// Returns an reverse iterator to the reverse beginning of the vector. +///\return Iterator to the reverse beginning of the vector. +//********************************************************************* +etl::pvoidvector::reverse_iterator etl::pvoidvector::rbegin() +{ + return reverse_iterator(end()); +} + +//********************************************************************* +/// Returns a const reverse iterator to the reverse beginning of the vector. +///\return Const iterator to the reverse beginning of the vector. +//********************************************************************* +etl::pvoidvector::const_reverse_iterator etl::pvoidvector::rbegin() const +{ + return const_reverse_iterator(end()); +} + +//********************************************************************* +/// Returns a reverse iterator to the end + 1 of the vector. +///\return Reverse iterator to the end + 1 of the vector. +//********************************************************************* +etl::pvoidvector::reverse_iterator etl::pvoidvector::rend() +{ + return reverse_iterator(begin()); +} + +//********************************************************************* +/// Returns a const reverse iterator to the end + 1 of the vector. +///\return Const reverse iterator to the end + 1 of the vector. +//********************************************************************* +etl::pvoidvector::const_reverse_iterator etl::pvoidvector::rend() const +{ + return const_reverse_iterator(begin()); +} + +//********************************************************************* +/// Returns a const reverse iterator to the reverse beginning of the vector. +///\return Const reverse iterator to the reverse beginning of the vector. +//********************************************************************* +etl::pvoidvector::const_reverse_iterator etl::pvoidvector::crbegin() const +{ + return const_reverse_iterator(cend()); +} + +//********************************************************************* +/// Returns a const reverse iterator to the end + 1 of the vector. +///\return Const reverse iterator to the end + 1 of the vector. +//********************************************************************* +etl::pvoidvector::const_reverse_iterator etl::pvoidvector::crend() const +{ + return const_reverse_iterator(cbegin()); +} + +//********************************************************************* +/// Resizes the vector. +/// If asserts or exceptions are enabled and the new size is larger than the +/// maximum then a vector_full is thrown. +///\param new_size The new size. +//********************************************************************* +void etl::pvoidvector::resize(size_t new_size) +{ + ETL_ASSERT(new_size <= CAPACITY, ETL_ERROR(vector_full)); + + p_end = p_buffer + new_size; +} + +//********************************************************************* +/// Resizes the vector. +/// If asserts or exceptions are enabled and the new size is larger than the +/// maximum then a vector_full is thrown. +///\param new_size The new size. +///\param value The value to fill new elements with. Default = default constructed value. +//********************************************************************* +void etl::pvoidvector::resize(size_t new_size, etl::pvoidvector::value_type value) +{ + ETL_ASSERT(new_size <= CAPACITY, ETL_ERROR(vector_full)); + + pointer p_new_end = p_buffer + new_size; + + // Size up if necessary. + if (p_end < p_new_end) + { + std::fill(p_end, p_new_end, value); + } + + p_end = p_new_end; +} + +//********************************************************************* +/// Returns a reference to the value at index 'i' +///\param i The index. +///\return A reference to the value at index 'i' +//********************************************************************* +etl::pvoidvector::reference etl::pvoidvector::operator [](size_t i) +{ + return p_buffer[i]; +} + +//********************************************************************* +/// Returns a const reference to the value at index 'i' +///\param i The index. +///\return A const reference to the value at index 'i' +//********************************************************************* +etl::pvoidvector::const_reference etl::pvoidvector::operator [](size_t i) const +{ + return const_reference(p_buffer[i]); +} + +//********************************************************************* +/// Returns a reference to the value at index 'i' +/// If asserts or exceptions are enabled, emits an etl::vector_out_of_bounds if the index is out of range. +///\param i The index. +///\return A reference to the value at index 'i' +//********************************************************************* +etl::pvoidvector::reference etl::pvoidvector::at(size_t i) +{ + ETL_ASSERT(i < size(), ETL_ERROR(vector_out_of_bounds)); + return p_buffer[i]; +} + +//********************************************************************* +/// Returns a const reference to the value at index 'i' +/// If asserts or exceptions are enabled, emits an etl::vector_out_of_bounds if the index is out of range. +///\param i The index. +///\return A const reference to the value at index 'i' +//********************************************************************* +etl::pvoidvector::const_reference etl::pvoidvector::at(size_t i) const +{ + ETL_ASSERT(i < size(), ETL_ERROR(vector_out_of_bounds)); + return const_reference(p_buffer[i]); +} + +//********************************************************************* +/// Returns a reference to the first element. +///\return A reference to the first element. +//********************************************************************* +etl::pvoidvector::reference etl::pvoidvector::front() +{ + return p_buffer[0]; +} + +//********************************************************************* +/// Returns a const reference to the first element. +///\return A const reference to the first element. +//********************************************************************* +etl::pvoidvector::const_reference etl::pvoidvector::front() const +{ + return const_reference(p_buffer[0]); +} + +//********************************************************************* +/// Returns a reference to the last element. +///\return A reference to the last element. +//********************************************************************* +etl::pvoidvector::reference etl::pvoidvector::back() +{ + return *(p_end - 1); +} + +//********************************************************************* +/// Returns a const reference to the last element. +///\return A const reference to the last element. +//********************************************************************* +etl::pvoidvector::const_reference etl::pvoidvector::back() const +{ + return const_reference(*(p_end - 1)); +} + +//********************************************************************* +/// Returns a pointer to the beginning of the vector data. +///\return A pointer to the beginning of the vector data. +//********************************************************************* +etl::pvoidvector::pointer etl::pvoidvector::data() +{ + return p_buffer; +} + +//********************************************************************* +/// Returns a const pointer to the beginning of the vector data. +///\return A const pointer to the beginning of the vector data. +//********************************************************************* +etl::pvoidvector::const_pointer etl::pvoidvector::data() const +{ + return const_pointer(p_buffer); +} + +//********************************************************************* +/// Assigns values to the vector. +/// If asserts or exceptions are enabled, emits vector_full if the vector does not have enough free space. +///\param n The number of elements to add. +///\param value The value to insert for each element. +//********************************************************************* +void etl::pvoidvector::assign(size_t n, etl::pvoidvector::value_type value) +{ + initialise(); + + ETL_ASSERT(n <= CAPACITY, ETL_ERROR(vector_full)); + + for (size_t current_size = 0; current_size < n; ++current_size) + { + *p_end++ = value; + } +} + +//************************************************************************* +/// Clears the vector. +//************************************************************************* +void etl::pvoidvector::clear() +{ + initialise(); +} + +//************************************************************************* +/// Increases the size of the vector by one, but does not initialise the new element. +/// If asserts or exceptions are enabled, throws a vector_full if the vector is already full. +//************************************************************************* +void etl::pvoidvector::push_back() +{ +#if defined(ETL_CHECK_PUSH_POP) + ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full)); +#endif + + ++p_end; +} + +//********************************************************************* +/// Inserts a value at the end of the vector. +/// If asserts or exceptions are enabled, emits vector_full if the vector is already full. +///\param value The value to add. +//********************************************************************* +void etl::pvoidvector::push_back(etl::pvoidvector::value_type value) +{ +#if defined(ETL_CHECK_PUSH_POP) + ETL_ASSERT(size() != CAPACITY, ETL_ERROR(vector_full)); +#endif + *p_end++ = value; +} + +//************************************************************************* +/// Removes an element from the end of the vector. +/// Does nothing if the vector is empty. +//************************************************************************* +void etl::pvoidvector::pop_back() +{ +#if defined(ETL_CHECK_PUSH_POP) + ETL_ASSERT(size() > 0, ETL_ERROR(vector_empty)); +#endif + --p_end; +} + +//********************************************************************* +/// Inserts a value to the vector. +/// If asserts or exceptions are enabled, emits vector_full if the vector is already full. +///\param position The position to insert before. +///\param value The value to insert. +//********************************************************************* +etl::pvoidvector::iterator etl::pvoidvector::insert(etl::pvoidvector::iterator position, etl::pvoidvector::value_type value) +{ + ETL_ASSERT(size() + 1 <= CAPACITY, ETL_ERROR(vector_full)); + + if (position != end()) + { + ++p_end; + std::copy_backward(position, end() - 1, end()); + *position = value; + } + else + { + *p_end++ = value; + } + + return position; +} + +//********************************************************************* +/// Inserts 'n' values to the vector. +/// If asserts or exceptions are enabled, emits vector_full if the vector does not have enough free space. +///\param position The position to insert before. +///\param n The number of elements to add. +///\param value The value to insert. +//********************************************************************* +void etl::pvoidvector::insert(etl::pvoidvector::iterator position, size_t n, etl::pvoidvector::value_type value) +{ + ETL_ASSERT((size() + 1) <= CAPACITY, ETL_ERROR(vector_full)); + + std::copy_backward(position, p_end, p_end + n); + std::fill_n(position, n, value); + + p_end += n; +} + +//********************************************************************* +/// Erases an element. +///\param i_element Iterator to the element. +///\return An iterator pointing to the element that followed the erased element. +//********************************************************************* +etl::pvoidvector::iterator etl::pvoidvector::erase(etl::pvoidvector::iterator i_element) +{ + std::copy(i_element + 1, end(), i_element); + --p_end; + + return i_element; +} + +//********************************************************************* +/// Erases a range of elements. +/// The range includes all the elements between first and last, including the +/// element pointed by first, but not the one pointed by last. +///\param first Iterator to the first element. +///\param last Iterator to the last element. +///\return An iterator pointing to the element that followed the erased element. +//********************************************************************* +etl::pvoidvector::iterator etl::pvoidvector::erase(etl::pvoidvector::iterator first, etl::pvoidvector::iterator last) +{ + std::copy(last, end(), first); + size_t n_delete = std::distance(first, last); + + // Just adjust the count. + p_end -= n_delete; + + return first; +} + +//************************************************************************* +/// Assignment operator. +//************************************************************************* +etl::pvoidvector& etl::pvoidvector::operator = (const etl::pvoidvector& rhs) +{ + if (&rhs != this) + { + assign(rhs.cbegin(), rhs.cend()); + } + + return *this; +} + +//************************************************************************* +/// Gets the current size of the vector. +///\return The current size of the vector. +//************************************************************************* +etl::pvoidvector::size_type etl::pvoidvector::size() const +{ + return size_t(p_end - p_buffer); +} + +//************************************************************************* +/// Checks the 'empty' state of the vector. +///\return true if empty. +//************************************************************************* +bool etl::pvoidvector::empty() const +{ + return (p_end == p_buffer); +} + +//************************************************************************* +/// Checks the 'full' state of the vector. +///\return true if full. +//************************************************************************* +bool etl::pvoidvector::full() const +{ + return size() == CAPACITY; +} + +//************************************************************************* +/// Returns the remaining capacity. +///\return The remaining capacity. +//************************************************************************* +size_t etl::pvoidvector::available() const +{ + return max_size() - size(); +} + +//********************************************************************* +/// Constructor. +//********************************************************************* +etl::pvoidvector::pvoidvector(void** p_buffer_, size_t MAX_SIZE) + : vector_base(MAX_SIZE), + p_buffer(p_buffer_), + p_end(p_buffer_) +{ +} + +//********************************************************************* +/// Initialise the vector. +//********************************************************************* +void etl::pvoidvector::initialise() +{ + p_end = p_buffer; +} + +//************************************************************************* +/// Fix the internal pointers after a low level memory copy. +//************************************************************************* +void etl::pvoidvector::repair(void** p_buffer_) +{ + uintptr_t length = p_end - p_buffer; + + p_buffer = p_buffer_; + p_end = p_buffer_ + length; +} + namespace etl { //***************************************************************************