Alien-libpanda
view release on metacpan or search on metacpan
src/panda/owning_list.h view on Meta::CPAN
#pragma once
#include "refcnt.h"
namespace panda {
/**
* owning_list where iterators share owning of nodes with list.
* Removing of any iterator never invalidates value under it.
* Forward iterator never invalidates, even if all list cleared.
* Backward iterator keep valid value, but operator++ may lead to invalid iterator if no one keep reference to it
* Removeing of element just fork list
* 1 -> 2 -> 3
* remove(2)
* 1 -> 3
* ^
* 2
* Node will be deleted when all strong reference to it will be forgotten
* Reference to previous node is weak
* 1-> 2-> 3
src/panda/owning_list.h view on Meta::CPAN
bool operator !=(const base_iterator& oth) const {
return !operator==(oth);
}
};
using reverse_iterator = base_iterator<prev_strategy>;
using iterator = base_iterator<next_strategy>;
owning_list() : _size(0), first(nullptr), last(nullptr) {}
~owning_list() {
clear(); // do not remove! we must invalidate all elements to make ++ on any iterator correct
}
iterator begin() {
return first;
}
iterator end() {
return iterator(nullptr);
}
src/panda/refcnt.h view on Meta::CPAN
object = nullptr;
}
void swap(weak_iptr& oth) noexcept {
storage.swap(oth.storage);
std::swap(object, oth.object);
}
private:
iptr<weak_storage> storage;
T* object; // it is cache, it never invalidates itself, use storage->object to check validity
};
template <class T>
void swap(weak_iptr<T>& a, weak_iptr<T>& b) noexcept { a.swap(b); }
template <class T> struct _weak_t;
template <class T> struct _weak_t<iptr<T>> {
using type = weak_iptr<T>;
};
( run in 0.553 second using v1.01-cache-2.11-cpan-a5abf4f5562 )