summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/plists.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/plib/plists.h')
-rw-r--r--src/lib/netlist/plib/plists.h142
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