diff --git a/source/tinystl/container/vector.h b/source/tinystl/container/vector.h index 3d39434..ee93ebb 100644 --- a/source/tinystl/container/vector.h +++ b/source/tinystl/container/vector.h @@ -625,6 +625,117 @@ void vector::shrink_to_fit() { } } +/* -------------------------------- modifiers ------------------------------- */ +template +void vector::clear() noexcept { + this->destruct(m_begin); +} + +template +typename vector::iterator +vector::insert(const_iterator pos, const_reference val) { + size_type offset = static_cast(std::distance(this->begin(), pos)); + pointer p = m_begin + offset; + if (m_end < m_cap) { + if (p == m_end) { + this->construct(1, val); + } else { + alloc_traits::consturct(m_alloc, m_end, std::move(*(m_end - 1))); + ++m_end; + std::move_backward(p, m_end - 2, m_end - 1); + *p = val; + } + return iterator(p); + } else { + size_type sz = this->recommend(this->size() + 1); + pointer new_begin = alloc_traits::allocate(m_alloc, sz); + pointer new_end = new_begin; + pointer new_cap = new_begin + sz; + + if constexpr (std::is_nothrow_move_constructible_v) { + new_end = std::uninitialized_move(m_begin, p, new_begin); + } else { + new_end = std::uninitialized_copy(m_begin, p, new_begin); + } + + alloc_traits::construct(m_alloc, new_end, val); + ++new_end; + + if constexpr (std::is_nothrow_move_constructible_v) { + new_end = std::uninitialized_move(p, m_end, new_end); + } else { + new_end = std::uninitialized_copy(p, m_end, new_end); + } + + this->destruct(m_begin); + this->deallocate(); + + m_begin = new_begin; + m_end = new_end; + m_cap = new_cap; + + return iterator(m_begin + offset); + } +} + +template +typename vector::iterator +vector::insert(const_iterator pos, value_type &&val) { + size_type offset = static_cast(std::distance(this->begin(), pos)); + pointer p = m_begin + offset; + if (m_end < m_cap) { + if (p == m_end) { + alloc_traits::construct(m_alloc, p, std::move(val)); + ++m_end; + } else { + alloc_traits::construct(m_alloc, m_end, std::move(*(m_end - 1))); + ++m_end; + std::move_backward(p, m_end - 2, m_end - 1); + *p = std::move(val); + } + return iterator(p); + } else { + size_type sz = this->recommend(this->size() + 1); + pointer new_begin = alloc_traits::allocate(m_alloc, sz); + pointer new_end = new_begin; + pointer new_cap = new_begin + sz; + + if constexpr (std::is_nothrow_move_constructible_v) { + new_end = std::uninitialized_move(m_begin, p, new_begin); + } else { + new_end = std::uninitialized_copy(m_begin, p, new_begin); + } + + alloc_traits::construct(m_alloc, new_end, std::move(val)); + ++new_end; + + if constexpr (std::is_nothrow_move_constructible_v) { + new_end = std::uninitialized_move(p, m_end, new_end); + } else { + new_end = std::uninitialized_copy(p, m_end, new_end); + } + + this->destruct(m_begin); + this->deallocate(); + + m_begin = new_begin; + m_end = new_end; + m_cap = new_cap; + + return iterator(m_begin + offset); + } +} + +template +typename vector::iterator +vector::insert(const_iterator pos, size_type n, const_reference val) { +} + +template +template +typename vector::iterator +vector::insert(const_iterator pos, InputIter first, InputIter last) {} + /* -------------------------------------------------------------------------- */ /* private member functions */ /* -------------------------------------------------------------------------- */