diff options
Diffstat (limited to 'src/lib/netlist/plib/plists.h')
-rw-r--r-- | src/lib/netlist/plib/plists.h | 142 |
1 files changed, 81 insertions, 61 deletions
diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index 4148eeb82fd..6bb7db69792 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -39,12 +39,12 @@ namespace plib { using reverse_iterator = std::reverse_iterator<iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>; - uninitialised_array() noexcept = default; + constexpr uninitialised_array() noexcept = default; - uninitialised_array(const uninitialised_array &) = default; - uninitialised_array &operator=(const uninitialised_array &) = default; - uninitialised_array(uninitialised_array &&) noexcept = default; - uninitialised_array &operator=(uninitialised_array &&) noexcept = default; + constexpr uninitialised_array(const uninitialised_array &) = default; + constexpr uninitialised_array &operator=(const uninitialised_array &) = default; + constexpr uninitialised_array(uninitialised_array &&) noexcept = default; + constexpr uninitialised_array &operator=(uninitialised_array &&) noexcept = default; ~uninitialised_array() noexcept = default; @@ -52,7 +52,7 @@ namespace plib { constexpr bool empty() const noexcept { return size() == 0; } - reference operator[](size_type index) noexcept + constexpr reference operator[](size_type index) noexcept { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) return reinterpret_cast<reference>(m_buf[index]); @@ -65,21 +65,19 @@ namespace plib { } // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - iterator begin() const noexcept { return reinterpret_cast<iterator>(&m_buf[0]); } + constexpr iterator begin() const noexcept { return reinterpret_cast<iterator>(&m_buf[0]); } // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - iterator end() const noexcept { return reinterpret_cast<iterator>(&m_buf[0] + N); } + constexpr iterator end() const noexcept { return reinterpret_cast<iterator>(&m_buf[0] + N); } // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - iterator begin() noexcept { return reinterpret_cast<iterator>(&m_buf[0]); } + constexpr iterator begin() noexcept { return reinterpret_cast<iterator>(&m_buf[0]); } // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - iterator end() noexcept { return reinterpret_cast<iterator>(&m_buf[0] + N); } + constexpr iterator end() noexcept { return reinterpret_cast<iterator>(&m_buf[0] + N); } // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - const_iterator cbegin() const noexcept { return reinterpret_cast<const_iterator>(&m_buf[0]); } + constexpr const_iterator cbegin() const noexcept { return reinterpret_cast<const_iterator>(&m_buf[0]); } // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - const_iterator cend() const noexcept { return reinterpret_cast<const_iterator>(&m_buf[0] + N); } - - protected: + constexpr const_iterator cend() const noexcept { return reinterpret_cast<const_iterator>(&m_buf[0] + N); } private: std::array<typename std::aligned_storage<sizeof(C), alignof(C)>::type, N> m_buf; @@ -109,15 +107,15 @@ namespace plib { using reverse_iterator = std::reverse_iterator<iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>; - static_vector() noexcept + constexpr static_vector() noexcept : m_pos(0) { } - static_vector(const static_vector &) = default; - static_vector &operator=(const static_vector &) = default; - static_vector(static_vector &&) noexcept = default; - static_vector &operator=(static_vector &&) noexcept = default; + constexpr static_vector(const static_vector &) = default; + constexpr static_vector &operator=(const static_vector &) = default; + constexpr static_vector(static_vector &&) noexcept = default; + constexpr static_vector &operator=(static_vector &&) noexcept = default; ~static_vector() noexcept { @@ -128,7 +126,7 @@ namespace plib { constexpr bool empty() const noexcept { return size() == 0; } - void clear() + constexpr void clear() { for (size_type i=0; i<m_pos; ++i) (*this)[i].~C(); @@ -136,14 +134,14 @@ namespace plib { } template<typename... Args> - void emplace_back(Args&&... args) + constexpr void emplace_back(Args&&... args) { // placement new on buffer new (&m_buf[m_pos]) C(std::forward<Args>(args)...); m_pos++; } - reference operator[](size_type index) noexcept + constexpr reference operator[](size_type index) noexcept { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) return reinterpret_cast<reference>(m_buf[index]); @@ -156,21 +154,19 @@ namespace plib { } // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - iterator begin() const noexcept { return reinterpret_cast<iterator>(&m_buf[0]); } + constexpr iterator begin() const noexcept { return reinterpret_cast<iterator>(&m_buf[0]); } // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - iterator end() const noexcept { return reinterpret_cast<iterator>(&m_buf[0] + m_pos); } + constexpr iterator end() const noexcept { return reinterpret_cast<iterator>(&m_buf[0] + m_pos); } // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - iterator begin() noexcept { return reinterpret_cast<iterator>(&m_buf[0]); } + constexpr iterator begin() noexcept { return reinterpret_cast<iterator>(&m_buf[0]); } // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - iterator end() noexcept { return reinterpret_cast<iterator>(&m_buf[0] + m_pos); } + constexpr iterator end() noexcept { return reinterpret_cast<iterator>(&m_buf[0] + m_pos); } // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - const_iterator cbegin() const noexcept { return reinterpret_cast<const_iterator>(&m_buf[0]); } + constexpr const_iterator cbegin() const noexcept { return reinterpret_cast<const_iterator>(&m_buf[0]); } // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - const_iterator cend() const noexcept { return reinterpret_cast<const_iterator>(&m_buf[0] + m_pos); } - - protected: + constexpr const_iterator cend() const noexcept { return reinterpret_cast<const_iterator>(&m_buf[0] + m_pos); } private: std::array<typename std::aligned_storage<sizeof(C), alignof(C)>::type, N> m_buf; @@ -181,55 +177,67 @@ namespace plib { /// /// The list allows insertions and deletions whilst being processed. /// - template <class LC> + template <class LC, int TAG> class linked_list_t { public: + using ttag = std::integral_constant<int, TAG>; struct element_t { public: - friend class linked_list_t<LC>; + using tag = std::integral_constant<int, TAG>; + + friend class linked_list_t<LC, TAG>; - constexpr element_t() : m_next(nullptr), m_prev(nullptr) {} + constexpr element_t() noexcept : m_next(nullptr), m_prev(nullptr) {} ~element_t() noexcept = default; - element_t(const element_t &) = default; \ - element_t &operator=(const element_t &) = default; - element_t(element_t &&) noexcept = default; - element_t &operator=(element_t &&) noexcept = default; + constexpr element_t(const element_t &) noexcept = default; + constexpr element_t &operator=(const element_t &) noexcept = default; + constexpr element_t(element_t &&) noexcept = default; + constexpr element_t &operator=(element_t &&) noexcept = default; - constexpr LC * &next() noexcept { return m_next; } - constexpr LC * &prev() noexcept { return m_prev; } private: - LC * m_next; - LC * m_prev; + element_t * m_next; + element_t * m_prev; }; struct iter_t final : public std::iterator<std::forward_iterator_tag, LC> { private: - LC* p; + element_t * p; public: - explicit constexpr iter_t(LC* x) noexcept : p(x) { } + using tag = std::integral_constant<int, TAG>; + + explicit constexpr iter_t(element_t * x) noexcept : p(x) { } + constexpr iter_t(const iter_t &rhs) noexcept = default; - iter_t(iter_t &&rhs) noexcept = default; + constexpr iter_t(iter_t &&rhs) noexcept = default; + constexpr iter_t& operator=(const iter_t &rhs) noexcept = default; + constexpr iter_t& operator=(iter_t &&rhs) noexcept = default; - iter_t& operator=(const iter_t &rhs) noexcept = default; - iter_t& operator=(iter_t &&rhs) noexcept = default; ~iter_t() noexcept = default; - iter_t& operator++() noexcept { p = p->next(); return *this; } + iter_t& operator++() noexcept { p = p->m_next; return *this; } // NOLINTNEXTLINE(cert-dcl21-cpp) iter_t operator++(int) & noexcept { const iter_t tmp(*this); operator++(); return tmp; } constexpr bool operator==(const iter_t& rhs) const noexcept { return p == rhs.p; } constexpr bool operator!=(const iter_t& rhs) const noexcept { return p != rhs.p; } - constexpr LC& operator*() noexcept { return *p; } - constexpr LC* operator->() noexcept { return p; } - - constexpr LC& operator*() const noexcept { return *p; } - constexpr LC* operator->() const noexcept { return p; } +#if 0 + constexpr LC& operator*() noexcept { return *static_cast<LC *>(p); } + constexpr LC* operator->() noexcept { return static_cast<LC *>(p); } + + constexpr LC& operator*() const noexcept { return *static_cast<LC *>(p); } + constexpr LC* operator->() const noexcept { return static_cast<LC *>(p); } +#else + constexpr LC* operator*() noexcept { return static_cast<LC *>(p); } + constexpr LC* operator->() noexcept { return static_cast<LC *>(p); } + + constexpr LC* operator*() const noexcept { return static_cast<LC *>(p); } + constexpr LC* operator->() const noexcept { return static_cast<LC *>(p); } +#endif }; constexpr linked_list_t() noexcept : m_head(nullptr) {} @@ -237,7 +245,7 @@ namespace plib { constexpr iter_t begin() const noexcept { return iter_t(m_head); } constexpr iter_t end() const noexcept { return iter_t(nullptr); } - void push_front(LC *elem) noexcept + constexpr void push_front(element_t *elem) noexcept { elem->m_next = m_head; elem->m_prev = nullptr; @@ -246,10 +254,10 @@ namespace plib { m_head = elem; } - void push_back(LC *elem) noexcept + constexpr void push_back(element_t *elem) noexcept { - LC ** p(&m_head); - LC * prev(nullptr); + element_t ** p(&m_head); + element_t * prev(nullptr); while (*p != nullptr) { prev = *p; @@ -260,7 +268,7 @@ namespace plib { elem->m_next = nullptr; } - void remove(const LC *elem) noexcept + constexpr void remove(const element_t *elem) noexcept { if (elem->m_prev) elem->m_prev->m_next = elem->m_next; @@ -276,12 +284,24 @@ namespace plib { constexpr LC *front() const noexcept { return m_head; } constexpr bool empty() const noexcept { return (m_head == nullptr); } - void clear() noexcept + constexpr std::size_t size() const noexcept + { + std::size_t ret = 0; + element_t *p = m_head; + while (p != nullptr) + { + ret++; + p = p->m_next; + } + return ret; + } + + constexpr void clear() noexcept { - LC *p(m_head); + element_t *p(m_head); while (p != nullptr) { - LC *n(p->m_next); + element_t *n(p->m_next); p->m_next = nullptr; p->m_prev = nullptr; p = n; @@ -290,7 +310,7 @@ namespace plib { } private: - LC *m_head; + element_t *m_head; }; } // namespace plib |