-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtransform.c
More file actions
126 lines (118 loc) · 3.14 KB
/
Copy pathtransform.c
File metadata and controls
126 lines (118 loc) · 3.14 KB
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "transform.h"
Object**
dlist_toArray(dlist *head, size_t *size, BOOLEAN deep_copy){
size_t len = 0;
dlist* p = head;
if(!head) return NULL;
do{ p = p->next; len++; } while(p != head);
Object **values = (Object**)LINKED_MALLOC((len+1)*sizeof(Object*));
len = 0; p = head;
DLIST_ITERATE(p, head) {
if(deep_copy){
values[len] = CALL(p->data,copy,p->data, LINKED_MALLOC(p->data->method->size));
} else {
values[len] = p->data;
}
len++;
}
values[len] = NULL;
*size = len;
//terminate the array, NOTE: This means none of the data can be null, it will only return up to the first non-null data entry
return values;
}
Object**
dlist_toArrayReverse(dlist *head, size_t *size, BOOLEAN deep_copy){
size_t i = 0, len = 0;
dlist* p = head;
if(!head) return NULL;
do{ p = p->next; i++; } while(p != head);
Object **values = (Object**)LINKED_MALLOC((len+1)*sizeof(Object*));
len = 0;
DLIST_ITERATE_REVERSE(p, head){
if(deep_copy){
values[len] = CALL(p->data,copy,p->data, LINKED_MALLOC(p->data->method->size));
} else {
values[len] = p->data;
}
len++;
}
values[len] = NULL;
*size = len;
//terminate the array, NOTE: This means none of the data can be null, it will only return up to the first non-null data entry
return values;
}
slist*
dlist_toSlist(dlist *head, BOOLEAN deep_copy){
slist* p = NULL;
dlist* d = head;
if(!d) return NULL;
do{ p = slist_pushfront(p, d->data, deep_copy); d = d->prev; } while(d != head);
return p;
}
dlist*
array_toDlist(Object** array, size_t size, BOOLEAN deep_copy){
dlist *p = NULL;
if(!array) return NULL;
if(size == 0) return NULL;
size_t i = 0;
for(; i < size; i++){
p = dlist_pushback(p, array[i], deep_copy);
}
return p;
}
Object**
slist_toArray(slist *head, size_t *size, BOOLEAN deep){
size_t len = 0;
slist* p = head;
if(!head) return NULL;
for(; p->next; p = p->next, len++);
Object **values = (Object**)LINKED_MALLOC((len+1)*sizeof(Object*));
len = 0;
SLIST_ITERATE(p, head) {
if(deep){
values[len] = CALL(p->data,copy,p->data, LINKED_MALLOC(p->data->method->size));
} else {
values[len] = p->data;
}
len++;
}
values[len] = NULL;
*size = len;
//terminate the array, NOTE: This means none of the data can be null, it will only return up to the first non-null data entry
return values;
}
Object**
slist_toArrayReverse(slist *head, size_t *size, BOOLEAN deep){
size_t i = 0, len = 0;
Object **values = slist_toArray(head, &len, deep);
if(values == NULL) return NULL;
*size = len;
for(i = 0; i < len/2; i++){//flip them around
Object *k = values[len-i-1];
values[len-i-1] = values[i];
values[i] = k;
}
values[len] = NULL;
//terminate the array, NOTE: This means none of the data can be null, it will only return up to the first non-null data entry
return values;
}
slist*
array_toSlist(Object** arr, size_t size, BOOLEAN deep){
if(arr == NULL) return NULL;
if(size == 0) return NULL;
size_t i = size;
slist *head = NULL;
for(; --i; ){
head = slist_pushfront(head, arr[i], deep);
}
return head;
}
dlist*
slist_toDlist(slist *head, BOOLEAN deep){
slist* p = head;
dlist* d = NULL;
for(; p; p = p->next){
d = dlist_pushback(d, p->data, deep);
}
return d;
}