/* * Container.h Step 6, Iterators. */ #ifndef CONTAINER_H #define CONTAINER_H #include #include template class Container { public: using value_type = T; using pointer = value_type*; using const_pointer = const value_type*; using reference = value_type&; using const_reference = const value_type&; using size_type = std::size_t; using iterator = value_type*; // added using const_iterator = const value_type*; // added using reverse_iterator = std::reverse_iterator; // added using const_reverse_iterator = std::reverse_iterator; // added using difference_type = std::ptrdiff_t; // added Container() noexcept = default; explicit Container(const size_type n); Container(const Container&); Container(Container&&) noexcept; ~Container(); Container& operator=(const Container&) &; Container& operator=(Container&&) & noexcept; size_type size() const noexcept; size_type max_size() const noexcept; size_type capacity() const noexcept; bool empty() const noexcept; void clear() noexcept; void push_back(const_reference); reference back(); const_reference back() const; void pop_back() noexcept; void swap(Container&) noexcept; iterator begin() noexcept; // added const_iterator begin() const noexcept; // added iterator end() noexcept; // added const_iterator end() const noexcept; // added reverse_iterator rbegin() noexcept; // added const_reverse_iterator rbegin() const noexcept; // added reverse_iterator rend() noexcept; // added const_reverse_iterator rend() const noexcept; // added const_iterator cbegin() const noexcept; // added const_iterator cend() const noexcept; // added const_reverse_iterator crbegin() const noexcept; // added const_reverse_iterator crend() const noexcept; // added private: pointer start_{ nullptr }; pointer finish_{ nullptr }; pointer end_of_storage_{ nullptr }; size_type compute_capacity_() const; T* allocate_(size_type); void deallocate_(pointer); T* allocate_and_copy_(const Container&); void resize_(const_reference); }; template void swap(Container&, Container&) noexcept; #include "Container.tcc" #endif