From 75effffb1fa951e4e87a544067a60bacbb5588e4 Mon Sep 17 00:00:00 2001 From: jyxiong Date: Wed, 1 Oct 2025 11:44:42 +0000 Subject: [PATCH] feat(deque): declare class deque --- source/tinystl/container/deque.h | 154 +++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/source/tinystl/container/deque.h b/source/tinystl/container/deque.h index fb208d5..edb28ea 100644 --- a/source/tinystl/container/deque.h +++ b/source/tinystl/container/deque.h @@ -197,4 +197,158 @@ struct segmented_iterator_traits> +class deque { + using alloc_traits = std::allocator_traits; + +public: + using value_type = T; + using allocator_type = Alloc; + using size_type = typename alloc_traits::size_type; + using difference_type = typename alloc_traits::difference_type; + using reference = T &; + using const_reference = const T &; + using pointer = typename alloc_traits::pointer; + using const_pointer = typename alloc_traits::const_pointer; + + using pointer_allocator = alloc_traits::template rebind_alloc; + using map_alloc_traits = std::allocator_traits; + using map_pointer = typename map_alloc_traits::pointer; + + using iterator = deque_iterator< + value_type, pointer, reference, map_pointer, difference_type>; + using const_iterator = deque_iterator; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + // construct/copy/destroy + deque(); + explicit deque(const Alloc &alloc); + explicit deque(size_type n, const Alloc &alloc = Alloc()); + deque(size_type n, const_reference val, const Alloc &alloc = Alloc()); + template + deque(InputIt first, InputIt last, const Alloc &alloc = Alloc()); + deque(const deque &other); + deque(const deque &other, const Alloc &alloc); + deque(deque &&other) noexcept; + deque(deque &&other, const Alloc &alloc); + deque(std::initializer_list init, const Alloc &alloc = Alloc()); + + ~deque(); + + deque &operator=(const deque &other); + deque &operator=(deque &&other); + deque &operator=(std::initializer_list init); + + void assign(size_type n, const_reference val); + template + void assign(InputIt first, InputIt last); + void assign(std::initializer_list ilist); + + allocator_type get_allocator() const; + + // element access + reference at(size_type pos); + const_reference at(size_type pos) const; + reference operator[](size_type pos); + const_reference operator[](size_type pos) const; + reference front(); + const_reference front() const; + reference back(); + const_reference back() const; + + // iterators + iterator begin() noexcept; + const_iterator begin() const noexcept; + const_iterator cbegin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + const_iterator cend() const noexcept; + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + const_reverse_iterator crbegin() const noexcept; + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + const_reverse_iterator crend() const noexcept; + + // capacity + bool empty() const noexcept; + size_type size() const noexcept; + size_type max_size() const noexcept; + void shrink_to_fit(); + + // modifiers + void clear() noexcept; + iterator insert(const_iterator pos, const_reference val); + iterator insert(const_iterator pos, value_type &&val); + iterator insert(const_iterator pos, size_type n, const_reference val); + template + requires std::constructible_from> + iterator insert(const_iterator pos, ForwardIter first, ForwardIter last); + template + requires std::constructible_from> && + (!std::forward_iterator) + iterator insert(const_iterator pos, InputIter first, InputIter last); + iterator insert(const_iterator pos, std::initializer_list init); + template + iterator emplace(const_iterator pos, Args &&...args); + iterator erase(const_iterator pos); + iterator erase(const_iterator first, const_iterator last); + void push_back(const_reference val); + void push_back(value_type &&val); + template + reference emplace_back(Args &&...args); + void pop_back(); + void push_front(const_reference val); + void push_front(value_type &&val); + template + reference emplace_front(Args &&...args); + void pop_front(); + void resize(size_type n); + void resize(size_type n, const_reference val); + void swap(deque &other) noexcept(alloc_traits::is_always_equal::value); + +private: + void throw_length_error(); + void throw_out_of_range(); + + size_type recommend(size_type new_size); + + void allocate(size_type n); + + void deallocate(); + + void construct(size_type n); + void construct(size_type n, const_reference val); + template + void construct(InputIter first, Sentinel last, size_type n); + + void destruct(pointer new_last); + + void move_to_insert(pointer first, pointer last, pointer dst_first); + +private: + Alloc m_alloc; + pointer m_begin = nullptr; + pointer m_end = nullptr; + pointer m_cap = nullptr; +}; + +template +bool operator==(const deque &lhs, const deque &rhs); + +template +auto operator<=>(const deque &lhs, const deque &rhs); + +template +void swap(deque &lhs, deque &rhs) noexcept( + noexcept(lhs.swap(rhs)) +); + +template +typename deque::size_type erase(vector &c, const U &val); + +template +typename deque::size_type erase_if(deque &c, Pred pred); + } // namespace tinystl \ No newline at end of file