summaryrefslogtreecommitdiffstats
path: root/libcnary/include/node.h
blob: 35f633362f097fc5868f9291d4f5fba60e0df1f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
 * node.h
 *
 *  Created on: Mar 7, 2011
 *      Author: posixninja
 */

#ifndef NODE_H_
#define NODE_H_

#include "object.h"

#define NODE_TYPE 1;

struct node_list_t;

// This class implements the abstract iterator class
typedef struct node_t {
	// Super class
	struct node_t* next;
	struct node_t* prev;
	unsigned int count;

	// Local Properties
	int isRoot;
	int isLeaf;

	// Local Members
	void *data;
	unsigned int depth;
	struct node_t* parent;
	struct node_list_t* children;

	// Virtual Functions
	int(*attach)(struct node_t* parent, struct node_t* child);
	int(*detach)(struct node_t* parent, struct node_t* child);

} node_t;

void node_destroy(struct node_t* node);
struct node_t* node_create(struct node_t* parent, void* data);

int node_attach(struct node_t* parent, struct node_t* child);
int node_detach(struct node_t* parent, struct node_t* child);
int node_insert(struct node_t* parent, unsigned int index, struct node_t* child);

unsigned int node_n_children(struct node_t* node);
node_t* node_nth_child(struct node_t* node, unsigned int n);
node_t* node_first_child(struct node_t* node);
node_t* node_prev_sibling(struct node_t* node);
node_t* node_next_sibling(struct node_t* node);
int node_child_position(struct node_t* parent, node_t* child);

typedef void* (*copy_func_t)(const void *src);
node_t* node_copy_deep(node_t* node, copy_func_t copy_func);

void node_debug(struct node_t* node);

#endif /* NODE_H_ */