BAN: LinkedList now uses iterators instead of const_iterators on methods
This commit is contained in:
parent
6a133782ed
commit
bfc9a2377c
|
@ -30,15 +30,15 @@ namespace BAN
|
||||||
|
|
||||||
[[nodiscard]] ErrorOr<void> push_back(const T&);
|
[[nodiscard]] ErrorOr<void> push_back(const T&);
|
||||||
[[nodiscard]] ErrorOr<void> push_back(T&&);
|
[[nodiscard]] ErrorOr<void> push_back(T&&);
|
||||||
[[nodiscard]] ErrorOr<void> insert(const_iterator, const T&);
|
[[nodiscard]] ErrorOr<void> insert(iterator, const T&);
|
||||||
[[nodiscard]] ErrorOr<void> insert(const_iterator, T&&);
|
[[nodiscard]] ErrorOr<void> insert(iterator, T&&);
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
[[nodiscard]] ErrorOr<void> emplace_back(Args&&...);
|
[[nodiscard]] ErrorOr<void> emplace_back(Args&&...);
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
[[nodiscard]] ErrorOr<void> emplace(const_iterator, Args&&...);
|
[[nodiscard]] ErrorOr<void> emplace(iterator, Args&&...);
|
||||||
|
|
||||||
void pop_back();
|
void pop_back();
|
||||||
void remove(const_iterator);
|
void remove(iterator);
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
iterator begin() { return iterator(m_data, empty()); }
|
iterator begin() { return iterator(m_data, empty()); }
|
||||||
|
@ -51,6 +51,8 @@ namespace BAN
|
||||||
const T& front() const;
|
const T& front() const;
|
||||||
T& front();
|
T& front();
|
||||||
|
|
||||||
|
bool contains(const T&) const;
|
||||||
|
|
||||||
size_type size() const;
|
size_type size() const;
|
||||||
bool empty() const;
|
bool empty() const;
|
||||||
|
|
||||||
|
@ -77,6 +79,7 @@ namespace BAN
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using value_type = T;
|
using value_type = T;
|
||||||
|
using data_type = maybe_const_t<CONST, typename LinkedList<T>::Node>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LinkedListIterator() = default;
|
LinkedListIterator() = default;
|
||||||
|
@ -101,10 +104,10 @@ namespace BAN
|
||||||
operator bool() const;
|
operator bool() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LinkedListIterator(typename LinkedList<T>::Node*, bool);
|
LinkedListIterator(data_type*, bool);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typename LinkedList<T>::Node* m_current = nullptr;
|
data_type* m_current = nullptr;
|
||||||
bool m_past_end = false;
|
bool m_past_end = false;
|
||||||
|
|
||||||
friend class LinkedList<T>;
|
friend class LinkedList<T>;
|
||||||
|
@ -148,13 +151,13 @@ namespace BAN
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ErrorOr<void> LinkedList<T>::insert(const_iterator iter, const T& value)
|
ErrorOr<void> LinkedList<T>::insert(iterator iter, const T& value)
|
||||||
{
|
{
|
||||||
return insert(iter, move(T(value)));
|
return insert(iter, move(T(value)));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ErrorOr<void> LinkedList<T>::insert(const_iterator iter, T&& value)
|
ErrorOr<void> LinkedList<T>::insert(iterator iter, T&& value)
|
||||||
{
|
{
|
||||||
Node* next = iter.m_past_end ? nullptr : iter.m_current;
|
Node* next = iter.m_past_end ? nullptr : iter.m_current;
|
||||||
Node* prev = next ? next->prev : m_last;
|
Node* prev = next ? next->prev : m_last;
|
||||||
|
@ -177,7 +180,7 @@ namespace BAN
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
ErrorOr<void> LinkedList<T>::emplace(const_iterator iter, Args&&... args)
|
ErrorOr<void> LinkedList<T>::emplace(iterator iter, Args&&... args)
|
||||||
{
|
{
|
||||||
Node* next = iter.m_past_end ? nullptr : iter.m_current;
|
Node* next = iter.m_past_end ? nullptr : iter.m_current;
|
||||||
Node* prev = next ? next->prev : m_last;
|
Node* prev = next ? next->prev : m_last;
|
||||||
|
@ -198,7 +201,7 @@ namespace BAN
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void LinkedList<T>::remove(const_iterator iter)
|
void LinkedList<T>::remove(iterator iter)
|
||||||
{
|
{
|
||||||
ASSERT(!empty() && iter);
|
ASSERT(!empty() && iter);
|
||||||
Node* node = iter.m_current;
|
Node* node = iter.m_current;
|
||||||
|
@ -255,6 +258,19 @@ namespace BAN
|
||||||
return *iterator(m_data);
|
return *iterator(m_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
bool LinkedList<T>::contains(const T& value) const
|
||||||
|
{
|
||||||
|
if (empty()) return false;
|
||||||
|
for (Node* node = m_data;; node = node->next)
|
||||||
|
{
|
||||||
|
if (node->value == value)
|
||||||
|
return true;
|
||||||
|
if (node == m_last)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
typename LinkedList<T>::size_type LinkedList<T>::size() const
|
typename LinkedList<T>::size_type LinkedList<T>::size() const
|
||||||
{
|
{
|
||||||
|
@ -287,9 +303,9 @@ namespace BAN
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, bool CONST>
|
template<typename T, bool CONST>
|
||||||
LinkedListIterator<T, CONST>::LinkedListIterator(typename LinkedList<T>::Node* node, bool past_end)
|
LinkedListIterator<T, CONST>::LinkedListIterator(data_type* node, bool past_end)
|
||||||
: m_current(node),
|
: m_current(node)
|
||||||
m_past_end(past_end)
|
, m_past_end(past_end)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue