summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTyge <[email protected]>2020-04-16 14:54:47 +0200
committerTyge <[email protected]>2020-04-16 14:54:47 +0200
commit342062652eaa68ebafed206c0b91b284b0497cc8 (patch)
tree7cb32e3ba539b670b9e7d4551da84d60297bd36d
parentd144c45f13a8235fbd01dc3f2a2968bec60b72a7 (diff)
downloadSTC-modified-342062652eaa68ebafed206c0b91b284b0497cc8.tar.gz
STC-modified-342062652eaa68ebafed206c0b91b284b0497cc8.zip
Some improvements
-rw-r--r--stc/carray.h57
-rw-r--r--stc/cstring.h11
2 files changed, 37 insertions, 31 deletions
diff --git a/stc/carray.h b/stc/carray.h
index 5d136e87..7bb4275f 100644
--- a/stc/carray.h
+++ b/stc/carray.h
@@ -41,79 +41,78 @@ int main()
printf("%f\n", carray2f_at(a2, 4).data[3]);
printf("%f\n", carray3f_value(a3, 5, 4, 3));
- printf("%f\n", carray3f_data(a3, 5, 4)[3]);
+ printf("%f\n", carray3f_data(a3, 5, 4)[3]);
printf("%f\n", carray3f_at2(a3, 5, 4).data[3]);
- carray_unref(a3);
- carray_unref(a2);
+ carray_destroy(a3);
+ carray_destroy(a2); // not needed, but no harm.
}
*/
#define carray_xdim(a) ((a).xdim)
-#define carray_ydim(a) ((a)._yxdim / (a).xdim)
+#define carray_ydim(a) ({const uint32_t* d__ = &(a)._yxdim; d__[0] / d__[-1];})
#define carray_zdim(a) ((a).zdim)
-#define carray_ref(a) (++(a)._refCount, a)
-#define carray_unref(a) (--(a)._refCount == 0 ? free((a).data) : (void)0)
+#define carray_destroy(a) free((a)._array)
#define declare_CArray(tag, T) \
c_struct (CArray1##tag) { \
- T* data; \
- int _refCount; \
- size_t xdim; \
+ T *data, *_array; \
+ uint32_t xdim; \
}; \
c_struct (CArray2##tag) { \
- T* data; \
- int _refCount; \
- size_t xdim, _yxdim; \
+ T *data, *_array; \
+ uint32_t xdim, _yxdim; \
}; \
c_struct (CArray3##tag) { \
- T* data; \
- int _refCount; \
- size_t xdim, _yxdim, zdim; \
+ T *data, *_array; \
+ uint32_t xdim, _yxdim, zdim; \
}; \
\
static inline CArray1##tag \
carray1##tag##_make(size_t xdim) { \
- CArray1##tag a = {c_new_2(T, xdim), 1, xdim}; return a; \
+ T* m = c_new_2(T, xdim); \
+ return (CArray1##tag) {m, m, xdim}; \
} \
static inline CArray2##tag \
carray2##tag##_make(size_t ydim, size_t xdim) { \
- CArray2##tag a = {c_new_2(T, ydim*xdim), 1, xdim, ydim*xdim}; return a; \
+ T* m = c_new_2(T, ydim*xdim); \
+ return (CArray2##tag) {m, m, xdim, ydim*xdim}; \
} \
static inline CArray3##tag \
carray3##tag##_make(size_t zdim, size_t ydim, size_t xdim) { \
- CArray3##tag a = {c_new_2(T, zdim*ydim*xdim), 1, xdim, ydim*xdim, zdim}; return a; \
+ T* m = c_new_2(T, zdim*ydim*xdim); \
+ return (CArray3##tag) {m, m, xdim, ydim*xdim, zdim}; \
} \
\
- static inline CArray1##tag \
+ static inline CArray1##tag \
carray2##tag##_at(CArray2##tag a, size_t y) { \
- CArray1##tag out = {a.data + y*a.xdim, 1000, a.xdim}; return out; \
+ return (CArray1##tag) {a.data + y*a.xdim, NULL, a.xdim}; \
} \
- static inline T* \
+ static inline T* \
carray2##tag##_data(CArray2##tag a, size_t y) { \
return a.data + y*a.xdim; \
} \
- static inline T \
+ static inline T \
carray2##tag##_value(CArray2##tag a, size_t y, size_t x) { \
return a.data[ y*a.xdim + x ]; \
} \
\
- static inline CArray2##tag \
+ static inline CArray2##tag \
carray3##tag##_at(CArray3##tag a, size_t z) { \
- CArray2##tag out = {a.data + z*a._yxdim, 1000, a.xdim, a._yxdim}; return out; \
+ return (CArray2##tag) {a.data + z*a._yxdim, NULL, a.xdim, a._yxdim}; \
} \
- static inline CArray1##tag \
+ static inline CArray1##tag \
carray3##tag##_at2(CArray3##tag a, size_t z, size_t y) { \
- CArray1##tag out = {a.data + z*a._yxdim + y*a.xdim, 1000, a.xdim}; return out; \
+ return (CArray1##tag) {a.data + z*a._yxdim + y*a.xdim, NULL, a.xdim}; \
} \
- static inline T* \
+ static inline T* \
carray3##tag##_data(CArray3##tag a, size_t z, size_t y) { \
return a.data + z*a._yxdim + y*a.xdim; \
} \
- static inline T \
+ static inline T \
carray3##tag##_value(CArray3##tag a, size_t z, size_t y, size_t x) { \
return a.data[ z*a._yxdim + y*a.xdim + x ]; \
} \
typedef T carray_##tag##_t
-
+
#endif \ No newline at end of file
diff --git a/stc/cstring.h b/stc/cstring.h
index ccc8c309..344e56aa 100644
--- a/stc/cstring.h
+++ b/stc/cstring.h
@@ -59,9 +59,16 @@ cstring_reserve(CString* self, size_t cap) {
static inline void
cstring_resize(CString* self, size_t len, char fill) {
size_t n = cstring_size(*self);
- cstring_reserve(self, len);
+ cstring_reserve(self, len);
if (len > n) memset(self->str + n, fill, len - n);
- self->str[ _cstring_rep(*self)[0] = len ] = '\0';
+ self->str[ _cstring_rep(*self)[0] = len ] = '\0';
+}
+
+static inline CString
+cstring_move(CString* self) {
+ CString mv = *self;
+ *self = cstring_init;
+ return mv;
}
static inline void