From 1a6aea9ca3095203891631dce6df29ba515b212b Mon Sep 17 00:00:00 2001 From: cyborg1811m Date: Fri, 19 Jan 2024 22:46:24 +0100 Subject: [PATCH] added outline for const_list --- CMakeLists.txt | 3 +- include/const_list.h | 102 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 include/const_list.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ba1b8a5..20921a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,8 @@ project(const_container) set(CMAKE_CXX_STANDARD 20) add_library(const_container INTERFACE "${CMAKE_CURRENT_LIST_DIR}/include/const_vector.hpp" - include/helper.h) + "${CMAKE_CURRENT_LIST_DIR}/include/helper.h" + "${CMAKE_CURRENT_LIST_DIR}/include/const_list.h") target_include_directories(const_container INTERFACE "${CMAKE_CURRENT_LIST_DIR}/include") add_executable(const_container_test test/test_main.cpp) diff --git a/include/const_list.h b/include/const_list.h new file mode 100644 index 0000000..9e371d0 --- /dev/null +++ b/include/const_list.h @@ -0,0 +1,102 @@ +// +// Created by Patrick Maschek on 19.01.2024. +// + +#ifndef UDIFF_CONST_LIST_H_ +#define UDIFF_CONST_LIST_H_ + +#include +#include + +namespace cc { + + class const_list_node; + + template + requires std::derived_from + class _const_list_iterator_base { + protected: + N *_curr; + + public: + constexpr _const_list_iterator_base() : _curr() {} + constexpr explicit _const_list_iterator_base(N *curr) : _curr(curr) {} + + constexpr virtual const N& operator*() const { return *_curr; } + constexpr virtual const N* operator->() const { return _curr; } + + constexpr virtual _const_list_iterator_base &operator++() noexcept = 0; + constexpr virtual _const_list_iterator_base &operator--() noexcept = 0; + constexpr virtual _const_list_iterator_base operator++(int) & noexcept = 0; + constexpr virtual _const_list_iterator_base operator--(int) & noexcept = 0; + + constexpr bool operator==(const _const_list_iterator_base &other) { return _curr == other._curr; } + }; + + template + class _const_list_iterator : public _const_list_iterator_base { + using _Base = _const_list_iterator_base; + public: + constexpr _const_list_iterator() : _Base() {} + constexpr explicit _const_list_iterator(N *curr) : _Base(curr) {} + + constexpr N& operator*() const override { return *_Base::_curr; } + constexpr N* operator->() const override { return _Base::_curr; } + + constexpr _const_list_iterator &operator++() noexcept override { _Base::_curr == _Base::_curr->_next; return *this; } + constexpr _const_list_iterator &operator--() noexcept override { _Base::_curr == _Base::_curr->_prev; return *this; } + constexpr _const_list_iterator operator++(int) & noexcept override { auto tmp = *this; _Base::_curr == _Base::_curr->_next; return tmp; } + constexpr _const_list_iterator operator--(int) & noexcept override { auto tmp = *this; _Base::_curr == _Base::_curr->_prev; return tmp; } + }; + + template + class _const_const_list_iterator : public _const_list_iterator_base { + using _Base = _const_list_iterator_base; + public: + constexpr _const_const_list_iterator() : _Base() {} + constexpr explicit _const_const_list_iterator(N *curr) : _Base(curr) {} + + constexpr _const_const_list_iterator &operator++() noexcept override { _Base::_curr == _Base::_curr->_next; return *this; } + constexpr _const_const_list_iterator &operator--() noexcept override { _Base::_curr == _Base::_curr->_prev; return *this; } + constexpr _const_const_list_iterator operator++(int) & noexcept override { auto tmp = *this; _Base::_curr == _Base::_curr->_next; return tmp; } + constexpr _const_const_list_iterator operator--(int) & noexcept override { auto tmp = *this; _Base::_curr == _Base::_curr->_prev; return tmp; } + }; + + template + requires std::derived_from + class const_list { + + public: + + using value_type = N; + 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 reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + + private: + const_list_node *_start; + + }; + + class const_list_node { + private: + const_list_node *_prev; + const_list_node *_next; + + friend class const_list; + friend class _const_list_iterator_base; + }; + + + +} // cc + +#endif //UDIFF_CONST_LIST_H_