Cleanup iterators

This commit is contained in:
Krzosa Karol
2023-01-01 17:44:27 +01:00
parent d120d05eee
commit d6a5df8d95
9 changed files with 86 additions and 108 deletions

View File

@@ -330,6 +330,40 @@ struct List{
List_Node<T> *first = 0;
List_Node<T> *last = 0;
List_Node<T> *first_free = 0;
struct Iter{
T *item;
List_Node<T> *node;
int node_index;
T &operator*() { return *item; }
Iter &operator++() {
if (node) {
if (node_index + 1 >= node->len) {
node = node->next;
node_index = -1;
item = 0;
}
if (node) {
node_index += 1;
item = node->data + node_index;
}
}
return *this;
}
};
Iter begin() {
Iter result = {};
result.node = first;
result.node_index = -1;
return ++result;
}
Iter end() { return{}; }
friend bool operator!=(Iter &a, Iter &b) { return a.item != b.item; }
};
template<class T>
@@ -540,42 +574,3 @@ T *merge(Allocator *arena, List<T> *list){
return result;
}
template<class T>
struct List_Iter{
T *item;
int index;
List_Node<T> *node;
int node_index;
};
template<class T>
void advance(List_Iter<T> *iter){
if(!iter->node) return;
if(iter->node_index + 1 >= iter->node->len){
iter->node = iter->node->next;
iter->node_index = -1;
iter->item = 0;
}
if(iter->node){
iter->node_index += 1;
iter->index += 1;
iter->item = iter->node->data + iter->node_index;
}
}
template<class T>
List_Iter<T> iterate(List<T> *list){
List_Iter<T> result = {};
result.node = list->first;
result.index = result.node_index = -1;
advance(&result);
return result;
}
template<class T>
bool should_we_continue(List_Iter<T> *iter){
return iter->item != 0;
}