#pragma once #include #include namespace AK { template class NonnullRefPtrVector : public Vector, inline_capacity> { typedef Vector, inline_capacity> Base; public: NonnullRefPtrVector() { } NonnullRefPtrVector(Vector>&& other) : Base(static_cast(other)) { } NonnullRefPtrVector(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); } private: // NOTE: You can't use resize() on a NonnullRefPtrVector since making the vector // bigger would require being able to default-construct NonnullRefPtrs. // Instead, use shrink(new_size). void resize(int) = delete; }; } using AK::NonnullRefPtrVector;