Cleanup iterators
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user