summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/stc/algo/sort.h14
-rw-r--r--include/stc/carc.h76
-rw-r--r--include/stc/cbox.h74
-rw-r--r--include/stc/cdeq.h100
-rw-r--r--include/stc/clist.h212
-rw-r--r--include/stc/cmap.h194
-rw-r--r--include/stc/cpque.h84
-rw-r--r--include/stc/cqueue.h130
-rw-r--r--include/stc/csmap.h264
-rw-r--r--include/stc/cstack.h102
-rw-r--r--include/stc/cvec.h220
-rw-r--r--include/stc/extend.h2
-rw-r--r--include/stc/priv/template.h22
13 files changed, 747 insertions, 747 deletions
diff --git a/include/stc/algo/sort.h b/include/stc/algo/sort.h
index 2e73b0fb..291d90a6 100644
--- a/include/stc/algo/sort.h
+++ b/include/stc/algo/sort.h
@@ -52,12 +52,12 @@ int main() {
typedef i_val i_type;
#endif
#ifndef i_at
- #define i_at(arr, idx) _cx_memb(_at_mut)(arr, idx)
+ #define i_at(arr, idx) _cx_MEMB(_at_mut)(arr, idx)
#endif
#include "../priv/template.h"
-static inline void _cx_memb(_insertsort_ij)(_cx_self* arr, intptr_t lo, intptr_t hi) {
+static inline void _cx_MEMB(_insertsort_ij)(_cx_Self* arr, intptr_t lo, intptr_t hi) {
for (intptr_t j = lo, i = lo + 1; i <= hi; j = i, ++i) {
i_val key = *i_at(arr, i);
while (j >= 0 && (i_less((&key), i_at(arr, j)))) {
@@ -68,7 +68,7 @@ static inline void _cx_memb(_insertsort_ij)(_cx_self* arr, intptr_t lo, intptr_t
}
}
-static inline void _cx_memb(_sort_ij)(_cx_self* arr, intptr_t lo, intptr_t hi) {
+static inline void _cx_MEMB(_sort_ij)(_cx_Self* arr, intptr_t lo, intptr_t hi) {
intptr_t i = lo, j;
while (lo < hi) {
i_val pivot = *i_at(arr, lo + (hi - lo)*7/16);
@@ -87,14 +87,14 @@ static inline void _cx_memb(_sort_ij)(_cx_self* arr, intptr_t lo, intptr_t hi) {
c_swap(intptr_t, &hi, &j);
}
- if (j - lo > 64) _cx_memb(_sort_ij)(arr, lo, j);
- else if (j > lo) _cx_memb(_insertsort_ij)(arr, lo, j);
+ if (j - lo > 64) _cx_MEMB(_sort_ij)(arr, lo, j);
+ else if (j > lo) _cx_MEMB(_insertsort_ij)(arr, lo, j);
lo = i;
}
}
-static inline void _cx_memb(_sort_n)(_cx_self* arr, intptr_t len) {
- _cx_memb(_sort_ij)(arr, 0, len - 1);
+static inline void _cx_MEMB(_sort_n)(_cx_Self* arr, intptr_t len) {
+ _cx_MEMB(_sort_ij)(arr, 0, len - 1);
}
#include "../priv/template2.h"
diff --git a/include/stc/carc.h b/include/stc/carc.h
index 749b1fc1..3b60fe78 100644
--- a/include/stc/carc.h
+++ b/include/stc/carc.h
@@ -91,119 +91,119 @@ typedef i_keyraw _cx_raw;
#define _i_atomic_dec_and_test(v) !(--*(v))
#endif
#ifndef i_is_forward
-_cx_deftypes(_c_carc_types, _cx_self, i_key);
+_cx_DEFTYPES(_c_carc_types, _cx_Self, i_key);
#endif
-struct _cx_memb(_rep_) { catomic_long counter; i_key value; };
+struct _cx_MEMB(_rep_) { catomic_long counter; i_key value; };
-STC_INLINE _cx_self _cx_memb(_init)(void)
- { return c_LITERAL(_cx_self){NULL, NULL}; }
+STC_INLINE _cx_Self _cx_MEMB(_init)(void)
+ { return c_LITERAL(_cx_Self){NULL, NULL}; }
-STC_INLINE long _cx_memb(_use_count)(const _cx_self* self)
+STC_INLINE long _cx_MEMB(_use_count)(const _cx_Self* self)
{ return self->use_count ? *self->use_count : 0; }
-STC_INLINE _cx_self _cx_memb(_from_ptr)(_cx_value* p) {
- _cx_self ptr = {p};
+STC_INLINE _cx_Self _cx_MEMB(_from_ptr)(_cx_value* p) {
+ _cx_Self ptr = {p};
if (p)
*(ptr.use_count = _i_alloc(catomic_long)) = 1;
return ptr;
}
// c++: std::make_shared<_cx_value>(val)
-STC_INLINE _cx_self _cx_memb(_make)(_cx_value val) {
- _cx_self ptr;
- struct _cx_memb(_rep_)* rep = _i_alloc(struct _cx_memb(_rep_));
+STC_INLINE _cx_Self _cx_MEMB(_make)(_cx_value val) {
+ _cx_Self ptr;
+ struct _cx_MEMB(_rep_)* rep = _i_alloc(struct _cx_MEMB(_rep_));
*(ptr.use_count = &rep->counter) = 1;
*(ptr.get = &rep->value) = val;
return ptr;
}
-STC_INLINE _cx_raw _cx_memb(_toraw)(const _cx_self* self)
+STC_INLINE _cx_raw _cx_MEMB(_toraw)(const _cx_Self* self)
{ return i_keyto(self->get); }
-STC_INLINE _cx_self _cx_memb(_move)(_cx_self* self) {
- _cx_self ptr = *self;
+STC_INLINE _cx_Self _cx_MEMB(_move)(_cx_Self* self) {
+ _cx_Self ptr = *self;
self->get = NULL, self->use_count = NULL;
return ptr;
}
-STC_INLINE void _cx_memb(_drop)(_cx_self* self) {
+STC_INLINE void _cx_MEMB(_drop)(_cx_Self* self) {
if (self->use_count && _i_atomic_dec_and_test(self->use_count)) {
i_keydrop(self->get);
- if ((char *)self->get != (char *)self->use_count + offsetof(struct _cx_memb(_rep_), value))
+ if ((char *)self->get != (char *)self->use_count + offsetof(struct _cx_MEMB(_rep_), value))
i_free(self->get);
i_free((long*)self->use_count);
}
}
-STC_INLINE void _cx_memb(_reset)(_cx_self* self) {
- _cx_memb(_drop)(self);
+STC_INLINE void _cx_MEMB(_reset)(_cx_Self* self) {
+ _cx_MEMB(_drop)(self);
self->use_count = NULL, self->get = NULL;
}
-STC_INLINE void _cx_memb(_reset_to)(_cx_self* self, _cx_value* p) {
- _cx_memb(_drop)(self);
- *self = _cx_memb(_from_ptr)(p);
+STC_INLINE void _cx_MEMB(_reset_to)(_cx_Self* self, _cx_value* p) {
+ _cx_MEMB(_drop)(self);
+ *self = _cx_MEMB(_from_ptr)(p);
}
#ifndef i_no_emplace
-STC_INLINE _cx_self _cx_memb(_from)(_cx_raw raw)
- { return _cx_memb(_make)(i_keyfrom(raw)); }
+STC_INLINE _cx_Self _cx_MEMB(_from)(_cx_raw raw)
+ { return _cx_MEMB(_make)(i_keyfrom(raw)); }
#else
-STC_INLINE _cx_self _cx_memb(_from)(_cx_value val)
- { return _cx_memb(_make)(val); }
+STC_INLINE _cx_Self _cx_MEMB(_from)(_cx_value val)
+ { return _cx_MEMB(_make)(val); }
#endif
// does not use i_keyclone, so OK to always define.
-STC_INLINE _cx_self _cx_memb(_clone)(_cx_self ptr) {
+STC_INLINE _cx_Self _cx_MEMB(_clone)(_cx_Self ptr) {
if (ptr.use_count)
_i_atomic_inc(ptr.use_count);
return ptr;
}
// take ownership of unowned
-STC_INLINE void _cx_memb(_take)(_cx_self* self, _cx_self unowned) {
- _cx_memb(_drop)(self);
+STC_INLINE void _cx_MEMB(_take)(_cx_Self* self, _cx_Self unowned) {
+ _cx_MEMB(_drop)(self);
*self = unowned;
}
// share ownership with ptr
-STC_INLINE void _cx_memb(_assign)(_cx_self* self, _cx_self ptr) {
+STC_INLINE void _cx_MEMB(_assign)(_cx_Self* self, _cx_Self ptr) {
if (ptr.use_count)
_i_atomic_inc(ptr.use_count);
- _cx_memb(_drop)(self);
+ _cx_MEMB(_drop)(self);
*self = ptr;
}
#ifndef i_no_cmp
-STC_INLINE int _cx_memb(_raw_cmp)(const _cx_raw* rx, const _cx_raw* ry)
+STC_INLINE int _cx_MEMB(_raw_cmp)(const _cx_raw* rx, const _cx_raw* ry)
{ return i_cmp(rx, ry); }
-STC_INLINE int _cx_memb(_cmp)(const _cx_self* self, const _cx_self* other) {
+STC_INLINE int _cx_MEMB(_cmp)(const _cx_Self* self, const _cx_Self* other) {
_cx_raw rx = i_keyto(self->get), ry = i_keyto(other->get);
return i_cmp((&rx), (&ry));
}
#endif
#ifdef _i_eq
-STC_INLINE bool _cx_memb(_raw_eq)(const _cx_raw* rx, const _cx_raw* ry)
+STC_INLINE bool _cx_MEMB(_raw_eq)(const _cx_raw* rx, const _cx_raw* ry)
{ return i_eq(rx, ry); }
-STC_INLINE bool _cx_memb(_eq)(const _cx_self* self, const _cx_self* other) {
+STC_INLINE bool _cx_MEMB(_eq)(const _cx_Self* self, const _cx_Self* other) {
_cx_raw rx = i_keyto(self->get), ry = i_keyto(other->get);
return i_eq((&rx), (&ry));
}
#elif !defined i_no_cmp
-STC_INLINE bool _cx_memb(_raw_eq)(const _cx_raw* rx, const _cx_raw* ry)
+STC_INLINE bool _cx_MEMB(_raw_eq)(const _cx_raw* rx, const _cx_raw* ry)
{ return i_cmp(rx, ry) == 0; }
-STC_INLINE bool _cx_memb(_eq)(const _cx_self* self, const _cx_self* other)
- { return _cx_memb(_cmp)(self, other) == 0; }
+STC_INLINE bool _cx_MEMB(_eq)(const _cx_Self* self, const _cx_Self* other)
+ { return _cx_MEMB(_cmp)(self, other) == 0; }
#endif
#ifndef i_no_hash
-STC_INLINE uint64_t _cx_memb(_raw_hash)(const _cx_raw* rx)
+STC_INLINE uint64_t _cx_MEMB(_raw_hash)(const _cx_raw* rx)
{ return i_hash(rx); }
-STC_INLINE uint64_t _cx_memb(_hash)(const _cx_self* self)
+STC_INLINE uint64_t _cx_MEMB(_hash)(const _cx_Self* self)
{ _cx_raw rx = i_keyto(self->get); return i_hash((&rx)); }
#endif
diff --git a/include/stc/cbox.h b/include/stc/cbox.h
index d7f6246d..86283ad7 100644
--- a/include/stc/cbox.h
+++ b/include/stc/cbox.h
@@ -77,119 +77,119 @@ int main() {
typedef i_keyraw _cx_raw;
#ifndef i_is_forward
-_cx_deftypes(_c_cbox_types, _cx_self, i_key);
+_cx_DEFTYPES(_c_cbox_types, _cx_Self, i_key);
#endif
// constructors (take ownership)
-STC_INLINE _cx_self _cx_memb(_init)(void)
- { return c_LITERAL(_cx_self){NULL}; }
+STC_INLINE _cx_Self _cx_MEMB(_init)(void)
+ { return c_LITERAL(_cx_Self){NULL}; }
-STC_INLINE long _cx_memb(_use_count)(const _cx_self* self)
+STC_INLINE long _cx_MEMB(_use_count)(const _cx_Self* self)
{ return (long)(self->get != NULL); }
-STC_INLINE _cx_self _cx_memb(_from_ptr)(_cx_value* p)
- { return c_LITERAL(_cx_self){p}; }
+STC_INLINE _cx_Self _cx_MEMB(_from_ptr)(_cx_value* p)
+ { return c_LITERAL(_cx_Self){p}; }
// c++: std::make_unique<i_key>(val)
-STC_INLINE _cx_self _cx_memb(_make)(_cx_value val) {
- _cx_self ptr = {_i_alloc(_cx_value)};
+STC_INLINE _cx_Self _cx_MEMB(_make)(_cx_value val) {
+ _cx_Self ptr = {_i_alloc(_cx_value)};
*ptr.get = val; return ptr;
}
-STC_INLINE _cx_raw _cx_memb(_toraw)(const _cx_self* self)
+STC_INLINE _cx_raw _cx_MEMB(_toraw)(const _cx_Self* self)
{ return i_keyto(self->get); }
// destructor
-STC_INLINE void _cx_memb(_drop)(_cx_self* self) {
+STC_INLINE void _cx_MEMB(_drop)(_cx_Self* self) {
if (self->get) {
i_keydrop(self->get);
i_free(self->get);
}
}
-STC_INLINE _cx_self _cx_memb(_move)(_cx_self* self) {
- _cx_self ptr = *self;
+STC_INLINE _cx_Self _cx_MEMB(_move)(_cx_Self* self) {
+ _cx_Self ptr = *self;
self->get = NULL;
return ptr;
}
-STC_INLINE _cx_value* _cx_memb(_release)(_cx_self* self)
- { return _cx_memb(_move)(self).get; }
+STC_INLINE _cx_value* _cx_MEMB(_release)(_cx_Self* self)
+ { return _cx_MEMB(_move)(self).get; }
-STC_INLINE void _cx_memb(_reset)(_cx_self* self) {
- _cx_memb(_drop)(self);
+STC_INLINE void _cx_MEMB(_reset)(_cx_Self* self) {
+ _cx_MEMB(_drop)(self);
self->get = NULL;
}
// take ownership of p
-STC_INLINE void _cx_memb(_reset_to)(_cx_self* self, _cx_value* p) {
- _cx_memb(_drop)(self);
+STC_INLINE void _cx_MEMB(_reset_to)(_cx_Self* self, _cx_value* p) {
+ _cx_MEMB(_drop)(self);
self->get = p;
}
#ifndef i_no_emplace
-STC_INLINE _cx_self _cx_memb(_from)(_cx_raw raw)
- { return _cx_memb(_make)(i_keyfrom(raw)); }
+STC_INLINE _cx_Self _cx_MEMB(_from)(_cx_raw raw)
+ { return _cx_MEMB(_make)(i_keyfrom(raw)); }
#else
-STC_INLINE _cx_self _cx_memb(_from)(_cx_value val)
- { return _cx_memb(_make)(val); }
+STC_INLINE _cx_Self _cx_MEMB(_from)(_cx_value val)
+ { return _cx_MEMB(_make)(val); }
#endif
#if !defined i_no_clone
- STC_INLINE _cx_self _cx_memb(_clone)(_cx_self other) {
+ STC_INLINE _cx_Self _cx_MEMB(_clone)(_cx_Self other) {
if (!other.get)
return other;
- _cx_self out = {_i_alloc(i_key)};
+ _cx_Self out = {_i_alloc(i_key)};
*out.get = i_keyclone((*other.get));
return out;
}
#endif // !i_no_clone
// take ownership of unowned
-STC_INLINE void _cx_memb(_take)(_cx_self* self, _cx_self unowned) {
- _cx_memb(_drop)(self);
+STC_INLINE void _cx_MEMB(_take)(_cx_Self* self, _cx_Self unowned) {
+ _cx_MEMB(_drop)(self);
*self = unowned;
}
// transfer ownership from moved; set moved to NULL
-STC_INLINE void _cx_memb(_assign)(_cx_self* self, _cx_self* moved) {
+STC_INLINE void _cx_MEMB(_assign)(_cx_Self* self, _cx_Self* moved) {
if (moved->get == self->get)
return;
- _cx_memb(_drop)(self);
+ _cx_MEMB(_drop)(self);
*self = *moved;
moved->get = NULL;
}
#ifndef i_no_cmp
-STC_INLINE int _cx_memb(_raw_cmp)(const _cx_raw* rx, const _cx_raw* ry)
+STC_INLINE int _cx_MEMB(_raw_cmp)(const _cx_raw* rx, const _cx_raw* ry)
{ return i_cmp(rx, ry); }
-STC_INLINE int _cx_memb(_cmp)(const _cx_self* self, const _cx_self* other) {
+STC_INLINE int _cx_MEMB(_cmp)(const _cx_Self* self, const _cx_Self* other) {
_cx_raw rx = i_keyto(self->get), ry = i_keyto(other->get);
return i_cmp((&rx), (&ry));
}
#endif
#ifdef _i_eq
-STC_INLINE bool _cx_memb(_raw_eq)(const _cx_raw* rx, const _cx_raw* ry)
+STC_INLINE bool _cx_MEMB(_raw_eq)(const _cx_raw* rx, const _cx_raw* ry)
{ return i_eq(rx, ry); }
-STC_INLINE bool _cx_memb(_eq)(const _cx_self* self, const _cx_self* other) {
+STC_INLINE bool _cx_MEMB(_eq)(const _cx_Self* self, const _cx_Self* other) {
_cx_raw rx = i_keyto(self->get), ry = i_keyto(other->get);
return i_eq((&rx), (&ry));
}
#elif !defined i_no_cmp
-STC_INLINE bool _cx_memb(_raw_eq)(const _cx_raw* rx, const _cx_raw* ry)
+STC_INLINE bool _cx_MEMB(_raw_eq)(const _cx_raw* rx, const _cx_raw* ry)
{ return i_cmp(rx, ry) == 0; }
-STC_INLINE bool _cx_memb(_eq)(const _cx_self* self, const _cx_self* other)
- { return _cx_memb(_cmp)(self, other) == 0; }
+STC_INLINE bool _cx_MEMB(_eq)(const _cx_Self* self, const _cx_Self* other)
+ { return _cx_MEMB(_cmp)(self, other) == 0; }
#endif
#ifndef i_no_hash
-STC_INLINE uint64_t _cx_memb(_raw_hash)(const _cx_raw* rx)
+STC_INLINE uint64_t _cx_MEMB(_raw_hash)(const _cx_raw* rx)
{ return i_hash(rx); }
-STC_INLINE uint64_t _cx_memb(_hash)(const _cx_self* self)
+STC_INLINE uint64_t _cx_MEMB(_hash)(const _cx_Self* self)
{ _cx_raw rx = i_keyto(self->get); return i_hash((&rx)); }
#endif
diff --git a/include/stc/cdeq.h b/include/stc/cdeq.h
index a406c2b0..0eac5a1d 100644
--- a/include/stc/cdeq.h
+++ b/include/stc/cdeq.h
@@ -32,101 +32,101 @@
#endif
#undef _pop
-STC_API _cx_value* _cx_memb(_push_front)(_cx_self* self, i_key value);
-STC_API _cx_iter _cx_memb(_insert_n)(_cx_self* self, intptr_t idx, const _cx_value* arr, intptr_t n);
-STC_API _cx_iter _cx_memb(_insert_uninit)(_cx_self* self, intptr_t idx, intptr_t n);
-STC_API void _cx_memb(_erase_n)(_cx_self* self, intptr_t idx, intptr_t n);
+STC_API _cx_value* _cx_MEMB(_push_front)(_cx_Self* self, i_key value);
+STC_API _cx_iter _cx_MEMB(_insert_n)(_cx_Self* self, intptr_t idx, const _cx_value* arr, intptr_t n);
+STC_API _cx_iter _cx_MEMB(_insert_uninit)(_cx_Self* self, intptr_t idx, intptr_t n);
+STC_API void _cx_MEMB(_erase_n)(_cx_Self* self, intptr_t idx, intptr_t n);
STC_INLINE const _cx_value*
-_cx_memb(_at)(const _cx_self* self, intptr_t idx)
+_cx_MEMB(_at)(const _cx_Self* self, intptr_t idx)
{ return self->data + _cdeq_topos(self, idx); }
STC_INLINE _cx_value*
-_cx_memb(_at_mut)(_cx_self* self, intptr_t idx)
+_cx_MEMB(_at_mut)(_cx_Self* self, intptr_t idx)
{ return self->data + _cdeq_topos(self, idx); }
STC_INLINE _cx_value*
-_cx_memb(_push_back)(_cx_self* self, _cx_value val)
- { return _cx_memb(_push)(self, val); }
+_cx_MEMB(_push_back)(_cx_Self* self, _cx_value val)
+ { return _cx_MEMB(_push)(self, val); }
STC_INLINE void
-_cx_memb(_pop_back)(_cx_self* self) {
- assert(!_cx_memb(_empty)(self));
+_cx_MEMB(_pop_back)(_cx_Self* self) {
+ assert(!_cx_MEMB(_empty)(self));
self->end = (self->end - 1) & self->capmask;
i_keydrop((self->data + self->end));
}
-STC_INLINE _cx_value _cx_memb(_pull_back)(_cx_self* self) { // move back out of deq
- assert(!_cx_memb(_empty)(self));
+STC_INLINE _cx_value _cx_MEMB(_pull_back)(_cx_Self* self) { // move back out of deq
+ assert(!_cx_MEMB(_empty)(self));
self->end = (self->end - 1) & self->capmask;
return self->data[self->end];
}
STC_INLINE _cx_iter
-_cx_memb(_insert_at)(_cx_self* self, _cx_iter it, const _cx_value val) {
+_cx_MEMB(_insert_at)(_cx_Self* self, _cx_iter it, const _cx_value val) {
intptr_t idx = _cdeq_toidx(self, it.pos);
- return _cx_memb(_insert_n)(self, idx, &val, 1);
+ return _cx_MEMB(_insert_n)(self, idx, &val, 1);
}
STC_INLINE _cx_iter
-_cx_memb(_erase_at)(_cx_self* self, _cx_iter it) {
- _cx_memb(_erase_n)(self, _cdeq_toidx(self, it.pos), 1);
+_cx_MEMB(_erase_at)(_cx_Self* self, _cx_iter it) {
+ _cx_MEMB(_erase_n)(self, _cdeq_toidx(self, it.pos), 1);
if (it.pos == self->end) it.ref = NULL;
return it;
}
STC_INLINE _cx_iter
-_cx_memb(_erase_range)(_cx_self* self, _cx_iter it1, _cx_iter it2) {
+_cx_MEMB(_erase_range)(_cx_Self* self, _cx_iter it1, _cx_iter it2) {
intptr_t idx1 = _cdeq_toidx(self, it1.pos);
intptr_t idx2 = _cdeq_toidx(self, it2.pos);
- _cx_memb(_erase_n)(self, idx1, idx2 - idx1);
+ _cx_MEMB(_erase_n)(self, idx1, idx2 - idx1);
if (it1.pos == self->end) it1.ref = NULL;
return it1;
}
#if !defined i_no_emplace
STC_API _cx_iter
-_cx_memb(_emplace_n)(_cx_self* self, intptr_t idx, const _cx_raw* raw, intptr_t n);
+_cx_MEMB(_emplace_n)(_cx_Self* self, intptr_t idx, const _cx_raw* raw, intptr_t n);
STC_INLINE _cx_value*
-_cx_memb(_emplace_front)(_cx_self* self, const _cx_raw raw)
- { return _cx_memb(_push_front)(self, i_keyfrom(raw)); }
+_cx_MEMB(_emplace_front)(_cx_Self* self, const _cx_raw raw)
+ { return _cx_MEMB(_push_front)(self, i_keyfrom(raw)); }
STC_INLINE _cx_value*
-_cx_memb(_emplace_back)(_cx_self* self, const _cx_raw raw)
- { return _cx_memb(_push)(self, i_keyfrom(raw)); }
+_cx_MEMB(_emplace_back)(_cx_Self* self, const _cx_raw raw)
+ { return _cx_MEMB(_push)(self, i_keyfrom(raw)); }
STC_INLINE _cx_iter
-_cx_memb(_emplace_at)(_cx_self* self, _cx_iter it, const _cx_raw raw)
- { return _cx_memb(_insert_at)(self, it, i_keyfrom(raw)); }
+_cx_MEMB(_emplace_at)(_cx_Self* self, _cx_iter it, const _cx_raw raw)
+ { return _cx_MEMB(_insert_at)(self, it, i_keyfrom(raw)); }
#endif
#if defined _i_has_cmp || defined _i_has_eq
-STC_API _cx_iter _cx_memb(_find_in)(_cx_iter p1, _cx_iter p2, _cx_raw raw);
+STC_API _cx_iter _cx_MEMB(_find_in)(_cx_iter p1, _cx_iter p2, _cx_raw raw);
STC_INLINE _cx_iter
-_cx_memb(_find)(const _cx_self* self, _cx_raw raw) {
- return _cx_memb(_find_in)(_cx_memb(_begin)(self), _cx_memb(_end)(self), raw);
+_cx_MEMB(_find)(const _cx_Self* self, _cx_raw raw) {
+ return _cx_MEMB(_find_in)(_cx_MEMB(_begin)(self), _cx_MEMB(_end)(self), raw);
}
STC_INLINE const _cx_value*
-_cx_memb(_get)(const _cx_self* self, _cx_raw raw) {
- return _cx_memb(_find_in)(_cx_memb(_begin)(self), _cx_memb(_end)(self), raw).ref;
+_cx_MEMB(_get)(const _cx_Self* self, _cx_raw raw) {
+ return _cx_MEMB(_find_in)(_cx_MEMB(_begin)(self), _cx_MEMB(_end)(self), raw).ref;
}
STC_INLINE _cx_value*
-_cx_memb(_get_mut)(_cx_self* self, _cx_raw raw)
- { return (_cx_value *) _cx_memb(_get)(self, raw); }
+_cx_MEMB(_get_mut)(_cx_Self* self, _cx_raw raw)
+ { return (_cx_value *) _cx_MEMB(_get)(self, raw); }
#endif
/* -------------------------- IMPLEMENTATION ------------------------- */
#if defined(i_implement) || defined(i_static)
STC_DEF _cx_value*
-_cx_memb(_push_front)(_cx_self* self, i_key value) {
+_cx_MEMB(_push_front)(_cx_Self* self, i_key value) {
intptr_t start = (self->start - 1) & self->capmask;
if (start == self->end) { // full
- _cx_memb(_reserve)(self, self->capmask + 3); // => 2x expand
+ _cx_MEMB(_reserve)(self, self->capmask + 3); // => 2x expand
start = (self->start - 1) & self->capmask;
}
_cx_value *v = self->data + start;
@@ -136,24 +136,24 @@ _cx_memb(_push_front)(_cx_self* self, i_key value) {
}
STC_DEF void
-_cx_memb(_erase_n)(_cx_self* self, const intptr_t idx, const intptr_t n) {
- const intptr_t len = _cx_memb(_size)(self);
+_cx_MEMB(_erase_n)(_cx_Self* self, const intptr_t idx, const intptr_t n) {
+ const intptr_t len = _cx_MEMB(_size)(self);
for (intptr_t i = idx + n - 1; i >= idx; --i)
- i_keydrop(_cx_memb(_at_mut)(self, i));
+ i_keydrop(_cx_MEMB(_at_mut)(self, i));
for (intptr_t i = idx, j = i + n; j < len; ++i, ++j)
- *_cx_memb(_at_mut)(self, i) = *_cx_memb(_at)(self, j);
+ *_cx_MEMB(_at_mut)(self, i) = *_cx_MEMB(_at)(self, j);
self->end = (self->end - n) & self->capmask;
}
STC_DEF _cx_iter
-_cx_memb(_insert_uninit)(_cx_self* self, const intptr_t idx, const intptr_t n) {
- const intptr_t len = _cx_memb(_size)(self);
+_cx_MEMB(_insert_uninit)(_cx_Self* self, const intptr_t idx, const intptr_t n) {
+ const intptr_t len = _cx_MEMB(_size)(self);
_cx_iter it = {._s=self};
if (len + n > self->capmask)
- if (!_cx_memb(_reserve)(self, len + n))
+ if (!_cx_MEMB(_reserve)(self, len + n))
return it;
for (intptr_t i = len - 1, j = i + n; i >= idx; --i, --j)
- *_cx_memb(_at_mut)(self, j) = *_cx_memb(_at)(self, i);
+ *_cx_MEMB(_at_mut)(self, j) = *_cx_MEMB(_at)(self, i);
self->end = (self->end + n) & self->capmask;
it.pos = _cdeq_topos(self, idx);
@@ -162,27 +162,27 @@ _cx_memb(_insert_uninit)(_cx_self* self, const intptr_t idx, const intptr_t n) {
}
STC_DEF _cx_iter
-_cx_memb(_insert_n)(_cx_self* self, const intptr_t idx, const _cx_value* arr, const intptr_t n) {
- _cx_iter it = _cx_memb(_insert_uninit)(self, idx, n);
+_cx_MEMB(_insert_n)(_cx_Self* self, const intptr_t idx, const _cx_value* arr, const intptr_t n) {
+ _cx_iter it = _cx_MEMB(_insert_uninit)(self, idx, n);
for (intptr_t i = idx, j = 0; j < n; ++i, ++j)
- *_cx_memb(_at_mut)(self, i) = arr[j];
+ *_cx_MEMB(_at_mut)(self, i) = arr[j];
return it;
}
#if !defined i_no_emplace
STC_DEF _cx_iter
-_cx_memb(_emplace_n)(_cx_self* self, const intptr_t idx, const _cx_raw* raw, const intptr_t n) {
- _cx_iter it = _cx_memb(_insert_uninit)(self, idx, n);
+_cx_MEMB(_emplace_n)(_cx_Self* self, const intptr_t idx, const _cx_raw* raw, const intptr_t n) {
+ _cx_iter it = _cx_MEMB(_insert_uninit)(self, idx, n);
for (intptr_t i = idx, j = 0; j < n; ++i, ++j)
- *_cx_memb(_at_mut)(self, i) = i_keyfrom(raw[j]);
+ *_cx_MEMB(_at_mut)(self, i) = i_keyfrom(raw[j]);
return it;
}
#endif
#if defined _i_has_cmp || defined _i_has_eq
STC_DEF _cx_iter
-_cx_memb(_find_in)(_cx_iter i1, _cx_iter i2, _cx_raw raw) {
- for (; i1.pos != i2.pos; _cx_memb(_next)(&i1)) {
+_cx_MEMB(_find_in)(_cx_iter i1, _cx_iter i2, _cx_raw raw) {
+ for (; i1.pos != i2.pos; _cx_MEMB(_next)(&i1)) {
const _cx_raw r = i_keyto(i1.ref);
if (i_eq((&raw), (&r)))
break;
diff --git a/include/stc/clist.h b/include/stc/clist.h
index 4d05a3d1..0785a6af 100644
--- a/include/stc/clist.h
+++ b/include/stc/clist.h
@@ -82,77 +82,77 @@
#include "priv/template.h"
#ifndef i_is_forward
- _cx_deftypes(_c_clist_types, _cx_self, i_key);
+ _cx_DEFTYPES(_c_clist_types, _cx_Self, i_key);
#endif
-_cx_deftypes(_c_clist_complete_types, _cx_self, dummy);
+_cx_DEFTYPES(_c_clist_complete_types, _cx_Self, dummy);
typedef i_keyraw _cx_raw;
-STC_API void _cx_memb(_drop)(_cx_self* self);
-STC_API _cx_value* _cx_memb(_push_back)(_cx_self* self, i_key value);
-STC_API _cx_value* _cx_memb(_push_front)(_cx_self* self, i_key value);
-STC_API _cx_iter _cx_memb(_insert_at)(_cx_self* self, _cx_iter it, i_key value);
-STC_API _cx_iter _cx_memb(_erase_at)(_cx_self* self, _cx_iter it);
-STC_API _cx_iter _cx_memb(_erase_range)(_cx_self* self, _cx_iter it1, _cx_iter it2);
+STC_API void _cx_MEMB(_drop)(_cx_Self* self);
+STC_API _cx_value* _cx_MEMB(_push_back)(_cx_Self* self, i_key value);
+STC_API _cx_value* _cx_MEMB(_push_front)(_cx_Self* self, i_key value);
+STC_API _cx_iter _cx_MEMB(_insert_at)(_cx_Self* self, _cx_iter it, i_key value);
+STC_API _cx_iter _cx_MEMB(_erase_at)(_cx_Self* self, _cx_iter it);
+STC_API _cx_iter _cx_MEMB(_erase_range)(_cx_Self* self, _cx_iter it1, _cx_iter it2);
#if !defined i_no_cmp || defined _i_has_eq
-STC_API _cx_iter _cx_memb(_find_in)(_cx_iter it1, _cx_iter it2, _cx_raw val);
-STC_API intptr_t _cx_memb(_remove)(_cx_self* self, _cx_raw val);
+STC_API _cx_iter _cx_MEMB(_find_in)(_cx_iter it1, _cx_iter it2, _cx_raw val);
+STC_API intptr_t _cx_MEMB(_remove)(_cx_Self* self, _cx_raw val);
#endif
#ifndef i_no_cmp
-STC_API bool _cx_memb(_sort_with)(_cx_self* self, int(*cmp)(const _cx_value*, const _cx_value*));
-STC_API int _cx_memb(_sort_cmp_)(const _cx_value*, const _cx_value*);
-STC_INLINE bool _cx_memb(_sort)(_cx_self* self)
- { return _cx_memb(_sort_with)(self, _cx_memb(_sort_cmp_)); }
+STC_API bool _cx_MEMB(_sort_with)(_cx_Self* self, int(*cmp)(const _cx_value*, const _cx_value*));
+STC_API int _cx_MEMB(_sort_cmp_)(const _cx_value*, const _cx_value*);
+STC_INLINE bool _cx_MEMB(_sort)(_cx_Self* self)
+ { return _cx_MEMB(_sort_with)(self, _cx_MEMB(_sort_cmp_)); }
#endif
-STC_API void _cx_memb(_reverse)(_cx_self* self);
-STC_API _cx_iter _cx_memb(_splice)(_cx_self* self, _cx_iter it, _cx_self* other);
-STC_API _cx_self _cx_memb(_split_off)(_cx_self* self, _cx_iter it1, _cx_iter it2);
-STC_API _cx_value* _cx_memb(_push_back_node)(_cx_self* self, _cx_node* node);
-STC_API _cx_value* _cx_memb(_insert_after_node)(_cx_self* self, _cx_node* ref, _cx_node* node);
-STC_API _cx_node* _cx_memb(_unlink_after_node)(_cx_self* self, _cx_node* ref);
-STC_API void _cx_memb(_erase_after_node)(_cx_self* self, _cx_node* ref);
-STC_INLINE _cx_node* _cx_memb(_get_node)(_cx_value* pval) { return _clist_tonode(pval); }
-STC_INLINE _cx_node* _cx_memb(_unlink_front_node)(_cx_self* self)
- { return _cx_memb(_unlink_after_node)(self, self->last); }
+STC_API void _cx_MEMB(_reverse)(_cx_Self* self);
+STC_API _cx_iter _cx_MEMB(_splice)(_cx_Self* self, _cx_iter it, _cx_Self* other);
+STC_API _cx_Self _cx_MEMB(_split_off)(_cx_Self* self, _cx_iter it1, _cx_iter it2);
+STC_API _cx_value* _cx_MEMB(_push_back_node)(_cx_Self* self, _cx_node* node);
+STC_API _cx_value* _cx_MEMB(_insert_after_node)(_cx_Self* self, _cx_node* ref, _cx_node* node);
+STC_API _cx_node* _cx_MEMB(_unlink_after_node)(_cx_Self* self, _cx_node* ref);
+STC_API void _cx_MEMB(_erase_after_node)(_cx_Self* self, _cx_node* ref);
+STC_INLINE _cx_node* _cx_MEMB(_get_node)(_cx_value* pval) { return _clist_tonode(pval); }
+STC_INLINE _cx_node* _cx_MEMB(_unlink_front_node)(_cx_Self* self)
+ { return _cx_MEMB(_unlink_after_node)(self, self->last); }
#if !defined i_no_clone
-STC_API _cx_self _cx_memb(_clone)(_cx_self cx);
-STC_INLINE i_key _cx_memb(_value_clone)(i_key val) { return i_keyclone(val); }
+STC_API _cx_Self _cx_MEMB(_clone)(_cx_Self cx);
+STC_INLINE i_key _cx_MEMB(_value_clone)(i_key val) { return i_keyclone(val); }
STC_INLINE void
-_cx_memb(_copy)(_cx_self *self, const _cx_self* other) {
+_cx_MEMB(_copy)(_cx_Self *self, const _cx_Self* other) {
if (self->last == other->last) return;
- _cx_memb(_drop)(self); *self = _cx_memb(_clone)(*other);
+ _cx_MEMB(_drop)(self); *self = _cx_MEMB(_clone)(*other);
}
#endif // !i_no_clone
#if !defined i_no_emplace
-STC_INLINE _cx_value* _cx_memb(_emplace_back)(_cx_self* self, _cx_raw raw)
- { return _cx_memb(_push_back)(self, i_keyfrom(raw)); }
-STC_INLINE _cx_value* _cx_memb(_emplace_front)(_cx_self* self, _cx_raw raw)
- { return _cx_memb(_push_front)(self, i_keyfrom(raw)); }
-STC_INLINE _cx_iter _cx_memb(_emplace_at)(_cx_self* self, _cx_iter it, _cx_raw raw)
- { return _cx_memb(_insert_at)(self, it, i_keyfrom(raw)); }
-STC_INLINE _cx_value* _cx_memb(_emplace)(_cx_self* self, _cx_raw raw)
- { return _cx_memb(_push_back)(self, i_keyfrom(raw)); }
+STC_INLINE _cx_value* _cx_MEMB(_emplace_back)(_cx_Self* self, _cx_raw raw)
+ { return _cx_MEMB(_push_back)(self, i_keyfrom(raw)); }
+STC_INLINE _cx_value* _cx_MEMB(_emplace_front)(_cx_Self* self, _cx_raw raw)
+ { return _cx_MEMB(_push_front)(self, i_keyfrom(raw)); }
+STC_INLINE _cx_iter _cx_MEMB(_emplace_at)(_cx_Self* self, _cx_iter it, _cx_raw raw)
+ { return _cx_MEMB(_insert_at)(self, it, i_keyfrom(raw)); }
+STC_INLINE _cx_value* _cx_MEMB(_emplace)(_cx_Self* self, _cx_raw raw)
+ { return _cx_MEMB(_push_back)(self, i_keyfrom(raw)); }
#endif // !i_no_emplace
-STC_INLINE _cx_self _cx_memb(_init)(void) { return c_LITERAL(_cx_self){NULL}; }
-STC_INLINE void _cx_memb(_put_n)(_cx_self* self, const _cx_raw* raw, intptr_t n)
- { while (n--) _cx_memb(_push_back)(self, i_keyfrom(*raw++)); }
-STC_INLINE _cx_self _cx_memb(_from_n)(const _cx_raw* raw, intptr_t n)
- { _cx_self cx = {0}; _cx_memb(_put_n)(&cx, raw, n); return cx; }
-STC_INLINE bool _cx_memb(_reserve)(_cx_self* self, intptr_t n) { (void)(self + n); return true; }
-STC_INLINE bool _cx_memb(_empty)(const _cx_self* self) { return self->last == NULL; }
-STC_INLINE void _cx_memb(_clear)(_cx_self* self) { _cx_memb(_drop)(self); }
-STC_INLINE _cx_value* _cx_memb(_push)(_cx_self* self, i_key value)
- { return _cx_memb(_push_back)(self, value); }
-STC_INLINE void _cx_memb(_pop_front)(_cx_self* self)
- { assert(!_cx_memb(_empty)(self)); _cx_memb(_erase_after_node)(self, self->last); }
-STC_INLINE _cx_value* _cx_memb(_front)(const _cx_self* self) { return &self->last->next->value; }
-STC_INLINE _cx_value* _cx_memb(_back)(const _cx_self* self) { return &self->last->value; }
-STC_INLINE _cx_raw _cx_memb(_value_toraw)(const _cx_value* pval) { return i_keyto(pval); }
-STC_INLINE void _cx_memb(_value_drop)(_cx_value* pval) { i_keydrop(pval); }
+STC_INLINE _cx_Self _cx_MEMB(_init)(void) { return c_LITERAL(_cx_Self){NULL}; }
+STC_INLINE void _cx_MEMB(_put_n)(_cx_Self* self, const _cx_raw* raw, intptr_t n)
+ { while (n--) _cx_MEMB(_push_back)(self, i_keyfrom(*raw++)); }
+STC_INLINE _cx_Self _cx_MEMB(_from_n)(const _cx_raw* raw, intptr_t n)
+ { _cx_Self cx = {0}; _cx_MEMB(_put_n)(&cx, raw, n); return cx; }
+STC_INLINE bool _cx_MEMB(_reserve)(_cx_Self* self, intptr_t n) { (void)(self + n); return true; }
+STC_INLINE bool _cx_MEMB(_empty)(const _cx_Self* self) { return self->last == NULL; }
+STC_INLINE void _cx_MEMB(_clear)(_cx_Self* self) { _cx_MEMB(_drop)(self); }
+STC_INLINE _cx_value* _cx_MEMB(_push)(_cx_Self* self, i_key value)
+ { return _cx_MEMB(_push_back)(self, value); }
+STC_INLINE void _cx_MEMB(_pop_front)(_cx_Self* self)
+ { assert(!_cx_MEMB(_empty)(self)); _cx_MEMB(_erase_after_node)(self, self->last); }
+STC_INLINE _cx_value* _cx_MEMB(_front)(const _cx_Self* self) { return &self->last->next->value; }
+STC_INLINE _cx_value* _cx_MEMB(_back)(const _cx_Self* self) { return &self->last->value; }
+STC_INLINE _cx_raw _cx_MEMB(_value_toraw)(const _cx_value* pval) { return i_keyto(pval); }
+STC_INLINE void _cx_MEMB(_value_drop)(_cx_value* pval) { i_keydrop(pval); }
STC_INLINE intptr_t
-_cx_memb(_count)(const _cx_self* self) {
+_cx_MEMB(_count)(const _cx_Self* self) {
intptr_t n = 1; const _cx_node *node = self->last;
if (!node) return 0;
while ((node = node->next) != self->last) ++n;
@@ -160,53 +160,53 @@ _cx_memb(_count)(const _cx_self* self) {
}
STC_INLINE _cx_iter
-_cx_memb(_begin)(const _cx_self* self) {
+_cx_MEMB(_begin)(const _cx_Self* self) {
_cx_value* head = self->last ? &self->last->next->value : NULL;
return c_LITERAL(_cx_iter){head, &self->last, self->last};
}
STC_INLINE _cx_iter
-_cx_memb(_end)(const _cx_self* self)
+_cx_MEMB(_end)(const _cx_Self* self)
{ return c_LITERAL(_cx_iter){NULL}; }
STC_INLINE void
-_cx_memb(_next)(_cx_iter* it) {
+_cx_MEMB(_next)(_cx_iter* it) {
_cx_node* node = it->prev = _clist_tonode(it->ref);
it->ref = (node == *it->_last ? NULL : &node->next->value);
}
STC_INLINE _cx_iter
-_cx_memb(_advance)(_cx_iter it, size_t n) {
- while (n-- && it.ref) _cx_memb(_next)(&it);
+_cx_MEMB(_advance)(_cx_iter it, size_t n) {
+ while (n-- && it.ref) _cx_MEMB(_next)(&it);
return it;
}
STC_INLINE _cx_iter
-_cx_memb(_splice_range)(_cx_self* self, _cx_iter it,
- _cx_self* other, _cx_iter it1, _cx_iter it2) {
- _cx_self tmp = _cx_memb(_split_off)(other, it1, it2);
- return _cx_memb(_splice)(self, it, &tmp);
+_cx_MEMB(_splice_range)(_cx_Self* self, _cx_iter it,
+ _cx_Self* other, _cx_iter it1, _cx_iter it2) {
+ _cx_Self tmp = _cx_MEMB(_split_off)(other, it1, it2);
+ return _cx_MEMB(_splice)(self, it, &tmp);
}
#if !defined i_no_cmp || defined _i_has_eq
STC_INLINE _cx_iter
-_cx_memb(_find)(const _cx_self* self, _cx_raw val) {
- return _cx_memb(_find_in)(_cx_memb(_begin)(self), _cx_memb(_end)(self), val);
+_cx_MEMB(_find)(const _cx_Self* self, _cx_raw val) {
+ return _cx_MEMB(_find_in)(_cx_MEMB(_begin)(self), _cx_MEMB(_end)(self), val);
}
STC_INLINE const _cx_value*
-_cx_memb(_get)(const _cx_self* self, _cx_raw val) {
- return _cx_memb(_find_in)(_cx_memb(_begin)(self), _cx_memb(_end)(self), val).ref;
+_cx_MEMB(_get)(const _cx_Self* self, _cx_raw val) {
+ return _cx_MEMB(_find_in)(_cx_MEMB(_begin)(self), _cx_MEMB(_end)(self), val).ref;
}
STC_INLINE _cx_value*
-_cx_memb(_get_mut)(_cx_self* self, _cx_raw val) {
- return _cx_memb(_find_in)(_cx_memb(_begin)(self), _cx_memb(_end)(self), val).ref;
+_cx_MEMB(_get_mut)(_cx_Self* self, _cx_raw val) {
+ return _cx_MEMB(_find_in)(_cx_MEMB(_begin)(self), _cx_MEMB(_end)(self), val).ref;
}
-STC_INLINE bool _cx_memb(_eq)(const _cx_self* self, const _cx_self* other) {
- _cx_iter i = _cx_memb(_begin)(self), j = _cx_memb(_begin)(other);
- for (; i.ref && j.ref; _cx_memb(_next)(&i), _cx_memb(_next)(&j)) {
+STC_INLINE bool _cx_MEMB(_eq)(const _cx_Self* self, const _cx_Self* other) {
+ _cx_iter i = _cx_MEMB(_begin)(self), j = _cx_MEMB(_begin)(other);
+ for (; i.ref && j.ref; _cx_MEMB(_next)(&i), _cx_MEMB(_next)(&j)) {
const _cx_raw _rx = i_keyto(i.ref), _ry = i_keyto(j.ref);
if (!(i_eq((&_rx), (&_ry)))) return false;
}
@@ -218,29 +218,29 @@ STC_INLINE bool _cx_memb(_eq)(const _cx_self* self, const _cx_self* other) {
#if defined(i_implement) || defined(i_static)
#if !defined i_no_clone
-STC_DEF _cx_self
-_cx_memb(_clone)(_cx_self cx) {
- _cx_self out = _cx_memb(_init)();
- c_foreach (it, _cx_self, cx)
- _cx_memb(_push_back)(&out, i_keyclone((*it.ref)));
+STC_DEF _cx_Self
+_cx_MEMB(_clone)(_cx_Self cx) {
+ _cx_Self out = _cx_MEMB(_init)();
+ c_foreach (it, _cx_Self, cx)
+ _cx_MEMB(_push_back)(&out, i_keyclone((*it.ref)));
return out;
}
#endif
STC_DEF void
-_cx_memb(_drop)(_cx_self* self) {
- while (self->last) _cx_memb(_erase_after_node)(self, self->last);
+_cx_MEMB(_drop)(_cx_Self* self) {
+ while (self->last) _cx_MEMB(_erase_after_node)(self, self->last);
}
STC_DEF _cx_value*
-_cx_memb(_push_back)(_cx_self* self, i_key value) {
+_cx_MEMB(_push_back)(_cx_Self* self, i_key value) {
_c_clist_insert_entry_after(self->last, value);
self->last = entry;
return &entry->value;
}
STC_DEF _cx_value*
-_cx_memb(_push_front)(_cx_self* self, i_key value) {
+_cx_MEMB(_push_front)(_cx_Self* self, i_key value) {
_c_clist_insert_entry_after(self->last, value);
if (!self->last)
self->last = entry;
@@ -248,14 +248,14 @@ _cx_memb(_push_front)(_cx_self* self, i_key value) {
}
STC_DEF _cx_value*
-_cx_memb(_push_back_node)(_cx_self* self, _cx_node* node) {
+_cx_MEMB(_push_back_node)(_cx_Self* self, _cx_node* node) {
_c_clist_insert_after_node(self->last, node);
self->last = node;
return &node->value;
}
STC_DEF _cx_value*
-_cx_memb(_insert_after_node)(_cx_self* self, _cx_node* ref, _cx_node* node) {
+_cx_MEMB(_insert_after_node)(_cx_Self* self, _cx_node* ref, _cx_node* node) {
_c_clist_insert_after_node(ref, node);
if (!self->last)
self->last = node;
@@ -263,7 +263,7 @@ _cx_memb(_insert_after_node)(_cx_self* self, _cx_node* ref, _cx_node* node) {
}
STC_DEF _cx_iter
-_cx_memb(_insert_at)(_cx_self* self, _cx_iter it, i_key value) {
+_cx_MEMB(_insert_at)(_cx_Self* self, _cx_iter it, i_key value) {
_cx_node* node = it.ref ? it.prev : self->last;
_c_clist_insert_entry_after(node, value);
if (!self->last || !it.ref) {
@@ -275,32 +275,32 @@ _cx_memb(_insert_at)(_cx_self* self, _cx_iter it, i_key value) {
}
STC_DEF _cx_iter
-_cx_memb(_erase_at)(_cx_self* self, _cx_iter it) {
+_cx_MEMB(_erase_at)(_cx_Self* self, _cx_iter it) {
_cx_node *node = _clist_tonode(it.ref);
it.ref = (node == self->last) ? NULL : &node->next->value;
- _cx_memb(_erase_after_node)(self, it.prev);
+ _cx_MEMB(_erase_after_node)(self, it.prev);
return it;
}
STC_DEF _cx_iter
-_cx_memb(_erase_range)(_cx_self* self, _cx_iter it1, _cx_iter it2) {
+_cx_MEMB(_erase_range)(_cx_Self* self, _cx_iter it1, _cx_iter it2) {
_cx_node *end = it2.ref ? _clist_tonode(it2.ref) : self->last->next;
if (it1.ref != it2.ref) do {
- _cx_memb(_erase_after_node)(self, it1.prev);
+ _cx_MEMB(_erase_after_node)(self, it1.prev);
if (!self->last) break;
} while (it1.prev->next != end);
return it2;
}
STC_DEF void
-_cx_memb(_erase_after_node)(_cx_self* self, _cx_node* ref) {
- _cx_node* node = _cx_memb(_unlink_after_node)(self, ref);
+_cx_MEMB(_erase_after_node)(_cx_Self* self, _cx_node* ref) {
+ _cx_node* node = _cx_MEMB(_unlink_after_node)(self, ref);
i_keydrop((&node->value));
i_free(node);
}
STC_DEF _cx_node*
-_cx_memb(_unlink_after_node)(_cx_self* self, _cx_node* ref) {
+_cx_MEMB(_unlink_after_node)(_cx_Self* self, _cx_node* ref) {
_cx_node* node = ref->next, *next = node->next;
ref->next = next;
if (node == next)
@@ -311,17 +311,17 @@ _cx_memb(_unlink_after_node)(_cx_self* self, _cx_node* ref) {
}
STC_DEF void
-_cx_memb(_reverse)(_cx_self* self) {
- _cx_self rev = {NULL};
+_cx_MEMB(_reverse)(_cx_Self* self) {
+ _cx_Self rev = {NULL};
while (self->last) {
- _cx_node* node = _cx_memb(_unlink_after_node)(self, self->last);
- _cx_memb(_insert_after_node)(&rev, rev.last, node);
+ _cx_node* node = _cx_MEMB(_unlink_after_node)(self, self->last);
+ _cx_MEMB(_insert_after_node)(&rev, rev.last, node);
}
*self = rev;
}
STC_DEF _cx_iter
-_cx_memb(_splice)(_cx_self* self, _cx_iter it, _cx_self* other) {
+_cx_MEMB(_splice)(_cx_Self* self, _cx_iter it, _cx_Self* other) {
if (!self->last)
self->last = other->last;
else if (other->last) {
@@ -335,9 +335,9 @@ _cx_memb(_splice)(_cx_self* self, _cx_iter it, _cx_self* other) {
return it;
}
-STC_DEF _cx_self
-_cx_memb(_split_off)(_cx_self* self, _cx_iter it1, _cx_iter it2) {
- _cx_self lst = {NULL};
+STC_DEF _cx_Self
+_cx_MEMB(_split_off)(_cx_Self* self, _cx_iter it1, _cx_iter it2) {
+ _cx_Self lst = {NULL};
if (it1.ref == it2.ref)
return lst;
_cx_node *p1 = it1.prev,
@@ -353,8 +353,8 @@ _cx_memb(_split_off)(_cx_self* self, _cx_iter it1, _cx_iter it2) {
#if !defined i_no_cmp || defined _i_has_eq
STC_DEF _cx_iter
-_cx_memb(_find_in)(_cx_iter it1, _cx_iter it2, _cx_raw val) {
- c_foreach (it, _cx_self, it1, it2) {
+_cx_MEMB(_find_in)(_cx_iter it1, _cx_iter it2, _cx_raw val) {
+ c_foreach (it, _cx_Self, it1, it2) {
_cx_raw r = i_keyto(it.ref);
if (i_eq((&r), (&val)))
return it;
@@ -363,14 +363,14 @@ _cx_memb(_find_in)(_cx_iter it1, _cx_iter it2, _cx_raw val) {
}
STC_DEF intptr_t
-_cx_memb(_remove)(_cx_self* self, _cx_raw val) {
+_cx_MEMB(_remove)(_cx_Self* self, _cx_raw val) {
intptr_t n = 0;
_cx_node *prev = self->last, *node;
if (prev) do {
node = prev->next;
_cx_raw r = i_keyto((&node->value));
if (i_eq((&r), (&val))) {
- _cx_memb(_erase_after_node)(self, prev), ++n;
+ _cx_MEMB(_erase_after_node)(self, prev), ++n;
if (!self->last) break;
} else
prev = node;
@@ -380,16 +380,16 @@ _cx_memb(_remove)(_cx_self* self, _cx_raw val) {
#endif
#ifndef i_no_cmp
-STC_DEF int _cx_memb(_sort_cmp_)(const _cx_value* x, const _cx_value* y) {
+STC_DEF int _cx_MEMB(_sort_cmp_)(const _cx_value* x, const _cx_value* y) {
const _cx_raw a = i_keyto(x), b = i_keyto(y);
return i_cmp((&a), (&b));
}
-STC_DEF bool _cx_memb(_sort_with)(_cx_self* self, int(*cmp)(const _cx_value*, const _cx_value*)) {
+STC_DEF bool _cx_MEMB(_sort_with)(_cx_Self* self, int(*cmp)(const _cx_value*, const _cx_value*)) {
size_t len = 0, cap = 0;
_cx_value *a = NULL, *p = NULL;
_cx_iter i;
- for (i = _cx_memb(_begin)(self); i.ref; _cx_memb(_next)(&i)) {
+ for (i = _cx_MEMB(_begin)(self); i.ref; _cx_MEMB(_next)(&i)) {
if (len == cap) {
if ((p = (_cx_value *)i_realloc(a, (cap += cap/2 + 4)*sizeof *a))) a = p;
else { i_free(a); return false; }
@@ -397,7 +397,7 @@ STC_DEF bool _cx_memb(_sort_with)(_cx_self* self, int(*cmp)(const _cx_value*, co
a[len++] = *i.ref;
}
qsort(a, len, sizeof *a, (int(*)(const void*, const void*))cmp);
- for (i = _cx_memb(_begin)(self); i.ref; _cx_memb(_next)(&i), ++p)
+ for (i = _cx_MEMB(_begin)(self); i.ref; _cx_MEMB(_next)(&i), ++p)
*i.ref = *p;
i_free(a); return true;
}
diff --git a/include/stc/cmap.h b/include/stc/cmap.h
index 2e234fb5..21e7b933 100644
--- a/include/stc/cmap.h
+++ b/include/stc/cmap.h
@@ -72,7 +72,7 @@ typedef struct { intptr_t idx; uint8_t hashx, found; } chash_bucket;
#endif
#include "priv/template.h"
#ifndef i_is_forward
- _cx_deftypes(_c_chash_types, _cx_self, i_key, i_val, _i_MAP_ONLY, _i_SET_ONLY);
+ _cx_DEFTYPES(_c_chash_types, _cx_Self, i_key, i_val, _i_MAP_ONLY, _i_SET_ONLY);
#endif
_i_MAP_ONLY( struct _cx_value {
@@ -81,60 +81,60 @@ _i_MAP_ONLY( struct _cx_value {
}; )
typedef i_keyraw _cx_keyraw;
-typedef i_valraw _cx_memb(_rmapped);
+typedef i_valraw _cx_MEMB(_rmapped);
typedef _i_SET_ONLY( i_keyraw )
_i_MAP_ONLY( struct { i_keyraw first;
i_valraw second; } )
_cx_raw;
-STC_API _cx_self _cx_memb(_with_capacity)(intptr_t cap);
+STC_API _cx_Self _cx_MEMB(_with_capacity)(intptr_t cap);
#if !defined i_no_clone
-STC_API _cx_self _cx_memb(_clone)(_cx_self map);
+STC_API _cx_Self _cx_MEMB(_clone)(_cx_Self map);
#endif
-STC_API void _cx_memb(_drop)(_cx_self* self);
-STC_API void _cx_memb(_clear)(_cx_self* self);
-STC_API bool _cx_memb(_reserve)(_cx_self* self, intptr_t capacity);
-STC_API chash_bucket _cx_memb(_bucket_)(const _cx_self* self, const _cx_keyraw* rkeyptr);
-STC_API _cx_result _cx_memb(_insert_entry_)(_cx_self* self, _cx_keyraw rkey);
-STC_API void _cx_memb(_erase_entry)(_cx_self* self, _cx_value* val);
-STC_API float _cx_memb(_max_load_factor)(const _cx_self* self);
-STC_API intptr_t _cx_memb(_capacity)(const _cx_self* map);
-
-STC_INLINE _cx_self _cx_memb(_init)(void) { _cx_self map = {0}; return map; }
-STC_INLINE void _cx_memb(_shrink_to_fit)(_cx_self* self) { _cx_memb(_reserve)(self, (intptr_t)self->size); }
-STC_INLINE bool _cx_memb(_empty)(const _cx_self* map) { return !map->size; }
-STC_INLINE intptr_t _cx_memb(_size)(const _cx_self* map) { return (intptr_t)map->size; }
-STC_INLINE intptr_t _cx_memb(_bucket_count)(_cx_self* map) { return map->bucket_count; }
-STC_INLINE bool _cx_memb(_contains)(const _cx_self* self, _cx_keyraw rkey)
- { return self->size && _cx_memb(_bucket_)(self, &rkey).found; }
+STC_API void _cx_MEMB(_drop)(_cx_Self* self);
+STC_API void _cx_MEMB(_clear)(_cx_Self* self);
+STC_API bool _cx_MEMB(_reserve)(_cx_Self* self, intptr_t capacity);
+STC_API chash_bucket _cx_MEMB(_bucket_)(const _cx_Self* self, const _cx_keyraw* rkeyptr);
+STC_API _cx_result _cx_MEMB(_insert_entry_)(_cx_Self* self, _cx_keyraw rkey);
+STC_API void _cx_MEMB(_erase_entry)(_cx_Self* self, _cx_value* val);
+STC_API float _cx_MEMB(_max_load_factor)(const _cx_Self* self);
+STC_API intptr_t _cx_MEMB(_capacity)(const _cx_Self* map);
+
+STC_INLINE _cx_Self _cx_MEMB(_init)(void) { _cx_Self map = {0}; return map; }
+STC_INLINE void _cx_MEMB(_shrink_to_fit)(_cx_Self* self) { _cx_MEMB(_reserve)(self, (intptr_t)self->size); }
+STC_INLINE bool _cx_MEMB(_empty)(const _cx_Self* map) { return !map->size; }
+STC_INLINE intptr_t _cx_MEMB(_size)(const _cx_Self* map) { return (intptr_t)map->size; }
+STC_INLINE intptr_t _cx_MEMB(_bucket_count)(_cx_Self* map) { return map->bucket_count; }
+STC_INLINE bool _cx_MEMB(_contains)(const _cx_Self* self, _cx_keyraw rkey)
+ { return self->size && _cx_MEMB(_bucket_)(self, &rkey).found; }
#ifndef _i_isset
- STC_API _cx_result _cx_memb(_insert_or_assign)(_cx_self* self, i_key key, i_val mapped);
+ STC_API _cx_result _cx_MEMB(_insert_or_assign)(_cx_Self* self, i_key key, i_val mapped);
#if !defined i_no_emplace
- STC_API _cx_result _cx_memb(_emplace_or_assign)(_cx_self* self, _cx_keyraw rkey, i_valraw rmapped);
+ STC_API _cx_result _cx_MEMB(_emplace_or_assign)(_cx_Self* self, _cx_keyraw rkey, i_valraw rmapped);
#endif
STC_INLINE const _cx_mapped*
- _cx_memb(_at)(const _cx_self* self, _cx_keyraw rkey) {
- chash_bucket b = _cx_memb(_bucket_)(self, &rkey);
+ _cx_MEMB(_at)(const _cx_Self* self, _cx_keyraw rkey) {
+ chash_bucket b = _cx_MEMB(_bucket_)(self, &rkey);
assert(b.found);
return &self->data[b.idx].second;
}
STC_INLINE _cx_mapped*
- _cx_memb(_at_mut)(_cx_self* self, _cx_keyraw rkey)
- { return (_cx_mapped*)_cx_memb(_at)(self, rkey); }
+ _cx_MEMB(_at_mut)(_cx_Self* self, _cx_keyraw rkey)
+ { return (_cx_mapped*)_cx_MEMB(_at)(self, rkey); }
#endif // !_i_isset
#if !defined i_no_clone
-STC_INLINE void _cx_memb(_copy)(_cx_self *self, const _cx_self* other) {
+STC_INLINE void _cx_MEMB(_copy)(_cx_Self *self, const _cx_Self* other) {
if (self->data == other->data)
return;
- _cx_memb(_drop)(self);
- *self = _cx_memb(_clone)(*other);
+ _cx_MEMB(_drop)(self);
+ *self = _cx_MEMB(_clone)(*other);
}
STC_INLINE _cx_value
-_cx_memb(_value_clone)(_cx_value _val) {
+_cx_MEMB(_value_clone)(_cx_value _val) {
*_i_keyref(&_val) = i_keyclone((*_i_keyref(&_val)));
_i_MAP_ONLY( _val.second = i_valclone(_val.second); )
return _val;
@@ -143,8 +143,8 @@ _cx_memb(_value_clone)(_cx_value _val) {
#if !defined i_no_emplace
STC_INLINE _cx_result
-_cx_memb(_emplace)(_cx_self* self, _cx_keyraw rkey _i_MAP_ONLY(, i_valraw rmapped)) {
- _cx_result _res = _cx_memb(_insert_entry_)(self, rkey);
+_cx_MEMB(_emplace)(_cx_Self* self, _cx_keyraw rkey _i_MAP_ONLY(, i_valraw rmapped)) {
+ _cx_result _res = _cx_MEMB(_insert_entry_)(self, rkey);
if (_res.inserted) {
*_i_keyref(_res.ref) = i_keyfrom(rkey);
_i_MAP_ONLY( _res.ref->second = i_valfrom(rmapped); )
@@ -153,19 +153,19 @@ _cx_memb(_emplace)(_cx_self* self, _cx_keyraw rkey _i_MAP_ONLY(, i_valraw rmappe
}
#endif // !i_no_emplace
-STC_INLINE _cx_raw _cx_memb(_value_toraw)(const _cx_value* val) {
+STC_INLINE _cx_raw _cx_MEMB(_value_toraw)(const _cx_value* val) {
return _i_SET_ONLY( i_keyto(val) )
_i_MAP_ONLY( c_LITERAL(_cx_raw){i_keyto((&val->first)), i_valto((&val->second))} );
}
-STC_INLINE void _cx_memb(_value_drop)(_cx_value* _val) {
+STC_INLINE void _cx_MEMB(_value_drop)(_cx_value* _val) {
i_keydrop(_i_keyref(_val));
_i_MAP_ONLY( i_valdrop((&_val->second)); )
}
STC_INLINE _cx_result
-_cx_memb(_insert)(_cx_self* self, i_key _key _i_MAP_ONLY(, i_val _mapped)) {
- _cx_result _res = _cx_memb(_insert_entry_)(self, i_keyto((&_key)));
+_cx_MEMB(_insert)(_cx_Self* self, i_key _key _i_MAP_ONLY(, i_val _mapped)) {
+ _cx_result _res = _cx_MEMB(_insert_entry_)(self, i_keyto((&_key)));
if (_res.inserted)
{ *_i_keyref(_res.ref) = _key; _i_MAP_ONLY( _res.ref->second = _mapped; )}
else
@@ -173,90 +173,90 @@ _cx_memb(_insert)(_cx_self* self, i_key _key _i_MAP_ONLY(, i_val _mapped)) {
return _res;
}
-STC_INLINE _cx_value* _cx_memb(_push)(_cx_self* self, _cx_value _val) {
- _cx_result _res = _cx_memb(_insert_entry_)(self, i_keyto(_i_keyref(&_val)));
+STC_INLINE _cx_value* _cx_MEMB(_push)(_cx_Self* self, _cx_value _val) {
+ _cx_result _res = _cx_MEMB(_insert_entry_)(self, i_keyto(_i_keyref(&_val)));
if (_res.inserted)
*_res.ref = _val;
else
- _cx_memb(_value_drop)(&_val);
+ _cx_MEMB(_value_drop)(&_val);
return _res.ref;
}
-STC_INLINE void _cx_memb(_put_n)(_cx_self* self, const _cx_raw* raw, intptr_t n) {
+STC_INLINE void _cx_MEMB(_put_n)(_cx_Self* self, const _cx_raw* raw, intptr_t n) {
while (n--)
#if defined _i_isset && defined i_no_emplace
- _cx_memb(_insert)(self, *raw++);
+ _cx_MEMB(_insert)(self, *raw++);
#elif defined _i_isset
- _cx_memb(_emplace)(self, *raw++);
+ _cx_MEMB(_emplace)(self, *raw++);
#elif defined i_no_emplace
- _cx_memb(_insert_or_assign)(self, raw->first, raw->second), ++raw;
+ _cx_MEMB(_insert_or_assign)(self, raw->first, raw->second), ++raw;
#else
- _cx_memb(_emplace_or_assign)(self, raw->first, raw->second), ++raw;
+ _cx_MEMB(_emplace_or_assign)(self, raw->first, raw->second), ++raw;
#endif
}
-STC_INLINE _cx_self _cx_memb(_from_n)(const _cx_raw* raw, intptr_t n)
- { _cx_self cx = {0}; _cx_memb(_put_n)(&cx, raw, n); return cx; }
+STC_INLINE _cx_Self _cx_MEMB(_from_n)(const _cx_raw* raw, intptr_t n)
+ { _cx_Self cx = {0}; _cx_MEMB(_put_n)(&cx, raw, n); return cx; }
-STC_API _cx_iter _cx_memb(_begin)(const _cx_self* self);
+STC_API _cx_iter _cx_MEMB(_begin)(const _cx_Self* self);
-STC_INLINE _cx_iter _cx_memb(_end)(const _cx_self* self)
+STC_INLINE _cx_iter _cx_MEMB(_end)(const _cx_Self* self)
{ return c_LITERAL(_cx_iter){NULL}; }
-STC_INLINE void _cx_memb(_next)(_cx_iter* it) {
+STC_INLINE void _cx_MEMB(_next)(_cx_iter* it) {
while ((++it->ref, (++it->sref)->hashx == 0)) ;
if (it->ref == it->_end) it->ref = NULL;
}
-STC_INLINE _cx_iter _cx_memb(_advance)(_cx_iter it, size_t n) {
- while (n-- && it.ref) _cx_memb(_next)(&it);
+STC_INLINE _cx_iter _cx_MEMB(_advance)(_cx_iter it, size_t n) {
+ while (n-- && it.ref) _cx_MEMB(_next)(&it);
return it;
}
STC_INLINE _cx_iter
-_cx_memb(_find)(const _cx_self* self, _cx_keyraw rkey) {
+_cx_MEMB(_find)(const _cx_Self* self, _cx_keyraw rkey) {
chash_bucket b;
- if (self->size && (b = _cx_memb(_bucket_)(self, &rkey)).found)
+ if (self->size && (b = _cx_MEMB(_bucket_)(self, &rkey)).found)
return c_LITERAL(_cx_iter){self->data + b.idx,
self->data + self->bucket_count,
self->slot + b.idx};
- return _cx_memb(_end)(self);
+ return _cx_MEMB(_end)(self);
}
STC_INLINE const _cx_value*
-_cx_memb(_get)(const _cx_self* self, _cx_keyraw rkey) {
+_cx_MEMB(_get)(const _cx_Self* self, _cx_keyraw rkey) {
chash_bucket b;
- if (self->size && (b = _cx_memb(_bucket_)(self, &rkey)).found)
+ if (self->size && (b = _cx_MEMB(_bucket_)(self, &rkey)).found)
return self->data + b.idx;
return NULL;
}
STC_INLINE _cx_value*
-_cx_memb(_get_mut)(_cx_self* self, _cx_keyraw rkey)
- { return (_cx_value*)_cx_memb(_get)(self, rkey); }
+_cx_MEMB(_get_mut)(_cx_Self* self, _cx_keyraw rkey)
+ { return (_cx_value*)_cx_MEMB(_get)(self, rkey); }
STC_INLINE int
-_cx_memb(_erase)(_cx_self* self, _cx_keyraw rkey) {
+_cx_MEMB(_erase)(_cx_Self* self, _cx_keyraw rkey) {
chash_bucket b = {0};
- if (self->size && (b = _cx_memb(_bucket_)(self, &rkey)).found)
- _cx_memb(_erase_entry)(self, self->data + b.idx);
+ if (self->size && (b = _cx_MEMB(_bucket_)(self, &rkey)).found)
+ _cx_MEMB(_erase_entry)(self, self->data + b.idx);
return b.found;
}
STC_INLINE _cx_iter
-_cx_memb(_erase_at)(_cx_self* self, _cx_iter it) {
- _cx_memb(_erase_entry)(self, it.ref);
+_cx_MEMB(_erase_at)(_cx_Self* self, _cx_iter it) {
+ _cx_MEMB(_erase_entry)(self, it.ref);
if (it.sref->hashx == 0)
- _cx_memb(_next)(&it);
+ _cx_MEMB(_next)(&it);
return it;
}
STC_INLINE bool
-_cx_memb(_eq)(const _cx_self* self, const _cx_self* other) {
- if (_cx_memb(_size)(self) != _cx_memb(_size)(other)) return false;
- for (_cx_iter i = _cx_memb(_begin)(self); i.ref; _cx_memb(_next)(&i)) {
+_cx_MEMB(_eq)(const _cx_Self* self, const _cx_Self* other) {
+ if (_cx_MEMB(_size)(self) != _cx_MEMB(_size)(other)) return false;
+ for (_cx_iter i = _cx_MEMB(_begin)(self); i.ref; _cx_MEMB(_next)(&i)) {
const _cx_keyraw _raw = i_keyto(_i_keyref(i.ref));
- if (!_cx_memb(_contains)(other, _raw)) return false;
+ if (!_cx_MEMB(_contains)(other, _raw)) return false;
}
return true;
}
@@ -268,7 +268,7 @@ _cx_memb(_eq)(const _cx_self* self, const _cx_self* other) {
#endif
#define fastrange_2(x, n) (intptr_t)((x) & (size_t)((n) - 1)) // n power of 2.
-STC_DEF _cx_iter _cx_memb(_begin)(const _cx_self* self) {
+STC_DEF _cx_iter _cx_MEMB(_begin)(const _cx_Self* self) {
_cx_iter it = {self->data, self->data+self->bucket_count, self->slot};
if (it.sref)
while (it.sref->hashx == 0)
@@ -277,46 +277,46 @@ STC_DEF _cx_iter _cx_memb(_begin)(const _cx_self* self) {
return it;
}
-STC_DEF float _cx_memb(_max_load_factor)(const _cx_self* self) {
+STC_DEF float _cx_MEMB(_max_load_factor)(const _cx_Self* self) {
return (float)(i_max_load_factor);
}
-STC_DEF intptr_t _cx_memb(_capacity)(const _cx_self* map) {
+STC_DEF intptr_t _cx_MEMB(_capacity)(const _cx_Self* map) {
return (intptr_t)((float)map->bucket_count * (i_max_load_factor));
}
-STC_DEF _cx_self _cx_memb(_with_capacity)(const intptr_t cap) {
- _cx_self map = {0};
- _cx_memb(_reserve)(&map, cap);
+STC_DEF _cx_Self _cx_MEMB(_with_capacity)(const intptr_t cap) {
+ _cx_Self map = {0};
+ _cx_MEMB(_reserve)(&map, cap);
return map;
}
-STC_INLINE void _cx_memb(_wipe_)(_cx_self* self) {
+STC_INLINE void _cx_MEMB(_wipe_)(_cx_Self* self) {
if (self->size == 0)
return;
_cx_value* d = self->data, *_end = d + self->bucket_count;
chash_slot* s = self->slot;
for (; d != _end; ++d)
if ((s++)->hashx)
- _cx_memb(_value_drop)(d);
+ _cx_MEMB(_value_drop)(d);
}
-STC_DEF void _cx_memb(_drop)(_cx_self* self) {
- _cx_memb(_wipe_)(self);
+STC_DEF void _cx_MEMB(_drop)(_cx_Self* self) {
+ _cx_MEMB(_wipe_)(self);
i_free(self->slot);
i_free(self->data);
}
-STC_DEF void _cx_memb(_clear)(_cx_self* self) {
- _cx_memb(_wipe_)(self);
+STC_DEF void _cx_MEMB(_clear)(_cx_Self* self) {
+ _cx_MEMB(_wipe_)(self);
self->size = 0;
c_memset(self->slot, 0, c_sizeof(chash_slot)*self->bucket_count);
}
#ifndef _i_isset
STC_DEF _cx_result
- _cx_memb(_insert_or_assign)(_cx_self* self, i_key _key, i_val _mapped) {
- _cx_result _res = _cx_memb(_insert_entry_)(self, i_keyto((&_key)));
+ _cx_MEMB(_insert_or_assign)(_cx_Self* self, i_key _key, i_val _mapped) {
+ _cx_result _res = _cx_MEMB(_insert_entry_)(self, i_keyto((&_key)));
_cx_mapped* _mp = _res.ref ? &_res.ref->second : &_mapped;
if (_res.inserted)
_res.ref->first = _key;
@@ -328,8 +328,8 @@ STC_DEF void _cx_memb(_clear)(_cx_self* self) {
#if !defined i_no_emplace
STC_DEF _cx_result
- _cx_memb(_emplace_or_assign)(_cx_self* self, _cx_keyraw rkey, i_valraw rmapped) {
- _cx_result _res = _cx_memb(_insert_entry_)(self, rkey);
+ _cx_MEMB(_emplace_or_assign)(_cx_Self* self, _cx_keyraw rkey, i_valraw rmapped) {
+ _cx_result _res = _cx_MEMB(_insert_entry_)(self, rkey);
if (_res.inserted)
_res.ref->first = i_keyfrom(rkey);
else {
@@ -343,7 +343,7 @@ STC_DEF void _cx_memb(_clear)(_cx_self* self) {
#endif // !_i_isset
STC_DEF chash_bucket
-_cx_memb(_bucket_)(const _cx_self* self, const _cx_keyraw* rkeyptr) {
+_cx_MEMB(_bucket_)(const _cx_Self* self, const _cx_keyraw* rkeyptr) {
const uint64_t _hash = i_hash(rkeyptr);
intptr_t _cap = self->bucket_count;
chash_bucket b = {fastrange_2(_hash, _cap), (uint8_t)(_hash | 0x80)};
@@ -362,13 +362,13 @@ _cx_memb(_bucket_)(const _cx_self* self, const _cx_keyraw* rkeyptr) {
}
STC_DEF _cx_result
-_cx_memb(_insert_entry_)(_cx_self* self, _cx_keyraw rkey) {
+_cx_MEMB(_insert_entry_)(_cx_Self* self, _cx_keyraw rkey) {
_cx_result res = {NULL};
if (self->size >= (intptr_t)((float)self->bucket_count * (i_max_load_factor)))
- if (!_cx_memb(_reserve)(self, (intptr_t)(self->size*3/2 + 2)))
+ if (!_cx_MEMB(_reserve)(self, (intptr_t)(self->size*3/2 + 2)))
return res;
- chash_bucket b = _cx_memb(_bucket_)(self, &rkey);
+ chash_bucket b = _cx_MEMB(_bucket_)(self, &rkey);
res.ref = &self->data[b.idx];
if (!b.found) {
self->slot[b.idx].hashx = b.hashx;
@@ -379,8 +379,8 @@ _cx_memb(_insert_entry_)(_cx_self* self, _cx_keyraw rkey) {
}
#if !defined i_no_clone
-STC_DEF _cx_self
-_cx_memb(_clone)(_cx_self m) {
+STC_DEF _cx_Self
+_cx_MEMB(_clone)(_cx_Self m) {
if (m.data) {
_cx_value *d = (_cx_value *)i_malloc(c_sizeof(_cx_value)*m.bucket_count),
*_dst = d, *_end = m.data + m.bucket_count;
@@ -391,7 +391,7 @@ _cx_memb(_clone)(_cx_self m) {
else
for (; m.data != _end; ++m.data, ++m.slot, ++_dst)
if (m.slot->hashx)
- *_dst = _cx_memb(_value_clone)(*m.data);
+ *_dst = _cx_MEMB(_value_clone)(*m.data);
m.data = d, m.slot = s;
}
return m;
@@ -399,13 +399,13 @@ _cx_memb(_clone)(_cx_self m) {
#endif
STC_DEF bool
-_cx_memb(_reserve)(_cx_self* self, const intptr_t _newcap) {
+_cx_MEMB(_reserve)(_cx_Self* self, const intptr_t _newcap) {
const intptr_t _oldbucks = self->bucket_count;
if (_newcap != self->size && _newcap <= _oldbucks)
return true;
intptr_t _newbucks = (intptr_t)((float)_newcap / (i_max_load_factor)) + 4;
_newbucks = cnextpow2(_newbucks);
- _cx_self m = {
+ _cx_Self m = {
(_cx_value *)i_malloc(_newbucks*c_sizeof(_cx_value)),
(chash_slot *)i_calloc(_newbucks + 1, sizeof(chash_slot)),
self->size, _newbucks
@@ -417,11 +417,11 @@ _cx_memb(_reserve)(_cx_self* self, const intptr_t _newcap) {
const chash_slot* s = self->slot;
for (intptr_t i = 0; i < _oldbucks; ++i, ++d) if ((s++)->hashx) {
_cx_keyraw r = i_keyto(_i_keyref(d));
- chash_bucket b = _cx_memb(_bucket_)(&m, &r);
+ chash_bucket b = _cx_MEMB(_bucket_)(&m, &r);
m.slot[b.idx].hashx = b.hashx;
m.data[b.idx] = *d; // move
}
- c_swap(_cx_self, self, &m);
+ c_swap(_cx_Self, self, &m);
}
i_free(m.slot);
i_free(m.data);
@@ -429,12 +429,12 @@ _cx_memb(_reserve)(_cx_self* self, const intptr_t _newcap) {
}
STC_DEF void
-_cx_memb(_erase_entry)(_cx_self* self, _cx_value* _val) {
+_cx_MEMB(_erase_entry)(_cx_Self* self, _cx_value* _val) {
_cx_value* d = self->data;
chash_slot* s = self->slot;
intptr_t i = _val - d, j = i, k;
const intptr_t _cap = self->bucket_count;
- _cx_memb(_value_drop)(_val);
+ _cx_MEMB(_value_drop)(_val);
for (;;) { // delete without leaving tombstone
if (++j == _cap) j = 0;
if (! s[j].hashx)
diff --git a/include/stc/cpque.h b/include/stc/cpque.h
index b66c7735..cfe027cc 100644
--- a/include/stc/cpque.h
+++ b/include/stc/cpque.h
@@ -31,88 +31,88 @@
#define _i_prefix cpque_
#include "priv/template.h"
#ifndef i_is_forward
- _cx_deftypes(_c_cpque_types, _cx_self, i_key);
+ _cx_DEFTYPES(_c_cpque_types, _cx_Self, i_key);
#endif
typedef i_keyraw _cx_raw;
-STC_API void _cx_memb(_make_heap)(_cx_self* self);
-STC_API void _cx_memb(_erase_at)(_cx_self* self, intptr_t idx);
-STC_API _cx_value* _cx_memb(_push)(_cx_self* self, _cx_value value);
+STC_API void _cx_MEMB(_make_heap)(_cx_Self* self);
+STC_API void _cx_MEMB(_erase_at)(_cx_Self* self, intptr_t idx);
+STC_API _cx_value* _cx_MEMB(_push)(_cx_Self* self, _cx_value value);
-STC_INLINE _cx_self _cx_memb(_init)(void)
- { return c_LITERAL(_cx_self){NULL}; }
+STC_INLINE _cx_Self _cx_MEMB(_init)(void)
+ { return c_LITERAL(_cx_Self){NULL}; }
-STC_INLINE void _cx_memb(_put_n)(_cx_self* self, const _cx_raw* raw, intptr_t n)
- { while (n--) _cx_memb(_push)(self, i_keyfrom(*raw++)); }
+STC_INLINE void _cx_MEMB(_put_n)(_cx_Self* self, const _cx_raw* raw, intptr_t n)
+ { while (n--) _cx_MEMB(_push)(self, i_keyfrom(*raw++)); }
-STC_INLINE _cx_self _cx_memb(_from_n)(const _cx_raw* raw, intptr_t n)
- { _cx_self cx = {0}; _cx_memb(_put_n)(&cx, raw, n); return cx; }
+STC_INLINE _cx_Self _cx_MEMB(_from_n)(const _cx_raw* raw, intptr_t n)
+ { _cx_Self cx = {0}; _cx_MEMB(_put_n)(&cx, raw, n); return cx; }
-STC_INLINE bool _cx_memb(_reserve)(_cx_self* self, const intptr_t cap) {
+STC_INLINE bool _cx_MEMB(_reserve)(_cx_Self* self, const intptr_t cap) {
if (cap != self->_len && cap <= self->_cap) return true;
_cx_value *d = (_cx_value *)i_realloc(self->data, cap*c_sizeof *d);
return d ? (self->data = d, self->_cap = cap, true) : false;
}
-STC_INLINE void _cx_memb(_shrink_to_fit)(_cx_self* self)
- { _cx_memb(_reserve)(self, self->_len); }
+STC_INLINE void _cx_MEMB(_shrink_to_fit)(_cx_Self* self)
+ { _cx_MEMB(_reserve)(self, self->_len); }
-STC_INLINE _cx_self _cx_memb(_with_capacity)(const intptr_t cap) {
- _cx_self out = {NULL}; _cx_memb(_reserve)(&out, cap);
+STC_INLINE _cx_Self _cx_MEMB(_with_capacity)(const intptr_t cap) {
+ _cx_Self out = {NULL}; _cx_MEMB(_reserve)(&out, cap);
return out;
}
-STC_INLINE _cx_self _cx_memb(_with_size)(const intptr_t size, i_key null) {
- _cx_self out = {NULL}; _cx_memb(_reserve)(&out, size);
+STC_INLINE _cx_Self _cx_MEMB(_with_size)(const intptr_t size, i_key null) {
+ _cx_Self out = {NULL}; _cx_MEMB(_reserve)(&out, size);
while (out._len < size) out.data[out._len++] = null;
return out;
}
-STC_INLINE void _cx_memb(_clear)(_cx_self* self) {
+STC_INLINE void _cx_MEMB(_clear)(_cx_Self* self) {
intptr_t i = self->_len; self->_len = 0;
while (i--) { i_keydrop((self->data + i)); }
}
-STC_INLINE void _cx_memb(_drop)(_cx_self* self)
- { _cx_memb(_clear)(self); i_free(self->data); }
+STC_INLINE void _cx_MEMB(_drop)(_cx_Self* self)
+ { _cx_MEMB(_clear)(self); i_free(self->data); }
-STC_INLINE intptr_t _cx_memb(_size)(const _cx_self* q)
+STC_INLINE intptr_t _cx_MEMB(_size)(const _cx_Self* q)
{ return q->_len; }
-STC_INLINE bool _cx_memb(_empty)(const _cx_self* q)
+STC_INLINE bool _cx_MEMB(_empty)(const _cx_Self* q)
{ return !q->_len; }
-STC_INLINE intptr_t _cx_memb(_capacity)(const _cx_self* q)
+STC_INLINE intptr_t _cx_MEMB(_capacity)(const _cx_Self* q)
{ return q->_cap; }
-STC_INLINE const _cx_value* _cx_memb(_top)(const _cx_self* self)
+STC_INLINE const _cx_value* _cx_MEMB(_top)(const _cx_Self* self)
{ return &self->data[0]; }
-STC_INLINE void _cx_memb(_pop)(_cx_self* self)
- { assert(!_cx_memb(_empty)(self)); _cx_memb(_erase_at)(self, 0); }
+STC_INLINE void _cx_MEMB(_pop)(_cx_Self* self)
+ { assert(!_cx_MEMB(_empty)(self)); _cx_MEMB(_erase_at)(self, 0); }
#if !defined i_no_clone
-STC_API _cx_self _cx_memb(_clone)(_cx_self q);
+STC_API _cx_Self _cx_MEMB(_clone)(_cx_Self q);
-STC_INLINE void _cx_memb(_copy)(_cx_self *self, const _cx_self* other) {
+STC_INLINE void _cx_MEMB(_copy)(_cx_Self *self, const _cx_Self* other) {
if (self->data == other->data) return;
- _cx_memb(_drop)(self);
- *self = _cx_memb(_clone)(*other);
+ _cx_MEMB(_drop)(self);
+ *self = _cx_MEMB(_clone)(*other);
}
-STC_INLINE i_key _cx_memb(_value_clone)(_cx_value val)
+STC_INLINE i_key _cx_MEMB(_value_clone)(_cx_value val)
{ return i_keyclone(val); }
#endif // !i_no_clone
#if !defined i_no_emplace
-STC_INLINE void _cx_memb(_emplace)(_cx_self* self, _cx_raw raw)
- { _cx_memb(_push)(self, i_keyfrom(raw)); }
+STC_INLINE void _cx_MEMB(_emplace)(_cx_Self* self, _cx_raw raw)
+ { _cx_MEMB(_push)(self, i_keyfrom(raw)); }
#endif // !i_no_emplace
/* -------------------------- IMPLEMENTATION ------------------------- */
#if defined(i_implement) || defined(i_static)
STC_DEF void
-_cx_memb(_sift_down_)(_cx_self* self, const intptr_t idx, const intptr_t n) {
+_cx_MEMB(_sift_down_)(_cx_Self* self, const intptr_t idx, const intptr_t n) {
_cx_value t, *arr = self->data - 1;
for (intptr_t r = idx, c = idx*2; c <= n; c *= 2) {
c += i_less((&arr[c]), (&arr[c + (c < n)]));
@@ -122,15 +122,15 @@ _cx_memb(_sift_down_)(_cx_self* self, const intptr_t idx, const intptr_t n) {
}
STC_DEF void
-_cx_memb(_make_heap)(_cx_self* self) {
+_cx_MEMB(_make_heap)(_cx_Self* self) {
intptr_t n = self->_len;
for (intptr_t k = n/2; k != 0; --k)
- _cx_memb(_sift_down_)(self, k, n);
+ _cx_MEMB(_sift_down_)(self, k, n);
}
#if !defined i_no_clone
-STC_DEF _cx_self _cx_memb(_clone)(_cx_self q) {
- _cx_self out = _cx_memb(_with_capacity)(q._len);
+STC_DEF _cx_Self _cx_MEMB(_clone)(_cx_Self q) {
+ _cx_Self out = _cx_MEMB(_with_capacity)(q._len);
for (; out._len < out._cap; ++q.data)
out.data[out._len++] = i_keyclone((*q.data));
return out;
@@ -138,17 +138,17 @@ STC_DEF _cx_self _cx_memb(_clone)(_cx_self q) {
#endif
STC_DEF void
-_cx_memb(_erase_at)(_cx_self* self, const intptr_t idx) {
+_cx_MEMB(_erase_at)(_cx_Self* self, const intptr_t idx) {
i_keydrop((self->data + idx));
const intptr_t n = --self->_len;
self->data[idx] = self->data[n];
- _cx_memb(_sift_down_)(self, idx + 1, n);
+ _cx_MEMB(_sift_down_)(self, idx + 1, n);
}
STC_DEF _cx_value*
-_cx_memb(_push)(_cx_self* self, _cx_value value) {
+_cx_MEMB(_push)(_cx_Self* self, _cx_value value) {
if (self->_len == self->_cap)
- _cx_memb(_reserve)(self, self->_len*3/2 + 4);
+ _cx_MEMB(_reserve)(self, self->_len*3/2 + 4);
_cx_value *arr = self->data - 1; /* base 1 */
intptr_t c = ++self->_len;
for (; c > 1 && (i_less((&arr[c/2]), (&value))); c /= 2)
diff --git a/include/stc/cqueue.h b/include/stc/cqueue.h
index 2f709172..6eee712b 100644
--- a/include/stc/cqueue.h
+++ b/include/stc/cqueue.h
@@ -35,104 +35,104 @@
#include "priv/template.h"
#ifndef i_is_forward
-_cx_deftypes(_c_cdeq_types, _cx_self, i_key);
+_cx_DEFTYPES(_c_cdeq_types, _cx_Self, i_key);
#endif
typedef i_keyraw _cx_raw;
-STC_API _cx_self _cx_memb(_with_capacity)(const intptr_t n);
-STC_API bool _cx_memb(_reserve)(_cx_self* self, const intptr_t n);
-STC_API void _cx_memb(_clear)(_cx_self* self);
-STC_API void _cx_memb(_drop)(_cx_self* self);
-STC_API _cx_value* _cx_memb(_push)(_cx_self* self, i_key value); // push_back
-STC_API void _cx_memb(_shrink_to_fit)(_cx_self *self);
-STC_API _cx_iter _cx_memb(_advance)(_cx_iter it, intptr_t n);
+STC_API _cx_Self _cx_MEMB(_with_capacity)(const intptr_t n);
+STC_API bool _cx_MEMB(_reserve)(_cx_Self* self, const intptr_t n);
+STC_API void _cx_MEMB(_clear)(_cx_Self* self);
+STC_API void _cx_MEMB(_drop)(_cx_Self* self);
+STC_API _cx_value* _cx_MEMB(_push)(_cx_Self* self, i_key value); // push_back
+STC_API void _cx_MEMB(_shrink_to_fit)(_cx_Self *self);
+STC_API _cx_iter _cx_MEMB(_advance)(_cx_iter it, intptr_t n);
#define _cdeq_toidx(self, pos) (((pos) - (self)->start) & (self)->capmask)
#define _cdeq_topos(self, idx) (((self)->start + (idx)) & (self)->capmask)
-STC_INLINE _cx_self _cx_memb(_init)(void)
- { _cx_self cx = {0}; return cx; }
-STC_INLINE void _cx_memb(_put_n)(_cx_self* self, const _cx_raw* raw, intptr_t n)
- { while (n--) _cx_memb(_push)(self, i_keyfrom(*raw++)); }
-STC_INLINE _cx_self _cx_memb(_from_n)(const _cx_raw* raw, intptr_t n)
- { _cx_self cx = {0}; _cx_memb(_put_n)(&cx, raw, n); return cx; }
-STC_INLINE void _cx_memb(_value_drop)(_cx_value* val) { i_keydrop(val); }
+STC_INLINE _cx_Self _cx_MEMB(_init)(void)
+ { _cx_Self cx = {0}; return cx; }
+STC_INLINE void _cx_MEMB(_put_n)(_cx_Self* self, const _cx_raw* raw, intptr_t n)
+ { while (n--) _cx_MEMB(_push)(self, i_keyfrom(*raw++)); }
+STC_INLINE _cx_Self _cx_MEMB(_from_n)(const _cx_raw* raw, intptr_t n)
+ { _cx_Self cx = {0}; _cx_MEMB(_put_n)(&cx, raw, n); return cx; }
+STC_INLINE void _cx_MEMB(_value_drop)(_cx_value* val) { i_keydrop(val); }
#if !defined i_no_emplace
-STC_INLINE _cx_value* _cx_memb(_emplace)(_cx_self* self, _cx_raw raw)
- { return _cx_memb(_push)(self, i_keyfrom(raw)); }
+STC_INLINE _cx_value* _cx_MEMB(_emplace)(_cx_Self* self, _cx_raw raw)
+ { return _cx_MEMB(_push)(self, i_keyfrom(raw)); }
#endif
#if defined _i_has_cmp || defined _i_has_eq
-STC_API bool _cx_memb(_eq)(const _cx_self* self, const _cx_self* other);
+STC_API bool _cx_MEMB(_eq)(const _cx_Self* self, const _cx_Self* other);
#endif
#if !defined i_no_clone
-STC_API _cx_self _cx_memb(_clone)(_cx_self cx);
-STC_INLINE i_key _cx_memb(_value_clone)(i_key val)
+STC_API _cx_Self _cx_MEMB(_clone)(_cx_Self cx);
+STC_INLINE i_key _cx_MEMB(_value_clone)(i_key val)
{ return i_keyclone(val); }
#endif // !i_no_clone
-STC_INLINE intptr_t _cx_memb(_size)(const _cx_self* self)
+STC_INLINE intptr_t _cx_MEMB(_size)(const _cx_Self* self)
{ return _cdeq_toidx(self, self->end); }
-STC_INLINE intptr_t _cx_memb(_capacity)(const _cx_self* self)
+STC_INLINE intptr_t _cx_MEMB(_capacity)(const _cx_Self* self)
{ return self->capmask; }
-STC_INLINE bool _cx_memb(_empty)(const _cx_self* self)
+STC_INLINE bool _cx_MEMB(_empty)(const _cx_Self* self)
{ return self->start == self->end; }
-STC_INLINE _cx_raw _cx_memb(_value_toraw)(const _cx_value* pval)
+STC_INLINE _cx_raw _cx_MEMB(_value_toraw)(const _cx_value* pval)
{ return i_keyto(pval); }
-STC_INLINE _cx_value* _cx_memb(_front)(const _cx_self* self)
+STC_INLINE _cx_value* _cx_MEMB(_front)(const _cx_Self* self)
{ return self->data + self->start; }
-STC_INLINE _cx_value* _cx_memb(_back)(const _cx_self* self)
+STC_INLINE _cx_value* _cx_MEMB(_back)(const _cx_Self* self)
{ return self->data + ((self->end - 1) & self->capmask); }
-STC_INLINE void _cx_memb(_pop)(_cx_self* self) { // pop_front
- assert(!_cx_memb(_empty)(self));
+STC_INLINE void _cx_MEMB(_pop)(_cx_Self* self) { // pop_front
+ assert(!_cx_MEMB(_empty)(self));
i_keydrop((self->data + self->start));
self->start = (self->start + 1) & self->capmask;
}
-STC_INLINE _cx_value _cx_memb(_pull)(_cx_self* self) { // move front out of queue
- assert(!_cx_memb(_empty)(self));
+STC_INLINE _cx_value _cx_MEMB(_pull)(_cx_Self* self) { // move front out of queue
+ assert(!_cx_MEMB(_empty)(self));
intptr_t s = self->start;
self->start = (s + 1) & self->capmask;
return self->data[s];
}
-STC_INLINE void _cx_memb(_copy)(_cx_self* self, const _cx_self* other) {
+STC_INLINE void _cx_MEMB(_copy)(_cx_Self* self, const _cx_Self* other) {
if (self->data == other->data) return;
- _cx_memb(_drop)(self);
- *self = _cx_memb(_clone)(*other);
+ _cx_MEMB(_drop)(self);
+ *self = _cx_MEMB(_clone)(*other);
}
-STC_INLINE _cx_iter _cx_memb(_begin)(const _cx_self* self) {
+STC_INLINE _cx_iter _cx_MEMB(_begin)(const _cx_Self* self) {
return c_LITERAL(_cx_iter){
- _cx_memb(_empty)(self) ? NULL : self->data + self->start,
+ _cx_MEMB(_empty)(self) ? NULL : self->data + self->start,
self->start, self
};
}
-STC_INLINE _cx_iter _cx_memb(_end)(const _cx_self* self)
+STC_INLINE _cx_iter _cx_MEMB(_end)(const _cx_Self* self)
{ return c_LITERAL(_cx_iter){.pos=self->end, ._s=self}; }
-STC_INLINE void _cx_memb(_next)(_cx_iter* it) {
+STC_INLINE void _cx_MEMB(_next)(_cx_iter* it) {
if (it->pos != it->_s->capmask) { ++it->ref; ++it->pos; }
else { it->ref -= it->pos; it->pos = 0; }
if (it->pos == it->_s->end) it->ref = NULL;
}
-STC_INLINE intptr_t _cx_memb(_index)(const _cx_self* self, _cx_iter it)
+STC_INLINE intptr_t _cx_MEMB(_index)(const _cx_Self* self, _cx_iter it)
{ return _cdeq_toidx(self, it.pos); }
-STC_INLINE void _cx_memb(_adjust_end_)(_cx_self* self, intptr_t n)
+STC_INLINE void _cx_MEMB(_adjust_end_)(_cx_Self* self, intptr_t n)
{ self->end = (self->end + n) & self->capmask; }
/* -------------------------- IMPLEMENTATION ------------------------- */
#if defined(i_implement) || defined(i_static)
-STC_DEF _cx_iter _cx_memb(_advance)(_cx_iter it, intptr_t n) {
- intptr_t len = _cx_memb(_size)(it._s);
+STC_DEF _cx_iter _cx_MEMB(_advance)(_cx_iter it, intptr_t n) {
+ intptr_t len = _cx_MEMB(_size)(it._s);
intptr_t pos = it.pos, idx = _cdeq_toidx(it._s, pos);
it.pos = (pos + n) & it._s->capmask;
it.ref += it.pos - pos;
@@ -141,27 +141,27 @@ STC_DEF _cx_iter _cx_memb(_advance)(_cx_iter it, intptr_t n) {
}
STC_DEF void
-_cx_memb(_clear)(_cx_self* self) {
- c_foreach (i, _cx_self, *self)
+_cx_MEMB(_clear)(_cx_Self* self) {
+ c_foreach (i, _cx_Self, *self)
{ i_keydrop(i.ref); }
self->start = 0, self->end = 0;
}
STC_DEF void
-_cx_memb(_drop)(_cx_self* self) {
- _cx_memb(_clear)(self);
+_cx_MEMB(_drop)(_cx_Self* self) {
+ _cx_MEMB(_clear)(self);
i_free(self->data);
}
-STC_DEF _cx_self
-_cx_memb(_with_capacity)(const intptr_t n) {
- _cx_self cx = {0};
- _cx_memb(_reserve)(&cx, n);
+STC_DEF _cx_Self
+_cx_MEMB(_with_capacity)(const intptr_t n) {
+ _cx_Self cx = {0};
+ _cx_MEMB(_reserve)(&cx, n);
return cx;
}
STC_DEF bool
-_cx_memb(_reserve)(_cx_self* self, const intptr_t n) {
+_cx_MEMB(_reserve)(_cx_Self* self, const intptr_t n) {
if (n <= self->capmask)
return true;
intptr_t oldcap = self->capmask + 1, newcap = cnextpow2(n + 1);
@@ -184,10 +184,10 @@ _cx_memb(_reserve)(_cx_self* self, const intptr_t n) {
}
STC_DEF _cx_value*
-_cx_memb(_push)(_cx_self* self, i_key value) { // push_back
+_cx_MEMB(_push)(_cx_Self* self, i_key value) { // push_back
intptr_t end = (self->end + 1) & self->capmask;
if (end == self->start) { // full
- _cx_memb(_reserve)(self, self->capmask + 3); // => 2x expand
+ _cx_MEMB(_reserve)(self, self->capmask + 3); // => 2x expand
end = (self->end + 1) & self->capmask;
}
_cx_value *v = self->data + self->end;
@@ -197,14 +197,14 @@ _cx_memb(_push)(_cx_self* self, i_key value) { // push_back
}
STC_DEF void
-_cx_memb(_shrink_to_fit)(_cx_self *self) {
- intptr_t sz = _cx_memb(_size)(self), j = 0;
+_cx_MEMB(_shrink_to_fit)(_cx_Self *self) {
+ intptr_t sz = _cx_MEMB(_size)(self), j = 0;
if (sz > self->capmask/2)
return;
- _cx_self out = _cx_memb(_with_capacity)(sz);
+ _cx_Self out = _cx_MEMB(_with_capacity)(sz);
if (!out.data)
return;
- c_foreach (i, _cx_self, *self)
+ c_foreach (i, _cx_Self, *self)
out.data[j++] = *i.ref;
out.end = sz;
i_free(self->data);
@@ -212,12 +212,12 @@ _cx_memb(_shrink_to_fit)(_cx_self *self) {
}
#if !defined i_no_clone
-STC_DEF _cx_self
-_cx_memb(_clone)(_cx_self cx) {
- intptr_t sz = _cx_memb(_size)(&cx), j = 0;
- _cx_self out = _cx_memb(_with_capacity)(sz);
+STC_DEF _cx_Self
+_cx_MEMB(_clone)(_cx_Self cx) {
+ intptr_t sz = _cx_MEMB(_size)(&cx), j = 0;
+ _cx_Self out = _cx_MEMB(_with_capacity)(sz);
if (out.data)
- c_foreach (i, _cx_self, cx)
+ c_foreach (i, _cx_Self, cx)
out.data[j++] = i_keyclone((*i.ref));
out.end = sz;
return out;
@@ -226,10 +226,10 @@ _cx_memb(_clone)(_cx_self cx) {
#if defined _i_has_cmp || defined _i_has_eq
STC_DEF bool
-_cx_memb(_eq)(const _cx_self* self, const _cx_self* other) {
- if (_cx_memb(_size)(self) != _cx_memb(_size)(other)) return false;
- for (_cx_iter i = _cx_memb(_begin)(self), j = _cx_memb(_begin)(other);
- i.ref; _cx_memb(_next)(&i), _cx_memb(_next)(&j))
+_cx_MEMB(_eq)(const _cx_Self* self, const _cx_Self* other) {
+ if (_cx_MEMB(_size)(self) != _cx_MEMB(_size)(other)) return false;
+ for (_cx_iter i = _cx_MEMB(_begin)(self), j = _cx_MEMB(_begin)(other);
+ i.ref; _cx_MEMB(_next)(&i), _cx_MEMB(_next)(&j))
{
const _cx_raw _rx = i_keyto(i.ref), _ry = i_keyto(j.ref);
if (!(i_eq((&_rx), (&_ry)))) return false;
diff --git a/include/stc/csmap.h b/include/stc/csmap.h
index 28598f0a..f4d33a4d 100644
--- a/include/stc/csmap.h
+++ b/include/stc/csmap.h
@@ -73,7 +73,7 @@ int main(void) {
#endif
#include "priv/template.h"
#ifndef i_is_forward
- _cx_deftypes(_c_aatree_types, _cx_self, i_key, i_val, _i_MAP_ONLY, _i_SET_ONLY);
+ _cx_DEFTYPES(_c_aatree_types, _cx_Self, i_key, i_val, _i_MAP_ONLY, _i_SET_ONLY);
#endif
_i_MAP_ONLY( struct _cx_value {
@@ -87,133 +87,133 @@ struct _cx_node {
};
typedef i_keyraw _cx_keyraw;
-typedef i_valraw _cx_memb(_rmapped);
+typedef i_valraw _cx_MEMB(_rmapped);
typedef _i_SET_ONLY( i_keyraw )
_i_MAP_ONLY( struct { i_keyraw first; i_valraw second; } )
_cx_raw;
#if !defined i_no_emplace
-STC_API _cx_result _cx_memb(_emplace)(_cx_self* self, _cx_keyraw rkey _i_MAP_ONLY(, i_valraw rmapped));
+STC_API _cx_result _cx_MEMB(_emplace)(_cx_Self* self, _cx_keyraw rkey _i_MAP_ONLY(, i_valraw rmapped));
#endif // !i_no_emplace
#if !defined i_no_clone
-STC_API _cx_self _cx_memb(_clone)(_cx_self tree);
+STC_API _cx_Self _cx_MEMB(_clone)(_cx_Self tree);
#endif // !i_no_clone
-STC_API void _cx_memb(_drop)(_cx_self* self);
-STC_API bool _cx_memb(_reserve)(_cx_self* self, intptr_t cap);
-STC_API _cx_value* _cx_memb(_find_it)(const _cx_self* self, _cx_keyraw rkey, _cx_iter* out);
-STC_API _cx_iter _cx_memb(_lower_bound)(const _cx_self* self, _cx_keyraw rkey);
-STC_API _cx_value* _cx_memb(_front)(const _cx_self* self);
-STC_API _cx_value* _cx_memb(_back)(const _cx_self* self);
-STC_API int _cx_memb(_erase)(_cx_self* self, _cx_keyraw rkey);
-STC_API _cx_iter _cx_memb(_erase_at)(_cx_self* self, _cx_iter it);
-STC_API _cx_iter _cx_memb(_erase_range)(_cx_self* self, _cx_iter it1, _cx_iter it2);
-STC_API _cx_iter _cx_memb(_begin)(const _cx_self* self);
-STC_API void _cx_memb(_next)(_cx_iter* it);
-
-STC_INLINE _cx_self _cx_memb(_init)(void) { _cx_self tree = {0}; return tree; }
-STC_INLINE bool _cx_memb(_empty)(const _cx_self* cx) { return cx->size == 0; }
-STC_INLINE intptr_t _cx_memb(_size)(const _cx_self* cx) { return cx->size; }
-STC_INLINE intptr_t _cx_memb(_capacity)(const _cx_self* cx) { return cx->cap; }
-STC_INLINE _cx_iter _cx_memb(_find)(const _cx_self* self, _cx_keyraw rkey)
- { _cx_iter it; _cx_memb(_find_it)(self, rkey, &it); return it; }
-STC_INLINE bool _cx_memb(_contains)(const _cx_self* self, _cx_keyraw rkey)
- { _cx_iter it; return _cx_memb(_find_it)(self, rkey, &it) != NULL; }
-STC_INLINE const _cx_value* _cx_memb(_get)(const _cx_self* self, _cx_keyraw rkey)
- { _cx_iter it; return _cx_memb(_find_it)(self, rkey, &it); }
-STC_INLINE _cx_value* _cx_memb(_get_mut)(_cx_self* self, _cx_keyraw rkey)
- { _cx_iter it; return _cx_memb(_find_it)(self, rkey, &it); }
-
-STC_INLINE _cx_self
-_cx_memb(_with_capacity)(const intptr_t cap) {
- _cx_self tree = _cx_memb(_init)();
- _cx_memb(_reserve)(&tree, cap);
+STC_API void _cx_MEMB(_drop)(_cx_Self* self);
+STC_API bool _cx_MEMB(_reserve)(_cx_Self* self, intptr_t cap);
+STC_API _cx_value* _cx_MEMB(_find_it)(const _cx_Self* self, _cx_keyraw rkey, _cx_iter* out);
+STC_API _cx_iter _cx_MEMB(_lower_bound)(const _cx_Self* self, _cx_keyraw rkey);
+STC_API _cx_value* _cx_MEMB(_front)(const _cx_Self* self);
+STC_API _cx_value* _cx_MEMB(_back)(const _cx_Self* self);
+STC_API int _cx_MEMB(_erase)(_cx_Self* self, _cx_keyraw rkey);
+STC_API _cx_iter _cx_MEMB(_erase_at)(_cx_Self* self, _cx_iter it);
+STC_API _cx_iter _cx_MEMB(_erase_range)(_cx_Self* self, _cx_iter it1, _cx_iter it2);
+STC_API _cx_iter _cx_MEMB(_begin)(const _cx_Self* self);
+STC_API void _cx_MEMB(_next)(_cx_iter* it);
+
+STC_INLINE _cx_Self _cx_MEMB(_init)(void) { _cx_Self tree = {0}; return tree; }
+STC_INLINE bool _cx_MEMB(_empty)(const _cx_Self* cx) { return cx->size == 0; }
+STC_INLINE intptr_t _cx_MEMB(_size)(const _cx_Self* cx) { return cx->size; }
+STC_INLINE intptr_t _cx_MEMB(_capacity)(const _cx_Self* cx) { return cx->cap; }
+STC_INLINE _cx_iter _cx_MEMB(_find)(const _cx_Self* self, _cx_keyraw rkey)
+ { _cx_iter it; _cx_MEMB(_find_it)(self, rkey, &it); return it; }
+STC_INLINE bool _cx_MEMB(_contains)(const _cx_Self* self, _cx_keyraw rkey)
+ { _cx_iter it; return _cx_MEMB(_find_it)(self, rkey, &it) != NULL; }
+STC_INLINE const _cx_value* _cx_MEMB(_get)(const _cx_Self* self, _cx_keyraw rkey)
+ { _cx_iter it; return _cx_MEMB(_find_it)(self, rkey, &it); }
+STC_INLINE _cx_value* _cx_MEMB(_get_mut)(_cx_Self* self, _cx_keyraw rkey)
+ { _cx_iter it; return _cx_MEMB(_find_it)(self, rkey, &it); }
+
+STC_INLINE _cx_Self
+_cx_MEMB(_with_capacity)(const intptr_t cap) {
+ _cx_Self tree = _cx_MEMB(_init)();
+ _cx_MEMB(_reserve)(&tree, cap);
return tree;
}
STC_INLINE void
-_cx_memb(_clear)(_cx_self* self)
- { _cx_memb(_drop)(self); *self = _cx_memb(_init)(); }
+_cx_MEMB(_clear)(_cx_Self* self)
+ { _cx_MEMB(_drop)(self); *self = _cx_MEMB(_init)(); }
STC_INLINE _cx_raw
-_cx_memb(_value_toraw)(const _cx_value* val) {
+_cx_MEMB(_value_toraw)(const _cx_value* val) {
return _i_SET_ONLY( i_keyto(val) )
_i_MAP_ONLY( c_LITERAL(_cx_raw){i_keyto((&val->first)),
i_valto((&val->second))} );
}
STC_INLINE void
-_cx_memb(_value_drop)(_cx_value* val) {
+_cx_MEMB(_value_drop)(_cx_value* val) {
i_keydrop(_i_keyref(val));
_i_MAP_ONLY( i_valdrop((&val->second)); )
}
#if !defined i_no_clone
STC_INLINE _cx_value
-_cx_memb(_value_clone)(_cx_value _val) {
+_cx_MEMB(_value_clone)(_cx_value _val) {
*_i_keyref(&_val) = i_keyclone((*_i_keyref(&_val)));
_i_MAP_ONLY( _val.second = i_valclone(_val.second); )
return _val;
}
STC_INLINE void
-_cx_memb(_copy)(_cx_self *self, const _cx_self* other) {
+_cx_MEMB(_copy)(_cx_Self *self, const _cx_Self* other) {
if (self->nodes == other->nodes)
return;
- _cx_memb(_drop)(self);
- *self = _cx_memb(_clone)(*other);
+ _cx_MEMB(_drop)(self);
+ *self = _cx_MEMB(_clone)(*other);
}
STC_INLINE void
-_cx_memb(_shrink_to_fit)(_cx_self *self) {
- _cx_self tmp = _cx_memb(_clone)(*self);
- _cx_memb(_drop)(self); *self = tmp;
+_cx_MEMB(_shrink_to_fit)(_cx_Self *self) {
+ _cx_Self tmp = _cx_MEMB(_clone)(*self);
+ _cx_MEMB(_drop)(self); *self = tmp;
}
#endif // !i_no_clone
#ifndef _i_isset
- STC_API _cx_result _cx_memb(_insert_or_assign)(_cx_self* self, i_key key, i_val mapped);
+ STC_API _cx_result _cx_MEMB(_insert_or_assign)(_cx_Self* self, i_key key, i_val mapped);
#if !defined i_no_emplace
- STC_API _cx_result _cx_memb(_emplace_or_assign)(_cx_self* self, _cx_keyraw rkey, i_valraw rmapped);
+ STC_API _cx_result _cx_MEMB(_emplace_or_assign)(_cx_Self* self, _cx_keyraw rkey, i_valraw rmapped);
#endif
STC_INLINE const _cx_mapped*
- _cx_memb(_at)(const _cx_self* self, _cx_keyraw rkey)
- { _cx_iter it; return &_cx_memb(_find_it)(self, rkey, &it)->second; }
+ _cx_MEMB(_at)(const _cx_Self* self, _cx_keyraw rkey)
+ { _cx_iter it; return &_cx_MEMB(_find_it)(self, rkey, &it)->second; }
STC_INLINE _cx_mapped*
- _cx_memb(_at_mut)(_cx_self* self, _cx_keyraw rkey)
- { _cx_iter it; return &_cx_memb(_find_it)(self, rkey, &it)->second; }
+ _cx_MEMB(_at_mut)(_cx_Self* self, _cx_keyraw rkey)
+ { _cx_iter it; return &_cx_MEMB(_find_it)(self, rkey, &it)->second; }
#endif // !_i_isset
STC_INLINE _cx_iter
-_cx_memb(_end)(const _cx_self* self) {
+_cx_MEMB(_end)(const _cx_Self* self) {
(void)self;
_cx_iter it; it.ref = NULL, it._top = 0, it._tn = 0;
return it;
}
STC_INLINE _cx_iter
-_cx_memb(_advance)(_cx_iter it, size_t n) {
+_cx_MEMB(_advance)(_cx_iter it, size_t n) {
while (n-- && it.ref)
- _cx_memb(_next)(&it);
+ _cx_MEMB(_next)(&it);
return it;
}
STC_INLINE bool
-_cx_memb(_eq)(const _cx_self* self, const _cx_self* other) {
- if (_cx_memb(_size)(self) != _cx_memb(_size)(other)) return false;
- _cx_iter i = _cx_memb(_begin)(self), j = _cx_memb(_begin)(other);
- for (; i.ref; _cx_memb(_next)(&i), _cx_memb(_next)(&j)) {
+_cx_MEMB(_eq)(const _cx_Self* self, const _cx_Self* other) {
+ if (_cx_MEMB(_size)(self) != _cx_MEMB(_size)(other)) return false;
+ _cx_iter i = _cx_MEMB(_begin)(self), j = _cx_MEMB(_begin)(other);
+ for (; i.ref; _cx_MEMB(_next)(&i), _cx_MEMB(_next)(&j)) {
const _cx_keyraw _rx = i_keyto(_i_keyref(i.ref)), _ry = i_keyto(_i_keyref(j.ref));
if (!(i_eq((&_rx), (&_ry)))) return false;
}
return true;
}
-static _cx_result _cx_memb(_insert_entry_)(_cx_self* self, _cx_keyraw rkey);
+static _cx_result _cx_MEMB(_insert_entry_)(_cx_Self* self, _cx_keyraw rkey);
STC_INLINE _cx_result
-_cx_memb(_insert)(_cx_self* self, i_key _key _i_MAP_ONLY(, i_val _mapped)) {
- _cx_result _res = _cx_memb(_insert_entry_)(self, i_keyto((&_key)));
+_cx_MEMB(_insert)(_cx_Self* self, i_key _key _i_MAP_ONLY(, i_val _mapped)) {
+ _cx_result _res = _cx_MEMB(_insert_entry_)(self, i_keyto((&_key)));
if (_res.inserted)
{ *_i_keyref(_res.ref) = _key; _i_MAP_ONLY( _res.ref->second = _mapped; )}
else
@@ -222,38 +222,38 @@ _cx_memb(_insert)(_cx_self* self, i_key _key _i_MAP_ONLY(, i_val _mapped)) {
}
STC_INLINE _cx_value*
-_cx_memb(_push)(_cx_self* self, _cx_value _val) {
- _cx_result _res = _cx_memb(_insert_entry_)(self, i_keyto(_i_keyref(&_val)));
+_cx_MEMB(_push)(_cx_Self* self, _cx_value _val) {
+ _cx_result _res = _cx_MEMB(_insert_entry_)(self, i_keyto(_i_keyref(&_val)));
if (_res.inserted)
*_res.ref = _val;
else
- _cx_memb(_value_drop)(&_val);
+ _cx_MEMB(_value_drop)(&_val);
return _res.ref;
}
STC_INLINE void
-_cx_memb(_put_n)(_cx_self* self, const _cx_raw* raw, intptr_t n) {
+_cx_MEMB(_put_n)(_cx_Self* self, const _cx_raw* raw, intptr_t n) {
while (n--)
#if defined _i_isset && defined i_no_emplace
- _cx_memb(_insert)(self, *raw++);
+ _cx_MEMB(_insert)(self, *raw++);
#elif defined _i_isset
- _cx_memb(_emplace)(self, *raw++);
+ _cx_MEMB(_emplace)(self, *raw++);
#elif defined i_no_emplace
- _cx_memb(_insert_or_assign)(self, raw->first, raw->second), ++raw;
+ _cx_MEMB(_insert_or_assign)(self, raw->first, raw->second), ++raw;
#else
- _cx_memb(_emplace_or_assign)(self, raw->first, raw->second), ++raw;
+ _cx_MEMB(_emplace_or_assign)(self, raw->first, raw->second), ++raw;
#endif
}
-STC_INLINE _cx_self
-_cx_memb(_from_n)(const _cx_raw* raw, intptr_t n)
- { _cx_self cx = {0}; _cx_memb(_put_n)(&cx, raw, n); return cx; }
+STC_INLINE _cx_Self
+_cx_MEMB(_from_n)(const _cx_raw* raw, intptr_t n)
+ { _cx_Self cx = {0}; _cx_MEMB(_put_n)(&cx, raw, n); return cx; }
/* -------------------------- IMPLEMENTATION ------------------------- */
#if defined(i_implement) || defined(i_static)
STC_DEF void
-_cx_memb(_next)(_cx_iter *it) {
+_cx_MEMB(_next)(_cx_iter *it) {
int32_t tn = it->_tn;
if (it->_top || tn) {
while (tn) {
@@ -268,18 +268,18 @@ _cx_memb(_next)(_cx_iter *it) {
}
STC_DEF _cx_iter
-_cx_memb(_begin)(const _cx_self* self) {
+_cx_MEMB(_begin)(const _cx_Self* self) {
_cx_iter it;
it.ref = NULL;
it._d = self->nodes, it._top = 0;
it._tn = self->root;
if (it._tn)
- _cx_memb(_next)(&it);
+ _cx_MEMB(_next)(&it);
return it;
}
STC_DEF bool
-_cx_memb(_reserve)(_cx_self* self, const intptr_t cap) {
+_cx_MEMB(_reserve)(_cx_Self* self, const intptr_t cap) {
if (cap <= self->cap)
return false;
_cx_node* nodes = (_cx_node*)i_realloc(self->nodes, (cap + 1)*c_sizeof(_cx_node));
@@ -292,7 +292,7 @@ _cx_memb(_reserve)(_cx_self* self, const intptr_t cap) {
}
STC_DEF _cx_value*
-_cx_memb(_front)(const _cx_self* self) {
+_cx_MEMB(_front)(const _cx_Self* self) {
_cx_node *d = self->nodes;
int32_t tn = self->root;
while (d[tn].link[0])
@@ -301,7 +301,7 @@ _cx_memb(_front)(const _cx_self* self) {
}
STC_DEF _cx_value*
-_cx_memb(_back)(const _cx_self* self) {
+_cx_MEMB(_back)(const _cx_Self* self) {
_cx_node *d = self->nodes;
int32_t tn = self->root;
while (d[tn].link[1])
@@ -310,14 +310,14 @@ _cx_memb(_back)(const _cx_self* self) {
}
static int32_t
-_cx_memb(_new_node_)(_cx_self* self, int level) {
+_cx_MEMB(_new_node_)(_cx_Self* self, int level) {
int32_t tn;
if (self->disp) {
tn = self->disp;
self->disp = self->nodes[tn].link[1];
} else {
if (self->head == self->cap)
- if (!_cx_memb(_reserve)(self, self->head*3/2 + 4))
+ if (!_cx_MEMB(_reserve)(self, self->head*3/2 + 4))
return 0;
tn = ++self->head; /* start with 1, 0 is nullnode. */
}
@@ -328,8 +328,8 @@ _cx_memb(_new_node_)(_cx_self* self, int level) {
#ifndef _i_isset
STC_DEF _cx_result
- _cx_memb(_insert_or_assign)(_cx_self* self, i_key _key, i_val _mapped) {
- _cx_result _res = _cx_memb(_insert_entry_)(self, i_keyto((&_key)));
+ _cx_MEMB(_insert_or_assign)(_cx_Self* self, i_key _key, i_val _mapped) {
+ _cx_result _res = _cx_MEMB(_insert_entry_)(self, i_keyto((&_key)));
_cx_mapped* _mp = _res.ref ? &_res.ref->second : &_mapped;
if (_res.inserted)
_res.ref->first = _key;
@@ -341,8 +341,8 @@ _cx_memb(_new_node_)(_cx_self* self, int level) {
#if !defined i_no_emplace
STC_DEF _cx_result
- _cx_memb(_emplace_or_assign)(_cx_self* self, _cx_keyraw rkey, i_valraw rmapped) {
- _cx_result _res = _cx_memb(_insert_entry_)(self, rkey);
+ _cx_MEMB(_emplace_or_assign)(_cx_Self* self, _cx_keyraw rkey, i_valraw rmapped) {
+ _cx_result _res = _cx_MEMB(_insert_entry_)(self, rkey);
if (_res.inserted)
_res.ref->first = i_keyfrom(rkey);
else {
@@ -356,7 +356,7 @@ _cx_memb(_new_node_)(_cx_self* self, int level) {
#endif // !_i_isset
STC_DEF _cx_value*
-_cx_memb(_find_it)(const _cx_self* self, _cx_keyraw rkey, _cx_iter* out) {
+_cx_MEMB(_find_it)(const _cx_Self* self, _cx_keyraw rkey, _cx_iter* out) {
int32_t tn = self->root;
_cx_node *d = out->_d = self->nodes;
out->_top = 0;
@@ -373,9 +373,9 @@ _cx_memb(_find_it)(const _cx_self* self, _cx_keyraw rkey, _cx_iter* out) {
}
STC_DEF _cx_iter
-_cx_memb(_lower_bound)(const _cx_self* self, _cx_keyraw rkey) {
+_cx_MEMB(_lower_bound)(const _cx_Self* self, _cx_keyraw rkey) {
_cx_iter it;
- _cx_memb(_find_it)(self, rkey, &it);
+ _cx_MEMB(_find_it)(self, rkey, &it);
if (!it.ref && it._top) {
int32_t tn = it._st[--it._top];
it._tn = it._d[tn].link[1];
@@ -385,7 +385,7 @@ _cx_memb(_lower_bound)(const _cx_self* self, _cx_keyraw rkey) {
}
STC_DEF int32_t
-_cx_memb(_skew_)(_cx_node *d, int32_t tn) {
+_cx_MEMB(_skew_)(_cx_node *d, int32_t tn) {
if (tn && d[d[tn].link[0]].level == d[tn].level) {
int32_t tmp = d[tn].link[0];
d[tn].link[0] = d[tmp].link[1];
@@ -396,7 +396,7 @@ _cx_memb(_skew_)(_cx_node *d, int32_t tn) {
}
STC_DEF int32_t
-_cx_memb(_split_)(_cx_node *d, int32_t tn) {
+_cx_MEMB(_split_)(_cx_node *d, int32_t tn) {
if (d[d[d[tn].link[1]].link[1]].level == d[tn].level) {
int32_t tmp = d[tn].link[1];
d[tn].link[1] = d[tmp].link[0];
@@ -408,7 +408,7 @@ _cx_memb(_split_)(_cx_node *d, int32_t tn) {
}
static int32_t
-_cx_memb(_insert_entry_i_)(_cx_self* self, int32_t tn, const _cx_keyraw* rkey, _cx_result* _res) {
+_cx_MEMB(_insert_entry_i_)(_cx_Self* self, int32_t tn, const _cx_keyraw* rkey, _cx_result* _res) {
int32_t up[64], tx = tn;
_cx_node* d = self->nodes;
int c, top = 0, dir = 0;
@@ -420,7 +420,7 @@ _cx_memb(_insert_entry_i_)(_cx_self* self, int32_t tn, const _cx_keyraw* rkey, _
dir = (c < 0);
tx = d[tx].link[dir];
}
- if ((tx = _cx_memb(_new_node_)(self, 1)) == 0)
+ if ((tx = _cx_MEMB(_new_node_)(self, 1)) == 0)
return 0;
d = self->nodes;
_res->ref = &d[tx].value;
@@ -431,8 +431,8 @@ _cx_memb(_insert_entry_i_)(_cx_self* self, int32_t tn, const _cx_keyraw* rkey, _
while (top--) {
if (top)
dir = (d[up[top - 1]].link[1] == up[top]);
- up[top] = _cx_memb(_skew_)(d, up[top]);
- up[top] = _cx_memb(_split_)(d, up[top]);
+ up[top] = _cx_MEMB(_skew_)(d, up[top]);
+ up[top] = _cx_MEMB(_split_)(d, up[top]);
if (top)
d[up[top - 1]].link[dir] = up[top];
}
@@ -440,33 +440,33 @@ _cx_memb(_insert_entry_i_)(_cx_self* self, int32_t tn, const _cx_keyraw* rkey, _
}
static _cx_result
-_cx_memb(_insert_entry_)(_cx_self* self, _cx_keyraw rkey) {
+_cx_MEMB(_insert_entry_)(_cx_Self* self, _cx_keyraw rkey) {
_cx_result res = {NULL};
- int32_t tn = _cx_memb(_insert_entry_i_)(self, self->root, &rkey, &res);
+ int32_t tn = _cx_MEMB(_insert_entry_i_)(self, self->root, &rkey, &res);
self->root = tn;
self->size += res.inserted;
return res;
}
static int32_t
-_cx_memb(_erase_r_)(_cx_self *self, int32_t tn, const _cx_keyraw* rkey, int *erased) {
+_cx_MEMB(_erase_r_)(_cx_Self *self, int32_t tn, const _cx_keyraw* rkey, int *erased) {
_cx_node *d = self->nodes;
if (tn == 0)
return 0;
_cx_keyraw raw = i_keyto(_i_keyref(&d[tn].value));
int32_t tx; int c = i_cmp((&raw), rkey);
if (c != 0)
- d[tn].link[c < 0] = _cx_memb(_erase_r_)(self, d[tn].link[c < 0], rkey, erased);
+ d[tn].link[c < 0] = _cx_MEMB(_erase_r_)(self, d[tn].link[c < 0], rkey, erased);
else {
if (!(*erased)++)
- _cx_memb(_value_drop)(&d[tn].value);
+ _cx_MEMB(_value_drop)(&d[tn].value);
if (d[tn].link[0] && d[tn].link[1]) {
tx = d[tn].link[0];
while (d[tx].link[1])
tx = d[tx].link[1];
d[tn].value = d[tx].value; /* move */
raw = i_keyto(_i_keyref(&d[tn].value));
- d[tn].link[0] = _cx_memb(_erase_r_)(self, d[tn].link[0], &raw, erased);
+ d[tn].link[0] = _cx_MEMB(_erase_r_)(self, d[tn].link[0], &raw, erased);
} else { /* unlink node */
tx = tn;
tn = d[tn].link[ d[tn].link[0] == 0 ];
@@ -479,19 +479,19 @@ _cx_memb(_erase_r_)(_cx_self *self, int32_t tn, const _cx_keyraw* rkey, int *era
if (d[d[tn].link[0]].level < d[tn].level - 1 || d[tx].level < d[tn].level - 1) {
if (d[tx].level > --d[tn].level)
d[tx].level = d[tn].level;
- tn = _cx_memb(_skew_)(d, tn);
- tx = d[tn].link[1] = _cx_memb(_skew_)(d, d[tn].link[1]);
- d[tx].link[1] = _cx_memb(_skew_)(d, d[tx].link[1]);
- tn = _cx_memb(_split_)(d, tn);
- d[tn].link[1] = _cx_memb(_split_)(d, d[tn].link[1]);
+ tn = _cx_MEMB(_skew_)(d, tn);
+ tx = d[tn].link[1] = _cx_MEMB(_skew_)(d, d[tn].link[1]);
+ d[tx].link[1] = _cx_MEMB(_skew_)(d, d[tx].link[1]);
+ tn = _cx_MEMB(_split_)(d, tn);
+ d[tn].link[1] = _cx_MEMB(_split_)(d, d[tn].link[1]);
}
return tn;
}
STC_DEF int
-_cx_memb(_erase)(_cx_self* self, _cx_keyraw rkey) {
+_cx_MEMB(_erase)(_cx_Self* self, _cx_keyraw rkey) {
int erased = 0;
- int32_t root = _cx_memb(_erase_r_)(self, self->root, &rkey, &erased);
+ int32_t root = _cx_MEMB(_erase_r_)(self, self->root, &rkey, &erased);
if (!erased)
return 0;
self->root = root;
@@ -500,23 +500,23 @@ _cx_memb(_erase)(_cx_self* self, _cx_keyraw rkey) {
}
STC_DEF _cx_iter
-_cx_memb(_erase_at)(_cx_self* self, _cx_iter it) {
+_cx_MEMB(_erase_at)(_cx_Self* self, _cx_iter it) {
_cx_keyraw raw = i_keyto(_i_keyref(it.ref));
- _cx_memb(_next)(&it);
+ _cx_MEMB(_next)(&it);
if (it.ref) {
_cx_keyraw nxt = i_keyto(_i_keyref(it.ref));
- _cx_memb(_erase)(self, raw);
- _cx_memb(_find_it)(self, nxt, &it);
+ _cx_MEMB(_erase)(self, raw);
+ _cx_MEMB(_find_it)(self, nxt, &it);
} else
- _cx_memb(_erase)(self, raw);
+ _cx_MEMB(_erase)(self, raw);
return it;
}
STC_DEF _cx_iter
-_cx_memb(_erase_range)(_cx_self* self, _cx_iter it1, _cx_iter it2) {
+_cx_MEMB(_erase_range)(_cx_Self* self, _cx_iter it1, _cx_iter it2) {
if (!it2.ref) {
while (it1.ref)
- it1 = _cx_memb(_erase_at)(self, it1);
+ it1 = _cx_MEMB(_erase_at)(self, it1);
return it1;
}
_cx_key k1 = *_i_keyref(it1.ref), k2 = *_i_keyref(it2.ref);
@@ -524,30 +524,30 @@ _cx_memb(_erase_range)(_cx_self* self, _cx_iter it1, _cx_iter it2) {
for (;;) {
if (memcmp(&k1, &k2, sizeof k1) == 0)
return it1;
- _cx_memb(_next)(&it1);
+ _cx_MEMB(_next)(&it1);
k1 = *_i_keyref(it1.ref);
- _cx_memb(_erase)(self, r1);
+ _cx_MEMB(_erase)(self, r1);
r1 = i_keyto((&k1));
- _cx_memb(_find_it)(self, r1, &it1);
+ _cx_MEMB(_find_it)(self, r1, &it1);
}
}
#if !defined i_no_clone
static int32_t
-_cx_memb(_clone_r_)(_cx_self* self, _cx_node* src, int32_t sn) {
+_cx_MEMB(_clone_r_)(_cx_Self* self, _cx_node* src, int32_t sn) {
if (sn == 0)
return 0;
- int32_t tx, tn = _cx_memb(_new_node_)(self, src[sn].level);
- self->nodes[tn].value = _cx_memb(_value_clone)(src[sn].value);
- tx = _cx_memb(_clone_r_)(self, src, src[sn].link[0]); self->nodes[tn].link[0] = tx;
- tx = _cx_memb(_clone_r_)(self, src, src[sn].link[1]); self->nodes[tn].link[1] = tx;
+ int32_t tx, tn = _cx_MEMB(_new_node_)(self, src[sn].level);
+ self->nodes[tn].value = _cx_MEMB(_value_clone)(src[sn].value);
+ tx = _cx_MEMB(_clone_r_)(self, src, src[sn].link[0]); self->nodes[tn].link[0] = tx;
+ tx = _cx_MEMB(_clone_r_)(self, src, src[sn].link[1]); self->nodes[tn].link[1] = tx;
return tn;
}
-STC_DEF _cx_self
-_cx_memb(_clone)(_cx_self tree) {
- _cx_self clone = _cx_memb(_with_capacity)(tree.size);
- int32_t root = _cx_memb(_clone_r_)(&clone, tree.nodes, tree.root);
+STC_DEF _cx_Self
+_cx_MEMB(_clone)(_cx_Self tree) {
+ _cx_Self clone = _cx_MEMB(_with_capacity)(tree.size);
+ int32_t root = _cx_MEMB(_clone_r_)(&clone, tree.nodes, tree.root);
clone.root = root;
clone.size = tree.size;
return clone;
@@ -556,8 +556,8 @@ _cx_memb(_clone)(_cx_self tree) {
#if !defined i_no_emplace
STC_DEF _cx_result
-_cx_memb(_emplace)(_cx_self* self, _cx_keyraw rkey _i_MAP_ONLY(, i_valraw rmapped)) {
- _cx_result res = _cx_memb(_insert_entry_)(self, rkey);
+_cx_MEMB(_emplace)(_cx_Self* self, _cx_keyraw rkey _i_MAP_ONLY(, i_valraw rmapped)) {
+ _cx_result res = _cx_MEMB(_insert_entry_)(self, rkey);
if (res.inserted) {
*_i_keyref(res.ref) = i_keyfrom(rkey);
_i_MAP_ONLY(res.ref->second = i_valfrom(rmapped);)
@@ -567,18 +567,18 @@ _cx_memb(_emplace)(_cx_self* self, _cx_keyraw rkey _i_MAP_ONLY(, i_valraw rmappe
#endif // i_no_emplace
static void
-_cx_memb(_drop_r_)(_cx_node* d, int32_t tn) {
+_cx_MEMB(_drop_r_)(_cx_node* d, int32_t tn) {
if (tn) {
- _cx_memb(_drop_r_)(d, d[tn].link[0]);
- _cx_memb(_drop_r_)(d, d[tn].link[1]);
- _cx_memb(_value_drop)(&d[tn].value);
+ _cx_MEMB(_drop_r_)(d, d[tn].link[0]);
+ _cx_MEMB(_drop_r_)(d, d[tn].link[1]);
+ _cx_MEMB(_value_drop)(&d[tn].value);
}
}
STC_DEF void
-_cx_memb(_drop)(_cx_self* self) {
+_cx_MEMB(_drop)(_cx_Self* self) {
if (self->cap) {
- _cx_memb(_drop_r_)(self->nodes, self->root);
+ _cx_MEMB(_drop_r_)(self->nodes, self->root);
i_free(self->nodes);
}
}
diff --git a/include/stc/cstack.h b/include/stc/cstack.h
index 5f0ffe2b..24ec2d5f 100644
--- a/include/stc/cstack.h
+++ b/include/stc/cstack.h
@@ -35,64 +35,64 @@
#ifndef i_is_forward
#ifdef i_capacity
#define i_no_clone
- _cx_deftypes(_c_cstack_fixed, _cx_self, i_key, i_capacity);
+ _cx_DEFTYPES(_c_cstack_fixed, _cx_Self, i_key, i_capacity);
#else
- _cx_deftypes(_c_cstack_types, _cx_self, i_key);
+ _cx_DEFTYPES(_c_cstack_types, _cx_Self, i_key);
#endif
#endif
typedef i_keyraw _cx_raw;
#ifdef i_capacity
-STC_INLINE void _cx_memb(_init)(_cx_self* self)
+STC_INLINE void _cx_MEMB(_init)(_cx_Self* self)
{ self->_len = 0; }
#else
-STC_INLINE _cx_self _cx_memb(_init)(void) {
- _cx_self out = {0};
+STC_INLINE _cx_Self _cx_MEMB(_init)(void) {
+ _cx_Self out = {0};
return out;
}
-STC_INLINE _cx_self _cx_memb(_with_capacity)(intptr_t cap) {
- _cx_self out = {(_cx_value *) i_malloc(cap*c_sizeof(i_key)), 0, cap};
+STC_INLINE _cx_Self _cx_MEMB(_with_capacity)(intptr_t cap) {
+ _cx_Self out = {(_cx_value *) i_malloc(cap*c_sizeof(i_key)), 0, cap};
return out;
}
-STC_INLINE _cx_self _cx_memb(_with_size)(intptr_t size, i_key null) {
- _cx_self out = {(_cx_value *) i_malloc(size*c_sizeof null), size, size};
+STC_INLINE _cx_Self _cx_MEMB(_with_size)(intptr_t size, i_key null) {
+ _cx_Self out = {(_cx_value *) i_malloc(size*c_sizeof null), size, size};
while (size) out.data[--size] = null;
return out;
}
#endif // i_capacity
-STC_INLINE void _cx_memb(_clear)(_cx_self* self) {
+STC_INLINE void _cx_MEMB(_clear)(_cx_Self* self) {
_cx_value *p = self->data + self->_len;
while (p-- != self->data) { i_keydrop(p); }
self->_len = 0;
}
-STC_INLINE void _cx_memb(_drop)(_cx_self* self) {
- _cx_memb(_clear)(self);
+STC_INLINE void _cx_MEMB(_drop)(_cx_Self* self) {
+ _cx_MEMB(_clear)(self);
#ifndef i_capacity
i_free(self->data);
#endif
}
-STC_INLINE intptr_t _cx_memb(_size)(const _cx_self* self)
+STC_INLINE intptr_t _cx_MEMB(_size)(const _cx_Self* self)
{ return self->_len; }
-STC_INLINE bool _cx_memb(_empty)(const _cx_self* self)
+STC_INLINE bool _cx_MEMB(_empty)(const _cx_Self* self)
{ return !self->_len; }
-STC_INLINE intptr_t _cx_memb(_capacity)(const _cx_self* self) {
+STC_INLINE intptr_t _cx_MEMB(_capacity)(const _cx_Self* self) {
#ifndef i_capacity
return self->_cap;
#else
return i_capacity;
#endif
}
-STC_INLINE void _cx_memb(_value_drop)(_cx_value* val)
+STC_INLINE void _cx_MEMB(_value_drop)(_cx_value* val)
{ i_keydrop(val); }
-STC_INLINE bool _cx_memb(_reserve)(_cx_self* self, intptr_t n) {
+STC_INLINE bool _cx_MEMB(_reserve)(_cx_Self* self, intptr_t n) {
if (n < self->_len) return true;
#ifndef i_capacity
_cx_value *t = (_cx_value *)i_realloc(self->data, n*c_sizeof *t);
@@ -101,100 +101,100 @@ STC_INLINE bool _cx_memb(_reserve)(_cx_self* self, intptr_t n) {
return false;
}
-STC_INLINE _cx_value* _cx_memb(_append_uninit)(_cx_self *self, intptr_t n) {
+STC_INLINE _cx_value* _cx_MEMB(_append_uninit)(_cx_Self *self, intptr_t n) {
intptr_t len = self->_len;
- if (!_cx_memb(_reserve)(self, len + n)) return NULL;
+ if (!_cx_MEMB(_reserve)(self, len + n)) return NULL;
self->_len += n;
return self->data + len;
}
-STC_INLINE void _cx_memb(_shrink_to_fit)(_cx_self* self)
- { _cx_memb(_reserve)(self, self->_len); }
+STC_INLINE void _cx_MEMB(_shrink_to_fit)(_cx_Self* self)
+ { _cx_MEMB(_reserve)(self, self->_len); }
-STC_INLINE const _cx_value* _cx_memb(_top)(const _cx_self* self)
+STC_INLINE const _cx_value* _cx_MEMB(_top)(const _cx_Self* self)
{ return &self->data[self->_len - 1]; }
-STC_INLINE _cx_value* _cx_memb(_back)(const _cx_self* self)
+STC_INLINE _cx_value* _cx_MEMB(_back)(const _cx_Self* self)
{ return (_cx_value*) &self->data[self->_len - 1]; }
-STC_INLINE _cx_value* _cx_memb(_front)(const _cx_self* self)
+STC_INLINE _cx_value* _cx_MEMB(_front)(const _cx_Self* self)
{ return (_cx_value*) &self->data[0]; }
-STC_INLINE _cx_value* _cx_memb(_push)(_cx_self* self, _cx_value val) {
- if (self->_len == _cx_memb(_capacity)(self))
- if (!_cx_memb(_reserve)(self, self->_len*3/2 + 4))
+STC_INLINE _cx_value* _cx_MEMB(_push)(_cx_Self* self, _cx_value val) {
+ if (self->_len == _cx_MEMB(_capacity)(self))
+ if (!_cx_MEMB(_reserve)(self, self->_len*3/2 + 4))
return NULL;
_cx_value* vp = self->data + self->_len++;
*vp = val; return vp;
}
-STC_INLINE void _cx_memb(_pop)(_cx_self* self)
+STC_INLINE void _cx_MEMB(_pop)(_cx_Self* self)
{ assert(self->_len); _cx_value* p = &self->data[--self->_len]; i_keydrop(p); }
-STC_INLINE _cx_value _cx_memb(_pull)(_cx_self* self)
+STC_INLINE _cx_value _cx_MEMB(_pull)(_cx_Self* self)
{ assert(self->_len); return self->data[--self->_len]; }
-STC_INLINE void _cx_memb(_put_n)(_cx_self* self, const _cx_raw* raw, intptr_t n)
- { while (n--) _cx_memb(_push)(self, i_keyfrom(*raw++)); }
+STC_INLINE void _cx_MEMB(_put_n)(_cx_Self* self, const _cx_raw* raw, intptr_t n)
+ { while (n--) _cx_MEMB(_push)(self, i_keyfrom(*raw++)); }
-STC_INLINE _cx_self _cx_memb(_from_n)(const _cx_raw* raw, intptr_t n)
- { _cx_self cx = {0}; _cx_memb(_put_n)(&cx, raw, n); return cx; }
+STC_INLINE _cx_Self _cx_MEMB(_from_n)(const _cx_raw* raw, intptr_t n)
+ { _cx_Self cx = {0}; _cx_MEMB(_put_n)(&cx, raw, n); return cx; }
-STC_INLINE const _cx_value* _cx_memb(_at)(const _cx_self* self, intptr_t idx)
+STC_INLINE const _cx_value* _cx_MEMB(_at)(const _cx_Self* self, intptr_t idx)
{ assert(idx < self->_len); return self->data + idx; }
-STC_INLINE _cx_value* _cx_memb(_at_mut)(_cx_self* self, intptr_t idx)
+STC_INLINE _cx_value* _cx_MEMB(_at_mut)(_cx_Self* self, intptr_t idx)
{ assert(idx < self->_len); return self->data + idx; }
#if !defined i_no_emplace
-STC_INLINE _cx_value* _cx_memb(_emplace)(_cx_self* self, _cx_raw raw)
- { return _cx_memb(_push)(self, i_keyfrom(raw)); }
+STC_INLINE _cx_value* _cx_MEMB(_emplace)(_cx_Self* self, _cx_raw raw)
+ { return _cx_MEMB(_push)(self, i_keyfrom(raw)); }
#endif // !i_no_emplace
#if !defined i_no_clone
-STC_INLINE _cx_self _cx_memb(_clone)(_cx_self v) {
- _cx_self out = {(_cx_value *)i_malloc(v._len*c_sizeof(_cx_value)), v._len, v._len};
+STC_INLINE _cx_Self _cx_MEMB(_clone)(_cx_Self v) {
+ _cx_Self out = {(_cx_value *)i_malloc(v._len*c_sizeof(_cx_value)), v._len, v._len};
if (!out.data) out._cap = 0;
else for (intptr_t i = 0; i < v._len; ++v.data)
out.data[i++] = i_keyclone((*v.data));
return out;
}
-STC_INLINE void _cx_memb(_copy)(_cx_self *self, const _cx_self* other) {
+STC_INLINE void _cx_MEMB(_copy)(_cx_Self *self, const _cx_Self* other) {
if (self->data == other->data) return;
- _cx_memb(_drop)(self);
- *self = _cx_memb(_clone)(*other);
+ _cx_MEMB(_drop)(self);
+ *self = _cx_MEMB(_clone)(*other);
}
-STC_INLINE i_key _cx_memb(_value_clone)(_cx_value val)
+STC_INLINE i_key _cx_MEMB(_value_clone)(_cx_value val)
{ return i_keyclone(val); }
-STC_INLINE i_keyraw _cx_memb(_value_toraw)(const _cx_value* val)
+STC_INLINE i_keyraw _cx_MEMB(_value_toraw)(const _cx_value* val)
{ return i_keyto(val); }
#endif // !i_no_clone
-STC_INLINE _cx_iter _cx_memb(_begin)(const _cx_self* self) {
+STC_INLINE _cx_iter _cx_MEMB(_begin)(const _cx_Self* self) {
return c_LITERAL(_cx_iter){self->_len ? (_cx_value*)self->data : NULL,
(_cx_value*)self->data + self->_len};
}
-STC_INLINE _cx_iter _cx_memb(_end)(const _cx_self* self)
+STC_INLINE _cx_iter _cx_MEMB(_end)(const _cx_Self* self)
{ return c_LITERAL(_cx_iter){NULL, (_cx_value*)self->data + self->_len}; }
-STC_INLINE void _cx_memb(_next)(_cx_iter* it)
+STC_INLINE void _cx_MEMB(_next)(_cx_iter* it)
{ if (++it->ref == it->end) it->ref = NULL; }
-STC_INLINE _cx_iter _cx_memb(_advance)(_cx_iter it, size_t n)
+STC_INLINE _cx_iter _cx_MEMB(_advance)(_cx_iter it, size_t n)
{ if ((it.ref += n) >= it.end) it.ref = NULL ; return it; }
-STC_INLINE intptr_t _cx_memb(_index)(const _cx_self* self, _cx_iter it)
+STC_INLINE intptr_t _cx_MEMB(_index)(const _cx_Self* self, _cx_iter it)
{ return (it.ref - self->data); }
-STC_INLINE void _cx_memb(_adjust_end_)(_cx_self* self, intptr_t n)
+STC_INLINE void _cx_MEMB(_adjust_end_)(_cx_Self* self, intptr_t n)
{ self->_len += n; }
#if defined _i_has_eq || defined _i_has_cmp
STC_INLINE bool
-_cx_memb(_eq)(const _cx_self* self, const _cx_self* other) {
+_cx_MEMB(_eq)(const _cx_Self* self, const _cx_Self* other) {
if (self->_len != other->_len) return false;
for (intptr_t i = 0; i < self->_len; ++i) {
const _cx_raw _rx = i_keyto(self->data+i), _ry = i_keyto(other->data+i);
diff --git a/include/stc/cvec.h b/include/stc/cvec.h
index 71787733..3213dd1c 100644
--- a/include/stc/cvec.h
+++ b/include/stc/cvec.h
@@ -74,164 +74,164 @@ int main() {
#include "priv/template.h"
#ifndef i_is_forward
- _cx_deftypes(_c_cvec_types, _cx_self, i_key);
+ _cx_DEFTYPES(_c_cvec_types, _cx_Self, i_key);
#endif
typedef i_keyraw _cx_raw;
-STC_API _cx_self _cx_memb(_init)(void);
-STC_API void _cx_memb(_drop)(_cx_self* self);
-STC_API void _cx_memb(_clear)(_cx_self* self);
-STC_API bool _cx_memb(_reserve)(_cx_self* self, intptr_t cap);
-STC_API bool _cx_memb(_resize)(_cx_self* self, intptr_t size, i_key null);
-STC_API _cx_value* _cx_memb(_push)(_cx_self* self, i_key value);
-STC_API _cx_iter _cx_memb(_erase_n)(_cx_self* self, intptr_t idx, intptr_t n);
-STC_API _cx_iter _cx_memb(_insert_uninit)(_cx_self* self, intptr_t idx, intptr_t n);
+STC_API _cx_Self _cx_MEMB(_init)(void);
+STC_API void _cx_MEMB(_drop)(_cx_Self* self);
+STC_API void _cx_MEMB(_clear)(_cx_Self* self);
+STC_API bool _cx_MEMB(_reserve)(_cx_Self* self, intptr_t cap);
+STC_API bool _cx_MEMB(_resize)(_cx_Self* self, intptr_t size, i_key null);
+STC_API _cx_value* _cx_MEMB(_push)(_cx_Self* self, i_key value);
+STC_API _cx_iter _cx_MEMB(_erase_n)(_cx_Self* self, intptr_t idx, intptr_t n);
+STC_API _cx_iter _cx_MEMB(_insert_uninit)(_cx_Self* self, intptr_t idx, intptr_t n);
#if !defined i_no_cmp || defined _i_has_eq
-STC_API _cx_iter _cx_memb(_find_in)(_cx_iter it1, _cx_iter it2, _cx_raw raw);
+STC_API _cx_iter _cx_MEMB(_find_in)(_cx_iter it1, _cx_iter it2, _cx_raw raw);
#endif
#ifndef i_no_cmp
-STC_API int _cx_memb(_value_cmp)(const _cx_value* x, const _cx_value* y);
-STC_API _cx_iter _cx_memb(_binary_search_in)(_cx_iter it1, _cx_iter it2, _cx_raw raw, _cx_iter* lower_bound);
+STC_API int _cx_MEMB(_value_cmp)(const _cx_value* x, const _cx_value* y);
+STC_API _cx_iter _cx_MEMB(_binary_search_in)(_cx_iter it1, _cx_iter it2, _cx_raw raw, _cx_iter* lower_bound);
#endif
-STC_INLINE void _cx_memb(_value_drop)(_cx_value* val) { i_keydrop(val); }
+STC_INLINE void _cx_MEMB(_value_drop)(_cx_value* val) { i_keydrop(val); }
#if !defined i_no_emplace
STC_API _cx_iter
-_cx_memb(_emplace_n)(_cx_self* self, intptr_t idx, const _cx_raw raw[], intptr_t n);
+_cx_MEMB(_emplace_n)(_cx_Self* self, intptr_t idx, const _cx_raw raw[], intptr_t n);
-STC_INLINE _cx_value* _cx_memb(_emplace)(_cx_self* self, _cx_raw raw) {
- return _cx_memb(_push)(self, i_keyfrom(raw));
+STC_INLINE _cx_value* _cx_MEMB(_emplace)(_cx_Self* self, _cx_raw raw) {
+ return _cx_MEMB(_push)(self, i_keyfrom(raw));
}
-STC_INLINE _cx_value* _cx_memb(_emplace_back)(_cx_self* self, _cx_raw raw) {
- return _cx_memb(_push)(self, i_keyfrom(raw));
+STC_INLINE _cx_value* _cx_MEMB(_emplace_back)(_cx_Self* self, _cx_raw raw) {
+ return _cx_MEMB(_push)(self, i_keyfrom(raw));
}
-STC_INLINE _cx_iter _cx_memb(_emplace_at)(_cx_self* self, _cx_iter it, _cx_raw raw) {
- return _cx_memb(_emplace_n)(self, _it_ptr(it) - self->data, &raw, 1);
+STC_INLINE _cx_iter _cx_MEMB(_emplace_at)(_cx_Self* self, _cx_iter it, _cx_raw raw) {
+ return _cx_MEMB(_emplace_n)(self, _it_ptr(it) - self->data, &raw, 1);
}
#endif // !i_no_emplace
#if !defined i_no_clone
-STC_API _cx_self _cx_memb(_clone)(_cx_self cx);
-STC_API _cx_iter _cx_memb(_copy_n)(_cx_self* self, intptr_t idx, const _cx_value arr[], intptr_t n);
-STC_INLINE void _cx_memb(_put_n)(_cx_self* self, const _cx_raw* raw, intptr_t n)
- { while (n--) _cx_memb(_push)(self, i_keyfrom(*raw++)); }
-STC_INLINE _cx_self _cx_memb(_from_n)(const _cx_raw* raw, intptr_t n)
- { _cx_self cx = {0}; _cx_memb(_put_n)(&cx, raw, n); return cx; }
-STC_INLINE i_key _cx_memb(_value_clone)(_cx_value val)
+STC_API _cx_Self _cx_MEMB(_clone)(_cx_Self cx);
+STC_API _cx_iter _cx_MEMB(_copy_n)(_cx_Self* self, intptr_t idx, const _cx_value arr[], intptr_t n);
+STC_INLINE void _cx_MEMB(_put_n)(_cx_Self* self, const _cx_raw* raw, intptr_t n)
+ { while (n--) _cx_MEMB(_push)(self, i_keyfrom(*raw++)); }
+STC_INLINE _cx_Self _cx_MEMB(_from_n)(const _cx_raw* raw, intptr_t n)
+ { _cx_Self cx = {0}; _cx_MEMB(_put_n)(&cx, raw, n); return cx; }
+STC_INLINE i_key _cx_MEMB(_value_clone)(_cx_value val)
{ return i_keyclone(val); }
-STC_INLINE void _cx_memb(_copy)(_cx_self* self, const _cx_self* other) {
+STC_INLINE void _cx_MEMB(_copy)(_cx_Self* self, const _cx_Self* other) {
if (self->data == other->data) return;
- _cx_memb(_clear)(self);
- _cx_memb(_copy_n)(self, 0, other->data, other->_len);
+ _cx_MEMB(_clear)(self);
+ _cx_MEMB(_copy_n)(self, 0, other->data, other->_len);
}
#endif // !i_no_clone
-STC_INLINE intptr_t _cx_memb(_size)(const _cx_self* self) { return self->_len; }
-STC_INLINE intptr_t _cx_memb(_capacity)(const _cx_self* self) { return self->_cap; }
-STC_INLINE bool _cx_memb(_empty)(const _cx_self* self) { return !self->_len; }
-STC_INLINE _cx_raw _cx_memb(_value_toraw)(const _cx_value* val) { return i_keyto(val); }
-STC_INLINE _cx_value* _cx_memb(_front)(const _cx_self* self) { return self->data; }
-STC_INLINE _cx_value* _cx_memb(_back)(const _cx_self* self)
+STC_INLINE intptr_t _cx_MEMB(_size)(const _cx_Self* self) { return self->_len; }
+STC_INLINE intptr_t _cx_MEMB(_capacity)(const _cx_Self* self) { return self->_cap; }
+STC_INLINE bool _cx_MEMB(_empty)(const _cx_Self* self) { return !self->_len; }
+STC_INLINE _cx_raw _cx_MEMB(_value_toraw)(const _cx_value* val) { return i_keyto(val); }
+STC_INLINE _cx_value* _cx_MEMB(_front)(const _cx_Self* self) { return self->data; }
+STC_INLINE _cx_value* _cx_MEMB(_back)(const _cx_Self* self)
{ return self->data + self->_len - 1; }
-STC_INLINE void _cx_memb(_pop)(_cx_self* self)
+STC_INLINE void _cx_MEMB(_pop)(_cx_Self* self)
{ assert(self->_len); _cx_value* p = &self->data[--self->_len]; i_keydrop(p); }
-STC_INLINE _cx_value _cx_memb(_pull)(_cx_self* self)
+STC_INLINE _cx_value _cx_MEMB(_pull)(_cx_Self* self)
{ assert(self->_len); return self->data[--self->_len]; }
-STC_INLINE _cx_value* _cx_memb(_push_back)(_cx_self* self, i_key value)
- { return _cx_memb(_push)(self, value); }
-STC_INLINE void _cx_memb(_pop_back)(_cx_self* self) { _cx_memb(_pop)(self); }
-
-STC_INLINE _cx_self
-_cx_memb(_with_size)(const intptr_t size, i_key null) {
- _cx_self cx = _cx_memb(_init)();
- _cx_memb(_resize)(&cx, size, null);
+STC_INLINE _cx_value* _cx_MEMB(_push_back)(_cx_Self* self, i_key value)
+ { return _cx_MEMB(_push)(self, value); }
+STC_INLINE void _cx_MEMB(_pop_back)(_cx_Self* self) { _cx_MEMB(_pop)(self); }
+
+STC_INLINE _cx_Self
+_cx_MEMB(_with_size)(const intptr_t size, i_key null) {
+ _cx_Self cx = _cx_MEMB(_init)();
+ _cx_MEMB(_resize)(&cx, size, null);
return cx;
}
-STC_INLINE _cx_self
-_cx_memb(_with_capacity)(const intptr_t cap) {
- _cx_self cx = _cx_memb(_init)();
- _cx_memb(_reserve)(&cx, cap);
+STC_INLINE _cx_Self
+_cx_MEMB(_with_capacity)(const intptr_t cap) {
+ _cx_Self cx = _cx_MEMB(_init)();
+ _cx_MEMB(_reserve)(&cx, cap);
return cx;
}
STC_INLINE void
-_cx_memb(_shrink_to_fit)(_cx_self* self) {
- _cx_memb(_reserve)(self, _cx_memb(_size)(self));
+_cx_MEMB(_shrink_to_fit)(_cx_Self* self) {
+ _cx_MEMB(_reserve)(self, _cx_MEMB(_size)(self));
}
STC_INLINE _cx_iter
-_cx_memb(_insert_n)(_cx_self* self, const intptr_t idx, const _cx_value arr[], const intptr_t n) {
- _cx_iter it = _cx_memb(_insert_uninit)(self, idx, n);
+_cx_MEMB(_insert_n)(_cx_Self* self, const intptr_t idx, const _cx_value arr[], const intptr_t n) {
+ _cx_iter it = _cx_MEMB(_insert_uninit)(self, idx, n);
if (it.ref)
c_memcpy(it.ref, arr, n*c_sizeof *arr);
return it;
}
STC_INLINE _cx_iter
-_cx_memb(_insert)(_cx_self* self, const intptr_t idx, const i_key value) {
- return _cx_memb(_insert_n)(self, idx, &value, 1);
+_cx_MEMB(_insert)(_cx_Self* self, const intptr_t idx, const i_key value) {
+ return _cx_MEMB(_insert_n)(self, idx, &value, 1);
}
STC_INLINE _cx_iter
-_cx_memb(_insert_at)(_cx_self* self, _cx_iter it, const i_key value) {
- return _cx_memb(_insert_n)(self, _it_ptr(it) - self->data, &value, 1);
+_cx_MEMB(_insert_at)(_cx_Self* self, _cx_iter it, const i_key value) {
+ return _cx_MEMB(_insert_n)(self, _it_ptr(it) - self->data, &value, 1);
}
STC_INLINE _cx_iter
-_cx_memb(_erase_at)(_cx_self* self, _cx_iter it) {
- return _cx_memb(_erase_n)(self, it.ref - self->data, 1);
+_cx_MEMB(_erase_at)(_cx_Self* self, _cx_iter it) {
+ return _cx_MEMB(_erase_n)(self, it.ref - self->data, 1);
}
STC_INLINE _cx_iter
-_cx_memb(_erase_range)(_cx_self* self, _cx_iter i1, _cx_iter i2) {
- return _cx_memb(_erase_n)(self, i1.ref - self->data, _it2_ptr(i1, i2) - i1.ref);
+_cx_MEMB(_erase_range)(_cx_Self* self, _cx_iter i1, _cx_iter i2) {
+ return _cx_MEMB(_erase_n)(self, i1.ref - self->data, _it2_ptr(i1, i2) - i1.ref);
}
STC_INLINE const _cx_value*
-_cx_memb(_at)(const _cx_self* self, const intptr_t idx) {
+_cx_MEMB(_at)(const _cx_Self* self, const intptr_t idx) {
assert(idx < self->_len); return self->data + idx;
}
STC_INLINE _cx_value*
-_cx_memb(_at_mut)(_cx_self* self, const intptr_t idx) {
+_cx_MEMB(_at_mut)(_cx_Self* self, const intptr_t idx) {
assert(idx < self->_len); return self->data + idx;
}
-STC_INLINE _cx_iter _cx_memb(_begin)(const _cx_self* self) {
+STC_INLINE _cx_iter _cx_MEMB(_begin)(const _cx_Self* self) {
intptr_t n = self->_len;
return c_LITERAL(_cx_iter){n ? self->data : NULL, self->data + n};
}
-STC_INLINE _cx_iter _cx_memb(_end)(const _cx_self* self)
+STC_INLINE _cx_iter _cx_MEMB(_end)(const _cx_Self* self)
{ return c_LITERAL(_cx_iter){NULL, self->data + self->_len}; }
-STC_INLINE void _cx_memb(_next)(_cx_iter* it)
+STC_INLINE void _cx_MEMB(_next)(_cx_iter* it)
{ if (++it->ref == it->end) it->ref = NULL; }
-STC_INLINE _cx_iter _cx_memb(_advance)(_cx_iter it, size_t n)
+STC_INLINE _cx_iter _cx_MEMB(_advance)(_cx_iter it, size_t n)
{ if ((it.ref += n) >= it.end) it.ref = NULL; return it; }
-STC_INLINE intptr_t _cx_memb(_index)(const _cx_self* self, _cx_iter it)
+STC_INLINE intptr_t _cx_MEMB(_index)(const _cx_Self* self, _cx_iter it)
{ return (it.ref - self->data); }
-STC_INLINE void _cx_memb(_adjust_end_)(_cx_self* self, intptr_t n)
+STC_INLINE void _cx_MEMB(_adjust_end_)(_cx_Self* self, intptr_t n)
{ self->_len += n; }
#if !defined i_no_cmp || defined _i_has_eq
STC_INLINE _cx_iter
-_cx_memb(_find)(const _cx_self* self, _cx_raw raw) {
- return _cx_memb(_find_in)(_cx_memb(_begin)(self), _cx_memb(_end)(self), raw);
+_cx_MEMB(_find)(const _cx_Self* self, _cx_raw raw) {
+ return _cx_MEMB(_find_in)(_cx_MEMB(_begin)(self), _cx_MEMB(_end)(self), raw);
}
STC_INLINE const _cx_value*
-_cx_memb(_get)(const _cx_self* self, _cx_raw raw) {
- return _cx_memb(_find)(self, raw).ref;
+_cx_MEMB(_get)(const _cx_Self* self, _cx_raw raw) {
+ return _cx_MEMB(_find)(self, raw).ref;
}
STC_INLINE _cx_value*
-_cx_memb(_get_mut)(const _cx_self* self, _cx_raw raw)
- { return (_cx_value*) _cx_memb(_get)(self, raw); }
+_cx_MEMB(_get_mut)(const _cx_Self* self, _cx_raw raw)
+ { return (_cx_value*) _cx_MEMB(_get)(self, raw); }
STC_INLINE bool
-_cx_memb(_eq)(const _cx_self* self, const _cx_self* other) {
+_cx_MEMB(_eq)(const _cx_Self* self, const _cx_Self* other) {
if (self->_len != other->_len) return false;
for (intptr_t i = 0; i < self->_len; ++i) {
const _cx_raw _rx = i_keyto(self->data+i), _ry = i_keyto(other->data+i);
@@ -243,39 +243,39 @@ _cx_memb(_eq)(const _cx_self* self, const _cx_self* other) {
#ifndef i_no_cmp
STC_INLINE _cx_iter
-_cx_memb(_binary_search)(const _cx_self* self, _cx_raw raw) {
+_cx_MEMB(_binary_search)(const _cx_Self* self, _cx_raw raw) {
_cx_iter lower;
- return _cx_memb(_binary_search_in)(_cx_memb(_begin)(self), _cx_memb(_end)(self), raw, &lower);
+ return _cx_MEMB(_binary_search_in)(_cx_MEMB(_begin)(self), _cx_MEMB(_end)(self), raw, &lower);
}
STC_INLINE _cx_iter
-_cx_memb(_lower_bound)(const _cx_self* self, _cx_raw raw) {
+_cx_MEMB(_lower_bound)(const _cx_Self* self, _cx_raw raw) {
_cx_iter lower;
- _cx_memb(_binary_search_in)(_cx_memb(_begin)(self), _cx_memb(_end)(self), raw, &lower);
+ _cx_MEMB(_binary_search_in)(_cx_MEMB(_begin)(self), _cx_MEMB(_end)(self), raw, &lower);
return lower;
}
STC_INLINE void
-_cx_memb(_sort_range)(_cx_iter i1, _cx_iter i2, int(*cmp)(const _cx_value*, const _cx_value*)) {
+_cx_MEMB(_sort_range)(_cx_iter i1, _cx_iter i2, int(*cmp)(const _cx_value*, const _cx_value*)) {
qsort(i1.ref, (size_t)(_it2_ptr(i1, i2) - i1.ref), sizeof(_cx_value),
(int(*)(const void*, const void*)) cmp);
}
STC_INLINE void
-_cx_memb(_sort)(_cx_self* self) {
- _cx_memb(_sort_range)(_cx_memb(_begin)(self), _cx_memb(_end)(self), _cx_memb(_value_cmp));
+_cx_MEMB(_sort)(_cx_Self* self) {
+ _cx_MEMB(_sort_range)(_cx_MEMB(_begin)(self), _cx_MEMB(_end)(self), _cx_MEMB(_value_cmp));
}
#endif // !c_no_cmp
/* -------------------------- IMPLEMENTATION ------------------------- */
#if defined(i_implement) || defined(i_static)
-STC_DEF _cx_self
-_cx_memb(_init)(void) {
- return c_LITERAL(_cx_self){NULL};
+STC_DEF _cx_Self
+_cx_MEMB(_init)(void) {
+ return c_LITERAL(_cx_Self){NULL};
}
STC_DEF void
-_cx_memb(_clear)(_cx_self* self) {
+_cx_MEMB(_clear)(_cx_Self* self) {
if (self->_cap) {
for (_cx_value *p = self->data, *q = p + self->_len; p != q; ) {
--q; i_keydrop(q);
@@ -285,15 +285,15 @@ _cx_memb(_clear)(_cx_self* self) {
}
STC_DEF void
-_cx_memb(_drop)(_cx_self* self) {
+_cx_MEMB(_drop)(_cx_Self* self) {
if (self->_cap == 0)
return;
- _cx_memb(_clear)(self);
+ _cx_MEMB(_clear)(self);
i_free(self->data);
}
STC_DEF bool
-_cx_memb(_reserve)(_cx_self* self, const intptr_t cap) {
+_cx_MEMB(_reserve)(_cx_Self* self, const intptr_t cap) {
if (cap > self->_cap || (cap && cap == self->_len)) {
_cx_value* d = (_cx_value*)i_realloc(self->data, cap*c_sizeof(i_key));
if (!d)
@@ -305,8 +305,8 @@ _cx_memb(_reserve)(_cx_self* self, const intptr_t cap) {
}
STC_DEF bool
-_cx_memb(_resize)(_cx_self* self, const intptr_t len, i_key null) {
- if (!_cx_memb(_reserve)(self, len))
+_cx_MEMB(_resize)(_cx_Self* self, const intptr_t len, i_key null) {
+ if (!_cx_MEMB(_reserve)(self, len))
return false;
const intptr_t n = self->_len;
for (intptr_t i = len; i < n; ++i)
@@ -318,9 +318,9 @@ _cx_memb(_resize)(_cx_self* self, const intptr_t len, i_key null) {
}
STC_DEF _cx_value*
-_cx_memb(_push)(_cx_self* self, i_key value) {
+_cx_MEMB(_push)(_cx_Self* self, i_key value) {
if (self->_len == self->_cap)
- if (!_cx_memb(_reserve)(self, self->_len*3/2 + 4))
+ if (!_cx_MEMB(_reserve)(self, self->_len*3/2 + 4))
return NULL;
_cx_value *v = self->data + self->_len++;
*v = value;
@@ -328,10 +328,10 @@ _cx_memb(_push)(_cx_self* self, i_key value) {
}
STC_DEF _cx_iter
-_cx_memb(_insert_uninit)(_cx_self* self, const intptr_t idx, const intptr_t n) {
+_cx_MEMB(_insert_uninit)(_cx_Self* self, const intptr_t idx, const intptr_t n) {
if (self->_len + n > self->_cap)
- if (!_cx_memb(_reserve)(self, self->_len*3/2 + n))
- return _cx_memb(_end)(self);
+ if (!_cx_MEMB(_reserve)(self, self->_len*3/2 + n))
+ return _cx_MEMB(_end)(self);
_cx_value* pos = self->data + idx;
c_memmove(pos + n, pos, (self->_len - idx)*c_sizeof *pos);
@@ -340,7 +340,7 @@ _cx_memb(_insert_uninit)(_cx_self* self, const intptr_t idx, const intptr_t n) {
}
STC_DEF _cx_iter
-_cx_memb(_erase_n)(_cx_self* self, const intptr_t idx, const intptr_t len) {
+_cx_MEMB(_erase_n)(_cx_Self* self, const intptr_t idx, const intptr_t len) {
_cx_value* d = self->data + idx, *p = d, *end = self->data + self->_len;
for (intptr_t i = 0; i < len; ++i, ++p)
{ i_keydrop(p); }
@@ -350,17 +350,17 @@ _cx_memb(_erase_n)(_cx_self* self, const intptr_t idx, const intptr_t len) {
}
#if !defined i_no_clone
-STC_DEF _cx_self
-_cx_memb(_clone)(_cx_self cx) {
- _cx_self out = _cx_memb(_init)();
- _cx_memb(_copy_n)(&out, 0, cx.data, cx._len);
+STC_DEF _cx_Self
+_cx_MEMB(_clone)(_cx_Self cx) {
+ _cx_Self out = _cx_MEMB(_init)();
+ _cx_MEMB(_copy_n)(&out, 0, cx.data, cx._len);
return out;
}
STC_DEF _cx_iter
-_cx_memb(_copy_n)(_cx_self* self, const intptr_t idx,
+_cx_MEMB(_copy_n)(_cx_Self* self, const intptr_t idx,
const _cx_value arr[], const intptr_t n) {
- _cx_iter it = _cx_memb(_insert_uninit)(self, idx, n);
+ _cx_iter it = _cx_MEMB(_insert_uninit)(self, idx, n);
if (it.ref)
for (_cx_value* p = it.ref, *q = p + n; p != q; ++arr)
*p++ = i_keyclone((*arr));
@@ -370,8 +370,8 @@ _cx_memb(_copy_n)(_cx_self* self, const intptr_t idx,
#if !defined i_no_emplace
STC_DEF _cx_iter
-_cx_memb(_emplace_n)(_cx_self* self, const intptr_t idx, const _cx_raw raw[], intptr_t n) {
- _cx_iter it = _cx_memb(_insert_uninit)(self, idx, n);
+_cx_MEMB(_emplace_n)(_cx_Self* self, const intptr_t idx, const _cx_raw raw[], intptr_t n) {
+ _cx_iter it = _cx_MEMB(_insert_uninit)(self, idx, n);
if (it.ref)
for (_cx_value* p = it.ref; n--; ++raw, ++p)
*p = i_keyfrom((*raw));
@@ -381,7 +381,7 @@ _cx_memb(_emplace_n)(_cx_self* self, const intptr_t idx, const _cx_raw raw[], in
#if !defined i_no_cmp || defined _i_has_eq
STC_DEF _cx_iter
-_cx_memb(_find_in)(_cx_iter i1, _cx_iter i2, _cx_raw raw) {
+_cx_MEMB(_find_in)(_cx_iter i1, _cx_iter i2, _cx_raw raw) {
const _cx_value* p2 = _it2_ptr(i1, i2);
for (; i1.ref != p2; ++i1.ref) {
const _cx_raw r = i_keyto(i1.ref);
@@ -395,7 +395,7 @@ _cx_memb(_find_in)(_cx_iter i1, _cx_iter i2, _cx_raw raw) {
#ifndef i_no_cmp
STC_DEF _cx_iter
-_cx_memb(_binary_search_in)(_cx_iter i1, _cx_iter i2, const _cx_raw raw,
+_cx_MEMB(_binary_search_in)(_cx_iter i1, _cx_iter i2, const _cx_raw raw,
_cx_iter* lower_bound) {
_cx_value* w[2] = {i1.ref, _it2_ptr(i1, i2)};
_cx_iter mid = i1;
@@ -412,7 +412,7 @@ _cx_memb(_binary_search_in)(_cx_iter i1, _cx_iter i2, const _cx_raw raw,
i1.ref = NULL; return i1;
}
-STC_DEF int _cx_memb(_value_cmp)(const _cx_value* x, const _cx_value* y) {
+STC_DEF int _cx_MEMB(_value_cmp)(const _cx_value* x, const _cx_value* y) {
const _cx_raw rx = i_keyto(x);
const _cx_raw ry = i_keyto(y);
return i_cmp((&rx), (&ry));
diff --git a/include/stc/extend.h b/include/stc/extend.h
index f697d2b3..f9ac92bf 100644
--- a/include/stc/extend.h
+++ b/include/stc/extend.h
@@ -54,7 +54,7 @@ typedef struct {
i_type get;
} c_PASTE(i_type, _ext);
-#define c_extend(self) c_container_of(self, _cx_memb(_ext), get)
+#define c_extend(self) c_container_of(self, _cx_MEMB(_ext), get)
#define i_is_forward
#define _i_inc <stc/i_base.h>
diff --git a/include/stc/priv/template.h b/include/stc/priv/template.h
index b3f3eabe..c1b7c1e7 100644
--- a/include/stc/priv/template.h
+++ b/include/stc/priv/template.h
@@ -25,17 +25,17 @@
#ifndef STC_TEMPLATE_H_INCLUDED
#define STC_TEMPLATE_H_INCLUDED
- #define _cx_self i_type
- #define _cx_memb(name) c_PASTE(_cx_self, name)
- #define _cx_deftypes(macro, SELF, ...) c_EXPAND(macro(SELF, __VA_ARGS__))
- #define _cx_value _cx_memb(_value)
- #define _cx_key _cx_memb(_key)
- #define _cx_mapped _cx_memb(_mapped)
- #define _cx_raw _cx_memb(_raw)
- #define _cx_keyraw _cx_memb(_keyraw)
- #define _cx_iter _cx_memb(_iter)
- #define _cx_result _cx_memb(_result)
- #define _cx_node _cx_memb(_node)
+ #define _cx_Self i_type
+ #define _cx_MEMB(name) c_PASTE(_cx_Self, name)
+ #define _cx_DEFTYPES(macro, SELF, ...) c_EXPAND(macro(SELF, __VA_ARGS__))
+ #define _cx_value _cx_MEMB(_value)
+ #define _cx_key _cx_MEMB(_key)
+ #define _cx_mapped _cx_MEMB(_mapped)
+ #define _cx_raw _cx_MEMB(_raw)
+ #define _cx_keyraw _cx_MEMB(_keyraw)
+ #define _cx_iter _cx_MEMB(_iter)
+ #define _cx_result _cx_MEMB(_result)
+ #define _cx_node _cx_MEMB(_node)
#endif
#ifndef i_type