BLI: Add "first" method to MutableSpan and Vector

This is convenient because having a uniform interface is nice, and
because of the similarity to "last".

Differential Revision: https://developer.blender.org/D11076
This commit is contained in:
Hans Goudey 2021-04-25 15:06:38 -05:00
parent 20142b0823
commit 16b2b33d01
2 changed files with 27 additions and 2 deletions

View File

@ -661,6 +661,16 @@ template<typename T> class MutableSpan {
return IndexRange(size_);
}
/**
* Return a reference to the first element in the array. This invokes undefined behavior when the
* array is empty.
*/
constexpr T &first() const
{
BLI_assert(size_ > 0);
return data_[0];
}
/**
* Returns a reference to the last element. This invokes undefined behavior when the array is
* empty.

View File

@ -444,7 +444,7 @@ class Vector {
this->append_as(std::move(value));
}
/* This is similar to `std::vector::emplace_back`. */
template<typename... ForwardValue> void append_as(ForwardValue &&... value)
template<typename... ForwardValue> void append_as(ForwardValue &&...value)
{
this->ensure_space_for_one();
this->append_unchecked_as(std::forward<ForwardValue>(value)...);
@ -486,7 +486,7 @@ class Vector {
{
this->append_unchecked_as(std::move(value));
}
template<typename... ForwardT> void append_unchecked_as(ForwardT &&... value)
template<typename... ForwardT> void append_unchecked_as(ForwardT &&...value)
{
BLI_assert(end_ < capacity_end_);
new (end_) T(std::forward<ForwardT>(value)...);
@ -668,6 +668,21 @@ class Vector {
return *(end_ - 1);
}
/**
* Return a reference to the first element in the vector.
* This invokes undefined behavior when the vector is empty.
*/
const T &first() const
{
BLI_assert(this->size() > 0);
return *begin_;
}
T &first()
{
BLI_assert(this->size() > 0);
return *begin_;
}
/**
* Return how many values are currently stored in the vector.
*/