diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-07-25 11:00:26 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-07-25 11:00:26 +0200 |
commit | 10d120dc852fce62eb11ec5ec80f68374ef01501 (patch) | |
tree | 0e45b64fdc01a63d592ac096118683fd79831174 /AK/NonnullPtrVector.h | |
parent | 7c3b2e0728b79ddba661cbf1ac61f5da382460ce (diff) | |
download | serenity-10d120dc852fce62eb11ec5ec80f68374ef01501.zip |
AK: Share code between NonnullOwnPtrVector and NonnullRefPtrVector.
These can just inherit from a shared base template. Thanks to Robin for the
sweet idea :^)
Diffstat (limited to 'AK/NonnullPtrVector.h')
-rw-r--r-- | AK/NonnullPtrVector.h | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/AK/NonnullPtrVector.h b/AK/NonnullPtrVector.h new file mode 100644 index 0000000000..345da11e08 --- /dev/null +++ b/AK/NonnullPtrVector.h @@ -0,0 +1,51 @@ +#pragma once + +#include <AK/Vector.h> + +namespace AK { + +template<typename PtrType, typename T, int inline_capacity = 0> +class NonnullPtrVector : public Vector<PtrType, inline_capacity> { + typedef Vector<PtrType, inline_capacity> Base; + +public: + NonnullPtrVector() + { + } + + NonnullPtrVector(Vector<PtrType>&& other) + : Base(static_cast<Base&&>(other)) + { + } + NonnullPtrVector(const Vector<PtrType>& other) + : Base(static_cast<const Base&>(other)) + { + } + + using Base::size; + + using Iterator = VectorIterator<NonnullPtrVector, T>; + Iterator begin() { return Iterator(*this, 0); } + Iterator end() { return Iterator(*this, size()); } + + using ConstIterator = VectorIterator<const NonnullPtrVector, 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); } + +private: + // NOTE: You can't use resize() on a NonnullFooPtrVector since making the vector + // bigger would require being able to default-construct NonnullFooPtrs. + // Instead, use shrink(new_size). + void resize(int) = delete; +}; + +} |