Skip to content

Commit 20937aa

Browse files
committed
124
1 parent 9ff3e6a commit 20937aa

13 files changed

Lines changed: 563 additions & 287 deletions

File tree

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@ OpenCSTL과 대응하는 C++ STL 코드입니다.
177177
E(error.h) --> TREE(tree.h)
178178
E(error.h) --> DQ(deque.h)
179179
E(error.h) --> H(hashtable.h)
180+
VEBT(van_emde_boas_tree.h) --> H(hashtable.h)
181+
VEBT(van_emde_boas_tree.h) --> V(vector.h)
182+
VEBT(van_emde_boas_tree.h) --> DQ(deque.h)
180183
181184
subgraph CONTAINERS[Containers]
182185
V(vector.h)
@@ -199,6 +202,8 @@ OpenCSTL과 대응하는 C++ STL 코드입니다.
199202
ISORT(isort.h) --> MSORT(msort.h)
200203
TSORT(tsort.h) --> SORT(sort.h)
201204
MSORT(msort.h) --> SORT(sort.h)
205+
ITER(iterator.h) --> SORT(sort.h)
206+
ITER(iterator.h) --> ALGO(algorithm.h)
202207
PDQSORT(pdqsort.h) --> SORT(sort.h)
203208
C(crossplatform.h) --> SORT(sort.h)
204209
SORT(sort.h) --> OCSTL(opencstl.h)

assets/blogo.png

13 Bytes
Loading

