From 2115cc39be111526dbcba92f2d595b051f7f4220 Mon Sep 17 00:00:00 2001 From: Patrick Date: Sat, 27 Jan 2024 16:54:03 +0100 Subject: [PATCH] started implementing const_list as static list --- include/const_list.h | 71 +++++++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 20 deletions(-) diff --git a/include/const_list.h b/include/const_list.h index 0417f28..4e560fa 100644 --- a/include/const_list.h +++ b/include/const_list.h @@ -69,45 +69,41 @@ namespace cc { constexpr _const_const_list_iterator operator--(int) & noexcept override { auto tmp = *this; _Base::_curr == _Base::_curr->_prev; return tmp; } }; - template - requires std::derived_from> + template + requires std::derived_from> class const_list { public: - using value_type = node; + using value_type = Node; using size_type = std::size_t; using difference_type = std::ptrdiff_t; using reference = value_type&; using const_reference = const value_type&; using pointer = value_type *; using const_pointer = const value_type *; - using iterator = _const_list_iterator; - using const_iterator = _const_const_list_iterator; + using iterator = _const_list_iterator; + using const_iterator = _const_const_list_iterator; using reverse_iterator = std::reverse_iterator; using const_reverse_iterator = std::reverse_iterator; private: - node *_start = nullptr; - node *_end = nullptr; + Node *_start = nullptr; + Node *_end = nullptr; std::size_t _size = 0; public: constexpr const_list() noexcept = default; - constexpr explicit const_list(size_type count) noexcept; - constexpr const_list(size_type count, const value_type& value) noexcept; - template - constexpr const_list(InputIt first, InputIt last); - constexpr const_list(const const_list& other) noexcept; + constexpr const_list(const const_list&) = delete; constexpr const_list(const_list&& other) noexcept; - constexpr const_list(std::initializer_list init) noexcept; + constexpr const_list(std::initializer_list> init) noexcept; constexpr ~const_list(); constexpr const_list& operator=(const const_list& other); constexpr const_list& operator=(const_list&& other); - constexpr const_list& operator=(std::initializer_list init); + constexpr const_list& operator=(std::initializer_list init); constexpr void assign(size_type count, const value_type& value) noexcept; template @@ -213,16 +209,12 @@ namespace cc { const_list_node *_next = nullptr; const_list *_owner = nullptr; - virtual ~const_list_node(); + virtual constexpr ~const_list_node(); friend class const_list; friend class _const_list_iterator_base; }; - - template - const_list(InputIt, InputIt) -> const_list::value_type>; - template constexpr bool operator==(const const_list& lhs, const const_list& rhs) @@ -256,9 +248,48 @@ namespace cc { c.remove_if(pred); } + template + requires std::derived_from> + constexpr const_list::const_list(const_list &&other) noexcept + : _start(other._start), _end(other._end), _size(other._size) + { + for (auto node : other) { + node._owner = this; + } + other._size = 0; + other._start = nullptr; + other._end = nullptr; + } + + template + requires std::derived_from> + constexpr const_list::const_list(std::initializer_list> init) noexcept + : _start(std::addressof(*init.begin())), + _end(std::addressof(*(--init.begin()))), + _size(init.size()) + { + auto prev = init.begin(); + prev->get()._owner = this; + for (auto it = ++init.begin(); it != init.end(); ++it) { + prev->get()._next = std::addressof(it->get()); + it->get()._prev = std::addressof(prev->get()); + it->get()._owner = this; + + prev = it; + } + } + + template + requires std::derived_from> + constexpr const_list::~const_list() + { + clear(); + } + template - const_list_node::~const_list_node() { + constexpr const_list_node::~const_list_node() + { _owner->remove(*this); }