From a635e62e6a99dbd732ea2fda1422d9179512e0f6 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 24 Jul 2019 08:49:44 +0200 Subject: [PATCH] AK: Add NonnullOwnPtrVector. This works just like NonnullRefPtr, except for NonnullOwnPtr's instead. NonnullOwnPtrVector inherits from Vector>, and adds some comforts on top, like making accessors return T& so we can chase dots (.) instead of arrows (->) :^) --- AK/NonnullOwnPtrVector.h | 48 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 AK/NonnullOwnPtrVector.h diff --git a/AK/NonnullOwnPtrVector.h b/AK/NonnullOwnPtrVector.h new file mode 100644 index 0000000000..358f80679f --- /dev/null +++ b/AK/NonnullOwnPtrVector.h @@ -0,0 +1,48 @@ +#pragma once + +#include +#include + +namespace AK { + +template +class NonnullOwnPtrVector : public Vector, inline_capacity> { + typedef Vector, inline_capacity> Base; + +public: + NonnullOwnPtrVector() + { + } + + NonnullOwnPtrVector(Vector>&& other) + : Base(static_cast(other)) + { + } + NonnullOwnPtrVector(const Vector>& other) + : Base(static_cast(other)) + { + } + + using Base::size; + + using Iterator = VectorIterator; + Iterator begin() { return Iterator(*this, 0); } + Iterator end() { return Iterator(*this, size()); } + + using ConstIterator = VectorIterator; + ConstIterator begin() const { return ConstIterator(*this, 0); } + ConstIterator end() const { return ConstIterator(*this, size()); } + + T& at(int index) { return *Base::at(index); } + const T& at(int index) const { return *Base::at(index); } + T& operator[](int index) { return at(index); } + const T& operator[](int index) const { return at(index); } + T& first() { return at(0); } + const T& first() const { return at(0); } + T& last() { return at(size() - 1); } + const T& last() const { return at(size() - 1); } +}; + +} + +using AK::NonnullOwnPtrVector;