#pragma once #include namespace AK { template class NonnullPtrVector : public Vector { typedef typename PtrType::ElementType T; typedef Vector Base; public: NonnullPtrVector() { } NonnullPtrVector(Vector&& other) : Base(static_cast(other)) { } NonnullPtrVector(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()); } PtrType& ptr_at(int index) { return Base::at(index); } const PtrType& ptr_at(int index) const { return Base::at(index); } 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; }; }