|
@@ -36,7 +36,7 @@ private:
|
|
|
node_type* prev = 0;
|
|
|
node_type* next = 0;
|
|
|
|
|
|
- void connect(node_type* _next) noexcept
|
|
|
+ constexpr void connect(node_type* _next) noexcept
|
|
|
{
|
|
|
this->next = _next;
|
|
|
_next->prev = static_cast<node_type*>(this);
|
|
@@ -46,12 +46,12 @@ private:
|
|
|
template <typename NodeValue>
|
|
|
class node : public node_base {
|
|
|
public:
|
|
|
- explicit node(const NodeValue& v) noexcept
|
|
|
+ explicit constexpr node(const NodeValue& v) noexcept
|
|
|
: value(v)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- explicit node(NodeValue&& v) noexcept
|
|
|
+ explicit constexpr node(NodeValue&& v) noexcept
|
|
|
: value(move(v))
|
|
|
{
|
|
|
}
|
|
@@ -67,80 +67,80 @@ public:
|
|
|
using Reference = typename types::traits::add_reference<Value>::type;
|
|
|
|
|
|
public:
|
|
|
- iterator(const iterator& iter) noexcept
|
|
|
+ constexpr iterator(const iterator& iter) noexcept
|
|
|
: n(iter.n)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- iterator(iterator&& iter) noexcept
|
|
|
+ constexpr iterator(iterator&& iter) noexcept
|
|
|
: n(iter.n)
|
|
|
{
|
|
|
iter.n = nullptr;
|
|
|
}
|
|
|
|
|
|
- iterator& operator=(const iterator& iter)
|
|
|
+ constexpr iterator& operator=(const iterator& iter)
|
|
|
{
|
|
|
n = iter.n;
|
|
|
return *this;
|
|
|
}
|
|
|
|
|
|
- explicit iterator(node_type* _n) noexcept
|
|
|
+ explicit constexpr iterator(node_type* _n) noexcept
|
|
|
: n(_n)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
- bool operator==(const iterator& iter) const noexcept
|
|
|
+ constexpr bool operator==(const iterator& iter) const noexcept
|
|
|
{
|
|
|
return this->_node() == iter._node();
|
|
|
}
|
|
|
|
|
|
- bool operator!=(const iterator& iter) const noexcept
|
|
|
+ constexpr bool operator!=(const iterator& iter) const noexcept
|
|
|
{
|
|
|
return !(*this == iter);
|
|
|
}
|
|
|
|
|
|
- iterator& operator++() noexcept
|
|
|
+ constexpr iterator& operator++() noexcept
|
|
|
{
|
|
|
n = n->next;
|
|
|
return *this;
|
|
|
}
|
|
|
|
|
|
- iterator operator++(int) noexcept
|
|
|
+ constexpr iterator operator++(int) noexcept
|
|
|
{
|
|
|
iterator iter(*this);
|
|
|
n = n->next;
|
|
|
return iter;
|
|
|
}
|
|
|
|
|
|
- iterator& operator--() noexcept
|
|
|
+ constexpr iterator& operator--() noexcept
|
|
|
{
|
|
|
n = n->prev;
|
|
|
return *this;
|
|
|
}
|
|
|
|
|
|
- iterator operator--(int) noexcept
|
|
|
+ constexpr iterator operator--(int) noexcept
|
|
|
{
|
|
|
iterator iter(*this);
|
|
|
n = n->prev;
|
|
|
return iter;
|
|
|
}
|
|
|
|
|
|
- Reference operator*() const noexcept
|
|
|
+ constexpr Reference operator*() const noexcept
|
|
|
{
|
|
|
return n->value;
|
|
|
}
|
|
|
|
|
|
- Pointer operator->() const noexcept
|
|
|
+ constexpr Pointer operator->() const noexcept
|
|
|
{
|
|
|
return &n->value;
|
|
|
}
|
|
|
|
|
|
- Pointer ptr(void) const noexcept
|
|
|
+ constexpr Pointer ptr(void) const noexcept
|
|
|
{
|
|
|
return &n->value;
|
|
|
}
|
|
|
|
|
|
- node_base_type* _node(void) const noexcept
|
|
|
+ constexpr node_base_type* _node(void) const noexcept
|
|
|
{
|
|
|
return n;
|
|
|
}
|
|
@@ -153,17 +153,17 @@ private:
|
|
|
node_base_type* head;
|
|
|
node_base_type* tail;
|
|
|
|
|
|
- const size_t& _size(void) const noexcept
|
|
|
+ constexpr const size_t& _size(void) const noexcept
|
|
|
{
|
|
|
return (static_cast<sentry_node_type*>(head))->value;
|
|
|
}
|
|
|
|
|
|
- size_t& _size(void) noexcept
|
|
|
+ constexpr size_t& _size(void) noexcept
|
|
|
{
|
|
|
return (static_cast<sentry_node_type*>(head))->value;
|
|
|
}
|
|
|
|
|
|
- void destroy(void)
|
|
|
+ constexpr void destroy(void)
|
|
|
{
|
|
|
if (!head || !tail)
|
|
|
return;
|
|
@@ -173,7 +173,7 @@ private:
|
|
|
}
|
|
|
|
|
|
public:
|
|
|
- list() noexcept
|
|
|
+ constexpr list() noexcept
|
|
|
// size is stored in the 'head' node
|
|
|
: head(allocator_traits<sentry_allocator_type>::allocate_and_construct(0))
|
|
|
, tail(allocator_traits<sentry_allocator_type>::allocate_and_construct(0))
|
|
@@ -182,14 +182,14 @@ public:
|
|
|
tail->connect(static_cast<node_type*>(head));
|
|
|
}
|
|
|
|
|
|
- list(const list& v)
|
|
|
+ constexpr list(const list& v)
|
|
|
: list()
|
|
|
{
|
|
|
for (const auto& item : v)
|
|
|
push_back(item);
|
|
|
}
|
|
|
|
|
|
- list(list&& v)
|
|
|
+ constexpr list(list&& v)
|
|
|
: head(v.head)
|
|
|
, tail(v.tail)
|
|
|
{
|
|
@@ -197,7 +197,7 @@ public:
|
|
|
v.tail = nullptr;
|
|
|
}
|
|
|
|
|
|
- list& operator=(const list& v)
|
|
|
+ constexpr list& operator=(const list& v)
|
|
|
{
|
|
|
clear();
|
|
|
for (const auto& item : v)
|
|
@@ -205,7 +205,7 @@ public:
|
|
|
return *this;
|
|
|
}
|
|
|
|
|
|
- list& operator=(list&& v)
|
|
|
+ constexpr list& operator=(list&& v)
|
|
|
{
|
|
|
destroy();
|
|
|
|
|
@@ -222,7 +222,7 @@ public:
|
|
|
destroy();
|
|
|
}
|
|
|
|
|
|
- iterator_type find(const value_type& v) noexcept
|
|
|
+ constexpr iterator_type find(const value_type& v) noexcept
|
|
|
{
|
|
|
for (iterator_type iter = begin(); iter != end(); ++iter)
|
|
|
if (*iter == v)
|
|
@@ -231,7 +231,7 @@ public:
|
|
|
}
|
|
|
|
|
|
// erase the node which iter points to
|
|
|
- iterator_type erase(const iterator_type& iter) noexcept
|
|
|
+ constexpr iterator_type erase(const iterator_type& iter) noexcept
|
|
|
{
|
|
|
node_base_type* current_node = iter._node();
|
|
|
iterator_type ret(current_node->next);
|
|
@@ -241,14 +241,14 @@ public:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- void clear(void)
|
|
|
+ constexpr void clear(void)
|
|
|
{
|
|
|
for (auto iter = begin(); iter != end();)
|
|
|
iter = erase(iter);
|
|
|
}
|
|
|
|
|
|
// insert the value v in front of the given iterator
|
|
|
- iterator_type insert(const iterator_type& iter, const value_type& v) noexcept
|
|
|
+ constexpr iterator_type insert(const iterator_type& iter, const value_type& v) noexcept
|
|
|
{
|
|
|
node_type* new_node = allocator_traits<allocator_type>::allocate_and_construct(v);
|
|
|
iterator_type ret(new_node);
|
|
@@ -260,7 +260,7 @@ public:
|
|
|
}
|
|
|
|
|
|
// insert the value v in front of the given iterator
|
|
|
- iterator_type insert(const iterator_type& iter, value_type&& v) noexcept
|
|
|
+ constexpr iterator_type insert(const iterator_type& iter, value_type&& v) noexcept
|
|
|
{
|
|
|
node_type* new_node = allocator_traits<allocator_type>::allocate_and_construct(move(v));
|
|
|
iterator_type ret(new_node);
|
|
@@ -271,74 +271,74 @@ public:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- void push_back(const value_type& v) noexcept
|
|
|
+ constexpr void push_back(const value_type& v) noexcept
|
|
|
{
|
|
|
insert(end(), v);
|
|
|
}
|
|
|
|
|
|
- void push_back(value_type&& v) noexcept
|
|
|
+ constexpr void push_back(value_type&& v) noexcept
|
|
|
{
|
|
|
insert(end(), move(v));
|
|
|
}
|
|
|
|
|
|
template <typename... Args>
|
|
|
- iterator_type emplace_back(Args&&... args)
|
|
|
+ constexpr iterator_type emplace_back(Args&&... args)
|
|
|
{
|
|
|
return insert(end(), value_type(forward<Args>(args)...));
|
|
|
}
|
|
|
|
|
|
- void push_front(const value_type& v) noexcept
|
|
|
+ constexpr void push_front(const value_type& v) noexcept
|
|
|
{
|
|
|
insert(begin(), v);
|
|
|
}
|
|
|
|
|
|
- void push_front(value_type&& v) noexcept
|
|
|
+ constexpr void push_front(value_type&& v) noexcept
|
|
|
{
|
|
|
insert(begin(), move(v));
|
|
|
}
|
|
|
|
|
|
template <typename... Args>
|
|
|
- iterator_type emplace_front(Args&&... args)
|
|
|
+ constexpr iterator_type emplace_front(Args&&... args)
|
|
|
{
|
|
|
return insert(begin(), value_type(forward<Args>(args)...));
|
|
|
}
|
|
|
|
|
|
- size_t size(void) const noexcept
|
|
|
+ constexpr size_t size(void) const noexcept
|
|
|
{
|
|
|
return _size();
|
|
|
}
|
|
|
|
|
|
- iterator_type begin() noexcept
|
|
|
+ constexpr iterator_type begin() noexcept
|
|
|
{
|
|
|
return iterator_type(head->next);
|
|
|
}
|
|
|
|
|
|
- iterator_type end() noexcept
|
|
|
+ constexpr iterator_type end() noexcept
|
|
|
{
|
|
|
return iterator_type(static_cast<node_type*>(tail));
|
|
|
}
|
|
|
|
|
|
- const_iterator_type begin() const noexcept
|
|
|
+ constexpr const_iterator_type begin() const noexcept
|
|
|
{
|
|
|
return const_iterator_type(head->next);
|
|
|
}
|
|
|
|
|
|
- const_iterator_type end() const noexcept
|
|
|
+ constexpr const_iterator_type end() const noexcept
|
|
|
{
|
|
|
return const_iterator_type(static_cast<node_type*>(tail));
|
|
|
}
|
|
|
|
|
|
- const_iterator_type cbegin() const noexcept
|
|
|
+ constexpr const_iterator_type cbegin() const noexcept
|
|
|
{
|
|
|
return begin();
|
|
|
}
|
|
|
|
|
|
- const_iterator_type cend() const noexcept
|
|
|
+ constexpr const_iterator_type cend() const noexcept
|
|
|
{
|
|
|
return end();
|
|
|
}
|
|
|
|
|
|
- bool empty(void) const noexcept
|
|
|
+ constexpr bool empty(void) const noexcept
|
|
|
{
|
|
|
return size() == 0;
|
|
|
}
|