main.c

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ void cstl_vector_test(void) {
3232
///[777] [0] [1] [999] [999] [999] [999] [999] [4] [5] [6] [7] [8] [-1] [-1]
3333
resize(arr, 15, -1);
3434

35-
for (int *it = begin(arr); it != end(arr); it++) {
35+
for (int *it = begin(arr); it != end(arr); it = next(it)) {
3636
printf("[%d] ", *it);
3737
}
3838
puts("");
@@ -206,8 +206,11 @@ void cstl_deque_test(void) {
206206
push_front(deque, i);
207207
}
208208
printf("deque pf size: %d\n", size(deque));
209-
for (int i = 0; i < size(deque); i++) {
210-
printf("[%3d]", deque[i]);
209+
// for (int i = 0; i < size(deque); i++) {
210+
// printf("[%3d]", deque[i]);
211+
// }
212+
for (int *it = begin(deque); it != end(deque); it = next(it)) {
213+
printf("[%d]", *it);
211214
}
212215
puts("");
213216

@@ -394,10 +397,23 @@ void test02(void) {
394397
push_back(v, rand32() % 1000);
395398
}
396399

397-
qsort(v,size(v), sizeof(int),GREATER(int));
400+
int *max_ptr = max_element(begin(v), end(v));
401+
printf("max_ptr : %d\n", *max_ptr);
402+
403+
int *min_ptr = min_element(begin(v), end(v));
404+
printf("min_ptr : %d\n", *min_ptr);
405+
406+
qsort(v,size(v), sizeof(int),LESS(int));
398407

399408
watch t_end = chrono.now();
400409

410+
if (is_sorted(v)) {
411+
puts("sorted");
412+
}
413+
414+
int val = 888;
415+
fill(begin(v), end(v), val);
416+
fill(begin(v), end(v), 777);
401417
double ms = chrono.duration(t_beg, t_end);
402418
for (int i = 0; i < size(v); i++) {
403419
printf("[%4d]\n", v[i]);
@@ -500,12 +516,11 @@ void test_sort(void) {
500516
// };
501517

502518
int main(void) {
503-
504519
// printf("%d\n",numeric_limits(int).max);
505520
// return 0;
506521

507522
// test_sort();
508-
// cstl_list_test02();
523+
// test02();
509524
// return 0;
510525

511526
logging.info(opencstl_env());

opencstl/algorithm.h

Lines changed: 80 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,28 @@
88

99

1010
#include "defines.h"
11+
#include "compare.h"
12+
#include "iterator.h"
13+
#include "van_emde_boas_tree.h"
14+
15+
bool is_even(void *it) {
16+
}
17+
18+
#define fill(_First, _Last, _Value) _cstl_fill(_First, _Last, &(__typeof__(_Value)){_Value}, sizeof(_Value))
19+
OPENCSTL_FUNC void _cstl_fill(void *_begin, void *_end, void *_value, size_t _value_size) {
20+
void *it = _begin;
21+
while (it != _end) {
22+
memcpy(it, _value, _value_size);
23+
it = cstl_next(it);
24+
}
25+
}
26+
27+
// ███╗░░░███╗██╗███╗░░██╗░░░░██╗███╗░░░███╗░█████╗░██╗░░██╗
28+
// ████╗░████║██║████╗░██║░░░██╔╝████╗░████║██╔══██╗╚██╗██╔╝
29+
// ██╔████╔██║██║██╔██╗██║░░██╔╝░██╔████╔██║███████║░╚███╔╝░
30+
// ██║╚██╔╝██║██║██║╚████║░██╔╝░░██║╚██╔╝██║██╔══██║░██╔██╗░
31+
// ██║░╚═╝░██║██║██║░╚███║██╔╝░░░██║░╚═╝░██║██║░░██║██╔╝╚██╗
32+
// ╚═╝░░░░░╚═╝╚═╝╚═╝░░╚══╝╚═╝░░░░╚═╝░░░░░╚═╝╚═╝░░╚═╝╚═╝░░╚═╝
1133

1234
#ifndef MAX
1335
#define MAX(a,b) ((a)>(b)?(a):(b))
@@ -16,19 +38,67 @@
1638
#define MIN(a,b) ((a)<(b)?(a):(b))
1739
#endif
1840

19-
OPENCSTL_FUNC void fill(void *container, ...) {
20-
va_list vl;
21-
void *va_ptr = NULL;
22-
__cstl_va_start(vl, container, va_ptr);
23-
#if CSTL_USE_VAARG
24-
void *param1 = __cstl_va_arg_next(vl);
25-
#else
26-
void *param1 = __cstl_va_arg(va_ptr);
27-
#endif
2841

42+
#define max_element(...) _MAX_ELEMENT_DISPATCH(__VA_ARGS__, NULL)
43+
#define _MAX_ELEMENT_DISPATCH(_begin, _end, _cmp, ...) _cstl_max_element(_begin, _end, (_OpenCSTLCompareFunc)(_cmp))
2944

30-
__cstl_va_end(vl);
45+
OPENCSTL_FUNC void *_cstl_max_element(void *_begin, void *_end, _OpenCSTLCompareFunc _cmp) {
46+
if (_begin == _end) {
47+
return _end;
48+
}
49+
50+
if (_cmp == NULL) {
51+
Interval *tm = iveb_find(iveb, _begin);
52+
_cmp = LESS(tm->type_name);
53+
if (_cmp == NULL) {
54+
_cmp = _memcmp_funcs[tm->type_size];
55+
}
56+
if (_cmp == NULL) {
57+
cstl_error("Compare function is NULL");
58+
return _end;
59+
}
60+
}
61+
62+
void *max_it = _begin;
63+
void *it = cstl_next(_begin);
64+
while (it != _end) {
65+
if (_cmp(it, max_it) > 0) {
66+
max_it = it;
67+
}
68+
it = cstl_next(it);
69+
}
70+
return max_it;
3171
}
3272

73+
#define min_element(...) _MIN_ELEMENT_DISPATCH(__VA_ARGS__, NULL)
74+
#define _MIN_ELEMENT_DISPATCH(_begin, _end, _cmp, ...) _cstl_min_element(_begin, _end, (_OpenCSTLCompareFunc)(_cmp))
75+
76+
OPENCSTL_FUNC void *_cstl_min_element(void *_begin, void *_end, _OpenCSTLCompareFunc _cmp) {
77+
if (_begin == _end) {
78+
return _end;
79+
}
80+
81+
if (_cmp == NULL) {
82+
Interval *tm = iveb_find(iveb, _begin);
83+
_cmp = LESS(tm->type_name);
84+
if (_cmp == NULL) {
85+
_cmp = _memcmp_funcs[tm->type_size];
86+
}
87+
if (_cmp == NULL) {
88+
cstl_error("Compare function is NULL");
89+
return _end;
90+
}
91+
}
92+
93+
void *min_it = _begin;
94+
void *it = cstl_next(_begin);
95+
while (it != _end) {
96+
if (_cmp(it, min_it) < 0) {
97+
min_it = it;
98+
}
99+
it = cstl_next(it);
100+
}
101+
return min_it;
102+
}
33103

34104
#endif //_OPENCSTL_C_ALGORITHM_H

opencstl/defines.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,6 @@ OPENCSTL_DEQUE_NIDX(&container, NIDX_CTYPE) == OPENCSTL_STACK ?_cstl_stack_top(&
188188
(OPENCSTL_NIDX(((void**)&container), NIDX_CTYPE)==OPENCSTL_PRIORITY_QUEUE?(*container):(container[cstl_error("Invalid Operation")])) //priority queue
189189

190190

191-
192191
#define cstl_reserve(container,n) _cstl_reserve(&(container),n)
193192

194193

opencstl/deque.h

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#define _OPENCSTL_DEQUE_H
3939
#include "error.h"
4040
#include "zalloc.h"
41+
#include "van_emde_boas_tree.h"
4142
#ifdef _MSC_VER
4243
#pragma warning(disable:4146)
4344
#pragma warning(disable:4308)
@@ -71,6 +72,15 @@ OPENCSTL_FUNC void *__cstl_deque(size_t type_size, char *type) {
7172
OPENCSTL_NIDX(container, -2) = 0; // length
7273
*container = (char *) ptr + type_size;
7374
OPENCSTL_NIDX(container, -1) = -type_size - 1;
75+
bool iveb_init = false;
76+
if (iveb == NULL) {
77+
iveb = iveb_new();
78+
iveb_init = true;
79+
}
80+
iveb_insert(iveb, ptr, (char *) ptr + (type_size * 2), CT_DEQUE, type_size, type);
81+
if (iveb_init) {
82+
atexit(__opencstl_iveb_destroy);
83+
}
7484
return ptr;
7585
}
7686

@@ -90,6 +100,7 @@ OPENCSTL_FUNC void __cstl_deque_assign(void **container, size_t n, void *value)
90100
#endif
91101

92102
capacity = n;
103+
iveb_erase(iveb, (char *) *container + distance);
93104
void *b = zalloc(1, header_sz + capacity * type_size);
94105
memcpy(b, (char *) *container - header_sz + distance, header_sz);
95106
zfree(((char *) *container) - header_sz + distance);
@@ -98,6 +109,7 @@ OPENCSTL_FUNC void __cstl_deque_assign(void **container, size_t n, void *value)
98109
distance = 0;
99110
*(size_t *) ((char *) *(void **) container + -3 * sizeof(size_t) + distance) = n;
100111
*(size_t *) ((char *) *(void **) container + -2 * sizeof(size_t) + distance) = n;
112+
iveb_insert(iveb, *container, (char *) (*container) + (type_size * n), CT_DEQUE, type_size, type);
101113

102114
if (value == NULL) {
103115
memset((char *) *container, 0, n * type_size);
@@ -114,7 +126,7 @@ OPENCSTL_FUNC void __cstl_deque_push_back(void **container, void *value) {
114126
size_t type_size = *(size_t *) ((char *) *(void **) container + NIDX_TSIZE * sizeof(size_t) + distance);
115127
size_t length = *(size_t *) ((char *) *(void **) container + -2 * sizeof(size_t) + distance);
116128
size_t capacity = *(size_t *) ((char *) *(void **) container + -3 * sizeof(size_t) + distance);
117-
//char *type = (char *) *(size_t *) ((char *) *(void **) container + -4 * sizeof(size_t) + distance);
129+
char *type = (char *) *(size_t *) ((char *) *(void **) container + -4 * sizeof(size_t) + distance);
118130

119131
#if !defined(__linux__) && !defined(__APPLE__)
120132
size_t is_float = *(size_t *) ((char *) *(void **) container + -8 * sizeof(size_t) + distance);
@@ -127,15 +139,19 @@ OPENCSTL_FUNC void __cstl_deque_push_back(void **container, void *value) {
127139

128140
if (length == capacity + distance / (ptrdiff_t) type_size) {
129141
size_t distance_sz = -distance;
130-
void *b = zalloc(1, header_sz + capacity * 2 * type_size);
142+
size_t new_capacity = capacity * 2;
143+
iveb_erase(iveb, (char *) *container + distance);
144+
void *b = zalloc(1, header_sz + new_capacity * type_size);
131145
memcpy(b, (char *) *container - (header_sz + distance_sz), header_sz);
132-
distance = capacity * 2 / 4;
146+
distance = new_capacity / 4;
133147
memcpy((char *) b + header_sz + distance * type_size, *container, length * type_size);
134148
zfree((char *) *container - (header_sz + distance_sz));
135149
*container = ((char *) b + (header_sz + distance * type_size));
136150
distance = -distance * type_size;
137151
*(size_t *) ((char *) *(void **) container + -3 * sizeof(size_t) + distance) *= 2;
138152
OPENCSTL_NIDX(container, -1) = distance - 1;
153+
iveb_insert(iveb, (char *) *container + distance,
154+
(char *) *container + distance + (type_size * new_capacity), CT_DEQUE, type_size, type);
139155
}
140156
memcpy((char *) *container + type_size * length, value, type_size);
141157

@@ -148,7 +164,7 @@ OPENCSTL_FUNC void __cstl_deque_push_front(void **container, void *value) {
148164
size_t type_size = *(size_t *) ((char *) *(void **) container + NIDX_TSIZE * sizeof(size_t) + distance);
149165
size_t length = *(size_t *) ((char *) *(void **) container + -2 * sizeof(size_t) + distance);
150166
size_t capacity = *(size_t *) ((char *) *(void **) container + -3 * sizeof(size_t) + distance);
151-
//char *type = (char *) *(size_t *) ((char *) *(void **) container + -4 * sizeof(size_t) + distance);
167+
char *type = (char *) *(size_t *) ((char *) *(void **) container + -4 * sizeof(size_t) + distance);
152168

153169
#if !defined(__linux__) && !defined(__APPLE__)
154170
size_t is_float = *(size_t *) ((char *) *(void **) container + -8 * sizeof(size_t) + distance);
@@ -159,14 +175,18 @@ OPENCSTL_FUNC void __cstl_deque_push_front(void **container, void *value) {
159175
}
160176
#endif
161177
if (distance == 0) {
162-
void *b = zalloc(1, header_sz + capacity * 2 * type_size);
178+
size_t new_capacity = capacity * 2;
179+
iveb_erase(iveb, (char *) *container);
180+
void *b = zalloc(1, header_sz + new_capacity * type_size);
163181
memcpy(b, (char *) *container - header_sz, header_sz);
164-
distance = capacity * 2 / 4;
182+
distance = new_capacity / 4;
165183
memcpy((char *) b + header_sz + distance * type_size, *container, length * type_size);
166184
zfree((char *) *container - header_sz);
167185
*container = ((char *) b + (header_sz + distance * type_size));
168186
distance = -distance * type_size;
169187
*(size_t *) ((char *) *(void **) container + -3 * sizeof(size_t) + distance) *= 2;
188+
iveb_insert(iveb, (char *) *container + distance,
189+
(char *) *container + distance + (type_size * new_capacity), CT_DEQUE, type_size, type);
170190
}
171191
memcpy((char *) *container - type_size * 2, (char *) *container - type_size, type_size);
172192
memcpy((char *) *container - type_size, value, type_size);
@@ -204,7 +224,7 @@ OPENCSTL_FUNC void __cstl_deque_insert(void **container, void *it, size_t n, voi
204224
size_t type_size = *(size_t *) ((char *) *(void **) container + NIDX_TSIZE * sizeof(size_t) + distance);
205225
size_t length = *(size_t *) ((char *) *(void **) container + -2 * sizeof(size_t) + distance);
206226
size_t capacity = *(size_t *) ((char *) *(void **) container + -3 * sizeof(size_t) + distance);
207-
//char *type = (char *) *(size_t *) ((char *) *(void **) container + -4 * sizeof(size_t) + distance);
227+
char *type = (char *) *(size_t *) ((char *) *(void **) container + -4 * sizeof(size_t) + distance);
208228

209229
#if !defined(__linux__) && !defined(__APPLE__)
210230
size_t is_float = *(size_t *) ((char *) *(void **) container + -8 * sizeof(size_t) + distance);
@@ -216,10 +236,14 @@ OPENCSTL_FUNC void __cstl_deque_insert(void **container, void *it, size_t n, voi
216236
#endif
217237
size_t pos = (*(char **) it - *(char **) container) / type_size;
218238
if (length + n > capacity + distance / (ptrdiff_t) type_size) {
239+
iveb_erase(iveb, (char *) *container + distance);
219240
capacity += n;
220-
void *b = realloc((char *) *container - header_sz + distance, header_sz + capacity * type_size - distance);
241+
size_t alloc_sz = header_sz + capacity * type_size - distance;
242+
void *b = realloc((char *) *container - header_sz + distance, alloc_sz);
221243
*container = (char *) b + header_sz - distance;
222244
*(size_t *) ((char *) *(void **) container + -3 * sizeof(size_t) + distance) += n;
245+
iveb_insert(iveb, (char *) *container + distance,
246+
(char *) b + alloc_sz, CT_DEQUE, type_size, type);
223247
}
224248
memcpy((char *) *container + (pos + n) * type_size, (char *) *container + pos * type_size,
225249
(length - pos) * type_size);
@@ -257,7 +281,7 @@ OPENCSTL_FUNC void __cstl_deque_resize(void **container, size_t n, void *value)
257281
size_t type_size = *(size_t *) ((char *) *(void **) container + NIDX_TSIZE * sizeof(size_t) + distance);
258282
size_t length = *(size_t *) ((char *) *(void **) container + -2 * sizeof(size_t) + distance);
259283
size_t capacity = *(size_t *) ((char *) *(void **) container + -3 * sizeof(size_t) + distance);
260-
//char *type = (char *) *(size_t *) ((char *) *(void **) container + -4 * sizeof(size_t) + distance);
284+
char *type = (char *) *(size_t *) ((char *) *(void **) container + -4 * sizeof(size_t) + distance);
261285

262286
#if !defined(__linux__) && !defined(__APPLE__)
263287
size_t is_float = *(size_t *) ((char *) *(void **) container + -8 * sizeof(size_t) + distance);
@@ -269,6 +293,7 @@ OPENCSTL_FUNC void __cstl_deque_resize(void **container, size_t n, void *value)
269293
#endif
270294
if (capacity + distance / (ptrdiff_t) type_size < n) {
271295
capacity = n;
296+
iveb_erase(iveb, (char *) *container + distance);
272297
void *b = zalloc(1, header_sz + capacity * type_size);
273298
memcpy(b, (char *) *container - header_sz + distance, header_sz);
274299
memcpy((char *) b + header_sz, *container, length * type_size);
@@ -277,6 +302,7 @@ OPENCSTL_FUNC void __cstl_deque_resize(void **container, size_t n, void *value)
277302
OPENCSTL_NIDX(container, -1) = -1;
278303
distance = 0;
279304
*(size_t *) ((char *) *(void **) container + -3 * sizeof(size_t) + distance) = n;
305+
iveb_insert(iveb, *container, (char *) (*container) + (type_size * n), CT_DEQUE, type_size, type);
280306
}
281307
*(size_t *) ((char *) *(void **) container + -2 * sizeof(size_t) + distance) = n;
282308
if (length < n) {
@@ -327,6 +353,7 @@ OPENCSTL_FUNC void __cstl_deque_free(void **container) {
327353
ptrdiff_t distance = OPENCSTL_NIDX(container, -1) + 1;
328354
size_t header_sz = *(size_t *) ((char *) *(void **) container + NIDX_HSIZE * sizeof(size_t) + distance);
329355

356+
iveb_erase(iveb, (char *) *container + distance);
330357
zfree((char *) *container - (header_sz - distance));
331358
}
332359

0 commit comments

Comments
 (0)