Commit 4de32932 authored by Nikias Bassen's avatar Nikias Bassen

Remove node_iterator and operate on node list directly to improve memory usage

parent 71dd25e1
...@@ -8,11 +8,7 @@ libcnary_la_SOURCES = \ ...@@ -8,11 +8,7 @@ libcnary_la_SOURCES = \
node.c \ node.c \
list.c \ list.c \
node_list.c \ node_list.c \
iterator.c \
node_iterator.c \
include/node.h \ include/node.h \
include/list.h \ include/list.h \
include/node_list.h \ include/node_list.h \
include/iterator.h \
include/node_iterator.h \
include/object.h include/object.h
/*
* iterator.h
*
* Created on: Mar 8, 2011
* Author: posixninja
*
* Copyright (c) 2011 Joshua Hill. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef ITERATOR_H_
#define ITERATOR_H_
struct list_t;
struct object_t;
typedef struct iterator_t {
struct object_t*(*next)(struct iterator_t* iterator);
int(*bind)(struct iterator_t* iterator, struct list_t* list);
unsigned int count;
unsigned int position;
struct list_t* list;
struct object_t* end;
struct object_t* begin;
struct object_t* value;
} iterator_t;
void iterator_destroy(struct iterator_t* iterator);
struct iterator_t* iterator_create(struct list_t* list);
struct object_t* iterator_next(struct iterator_t* iterator);
int iterator_bind(struct iterator_t* iterator, struct list_t* list);
#endif /* ITERATOR_H_ */
/*
* node_iterator.h
*
* Created on: Mar 8, 2011
* Author: posixninja
*
* Copyright (c) 2011 Joshua Hill. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef NODE_ITERATOR_H_
#define NODE_ITERATOR_H_
#include "iterator.h"
#include "node_list.h"
// This class implements the abstract iterator class
typedef struct node_iterator_t {
// Super class
struct iterator_t super;
// Local members
struct node_t*(*next)(struct node_iterator_t* iterator);
int(*bind)(struct node_iterator_t* iterator, struct node_list_t* list);
unsigned int count;
unsigned int position;
struct node_list_t* list;
struct node_t* end;
struct node_t* begin;
struct node_t* value;
} node_iterator_t;
void node_iterator_destroy(node_iterator_t* iterator);
node_iterator_t* node_iterator_create(node_list_t* list);
struct node_t* node_iterator_next(struct node_iterator_t* iterator);
int node_iterator_bind(struct node_iterator_t* iterator, struct node_list_t* list);
#endif /* NODE_ITERATOR_H_ */
/*
* iterator.c
*
* Created on: Mar 8, 2011
* Author: posixninja
*
* Copyright (c) 2011 Joshua Hill. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#include "object.h"
#include "iterator.h"
void iterator_destroy(iterator_t* iterator) {
if(iterator) {
free(iterator);
}
}
iterator_t* iterator_create(list_t* list) {
iterator_t* iterator = (iterator_t*) malloc(sizeof(iterator_t));
if(iterator == NULL) {
return NULL;
}
memset(iterator, '\0', sizeof(iterator_t));
if(list != NULL) {
// Create and bind to list
} else {
// Empty Iterator
}
return iterator;
}
object_t* iterator_next(iterator_t* iterator) {
return NULL;
}
int iterator_bind(iterator_t* iterator, list_t* list) {
return -1;
}
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#include "node.h" #include "node.h"
#include "node_list.h" #include "node_list.h"
#include "node_iterator.h"
void node_destroy(node_t* node) { void node_destroy(node_t* node) {
if(!node) return; if(!node) return;
...@@ -114,7 +113,6 @@ int node_insert(node_t* parent, unsigned int node_index, node_t* child) ...@@ -114,7 +113,6 @@ int node_insert(node_t* parent, unsigned int node_index, node_t* child)
static void _node_debug(node_t* node, unsigned int depth) { static void _node_debug(node_t* node, unsigned int depth) {
unsigned int i = 0; unsigned int i = 0;
node_t* current = NULL; node_t* current = NULL;
node_iterator_t* iter = NULL;
for(i = 0; i < depth; i++) { for(i = 0; i < depth; i++) {
printf("\t"); printf("\t");
} }
...@@ -128,11 +126,9 @@ static void _node_debug(node_t* node, unsigned int depth) { ...@@ -128,11 +126,9 @@ static void _node_debug(node_t* node, unsigned int depth) {
if(node->parent) { if(node->parent) {
printf("NODE\n"); printf("NODE\n");
} }
iter = node_iterator_create(node->children); for (current = node_first_child(node); current; current = node_next_sibling(current)) {
while ((current = iter->next(iter))) {
_node_debug(current, depth+1); _node_debug(current, depth+1);
} }
node_iterator_destroy(iter);
} }
} }
......
/*
* node_iterator.c
*
* Created on: Mar 8, 2011
* Author: posixninja
*
* Copyright (c) 2011 Joshua Hill. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "node.h"
#include "node_list.h"
#include "node_iterator.h"
void node_iterator_destroy(node_iterator_t* iterator) {
if(iterator) {
free(iterator);
}
}
node_iterator_t* node_iterator_create(node_list_t* list) {
node_iterator_t* iterator = (node_iterator_t*) malloc(sizeof(node_iterator_t));
if(iterator == NULL) {
return NULL;
}
memset(iterator, '\0', sizeof(node_iterator_t));
iterator->count = 0;
iterator->position = 0;
iterator->end = NULL;
iterator->begin = NULL;
iterator->value = NULL;
iterator->list = NULL;
iterator->next = node_iterator_next;
iterator->bind = node_iterator_bind;
if(list != NULL) {
iterator->bind(iterator, list);
}
return iterator;
}
node_t* node_iterator_next(node_iterator_t* iterator) {
node_t* node = iterator->value;
if (node) {
iterator->value = node->next;
}
iterator->position++;
return node;
}
int node_iterator_bind(node_iterator_t* iterator, node_list_t* list) {
iterator->position = 0;
iterator->end = list->end;
iterator->count = list->count;
iterator->begin = list->begin;
iterator->value = list->begin;
return 0;
}
...@@ -39,7 +39,6 @@ ...@@ -39,7 +39,6 @@
#include "ptrarray.h" #include "ptrarray.h"
#include <node.h> #include <node.h>
#include <node_iterator.h>
/* Magic marker and size. */ /* Magic marker and size. */
#define BPLIST_MAGIC ((uint8_t*)"bplist") #define BPLIST_MAGIC ((uint8_t*)"bplist")
...@@ -938,12 +937,10 @@ static void serialize_plist(node_t* node, void* data) ...@@ -938,12 +937,10 @@ static void serialize_plist(node_t* node, void* data)
ptr_array_add(ser->objects, node); ptr_array_add(ser->objects, node);
//now recurse on children //now recurse on children
node_iterator_t *ni = node_iterator_create(node->children);
node_t *ch; node_t *ch;
while ((ch = node_iterator_next(ni))) { for (ch = node_first_child(node); ch; ch = node_next_sibling(ch)) {
serialize_plist(ch, data); serialize_plist(ch, data);
} }
node_iterator_destroy(ni);
return; return;
} }
......
...@@ -36,7 +36,6 @@ ...@@ -36,7 +36,6 @@
#endif #endif
#include <node.h> #include <node.h>
#include <node_iterator.h>
#include <hashtable.h> #include <hashtable.h>
extern void plist_xml_init(void); extern void plist_xml_init(void);
...@@ -209,12 +208,12 @@ static int plist_free_node(node_t* node) ...@@ -209,12 +208,12 @@ static int plist_free_node(node_t* node)
plist_free_data(data); plist_free_data(data);
node->data = NULL; node->data = NULL;
node_iterator_t *ni = node_iterator_create(node->children);
node_t *ch; node_t *ch;
while ((ch = node_iterator_next(ni))) { for (ch = node_first_child(node); ch; ) {
node_t *next = node_next_sibling(ch);
plist_free_node(ch); plist_free_node(ch);
ch = next;
} }
node_iterator_destroy(ni);
node_destroy(node); node_destroy(node);
...@@ -366,12 +365,10 @@ static void plist_copy_node(node_t *node, void *parent_node_ptr) ...@@ -366,12 +365,10 @@ static void plist_copy_node(node_t *node, void *parent_node_ptr)
*(plist_t*)parent_node_ptr = newnode; *(plist_t*)parent_node_ptr = newnode;
} }
node_iterator_t *ni = node_iterator_create(node->children);
node_t *ch; node_t *ch;
while ((ch = node_iterator_next(ni))) { for (ch = node_first_child(node); ch; ch = node_next_sibling(ch)) {
plist_copy_node(ch, &newnode); plist_copy_node(ch, &newnode);
} }
node_iterator_destroy(ni);
} }
PLIST_API plist_t plist_copy(plist_t node) PLIST_API plist_t plist_copy(plist_t node)
......
...@@ -40,7 +40,6 @@ ...@@ -40,7 +40,6 @@
#include <node.h> #include <node.h>
#include <node_list.h> #include <node_list.h>
#include <node_iterator.h>
#include "plist.h" #include "plist.h"
#include "base64.h" #include "base64.h"
...@@ -356,12 +355,10 @@ static void node_to_xml(node_t* node, bytearray_t **outbuf, uint32_t depth) ...@@ -356,12 +355,10 @@ static void node_to_xml(node_t* node, bytearray_t **outbuf, uint32_t depth)
if (node_data->type == PLIST_DICT) { if (node_data->type == PLIST_DICT) {
assert((node->children->count % 2) == 0); assert((node->children->count % 2) == 0);
} }
node_iterator_t *ni = node_iterator_create(node->children);
node_t *ch; node_t *ch;
while ((ch = node_iterator_next(ni))) { for (ch = node_first_child(node); ch; ch = node_next_sibling(ch)) {
node_to_xml(ch, outbuf, depth+1); node_to_xml(ch, outbuf, depth+1);
} }
node_iterator_destroy(ni);
} }
/* fix indent for structured types */ /* fix indent for structured types */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment