diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-07-24 08:49:44 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-07-24 08:49:44 +0200 |
commit | a635e62e6a99dbd732ea2fda1422d9179512e0f6 (patch) | |
tree | 711b95e28c83fab628ddd0e35b082d49da8f0130 | |
parent | 93489fbc4c3bee24262e7d9240fa307454ed2a05 (diff) | |
download | serenity-a635e62e6a99dbd732ea2fda1422d9179512e0f6.zip |
AK: Add NonnullOwnPtrVector.
This works just like NonnullRefPtr, except for NonnullOwnPtr's instead.
NonnullOwnPtrVector<T> inherits from Vector<NonnullOwnPtr<T>>, and adds some
comforts on top, like making accessors return T& so we can chase dots (.)
instead of arrows (->) :^)
-rw-r--r-- | AK/NonnullOwnPtrVector.h | 48 |
1 files changed, 48 insertions, 0 deletions
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 <AK/NonnullOwnPtr.h> +#include <AK/Vector.h> + +namespace AK { + +template<typename T, int inline_capacity = 0> +class NonnullOwnPtrVector : public Vector<NonnullOwnPtr<T>, inline_capacity> { + typedef Vector<NonnullOwnPtr<T>, inline_capacity> Base; + +public: + NonnullOwnPtrVector() + { + } + + NonnullOwnPtrVector(Vector<NonnullOwnPtr<T>>&& other) + : Base(static_cast<Base&&>(other)) + { + } + NonnullOwnPtrVector(const Vector<NonnullOwnPtr<T>>& other) + : Base(static_cast<const Base&>(other)) + { + } + + using Base::size; + + using Iterator = VectorIterator<NonnullOwnPtrVector, T>; + Iterator begin() { return Iterator(*this, 0); } + Iterator end() { return Iterator(*this, size()); } + + using ConstIterator = VectorIterator<const NonnullOwnPtrVector, const T>; + 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; |