summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2021-03-22 21:40:12 +0100
committerTyge Løvset <[email protected]>2021-03-22 21:40:12 +0100
commite31376cace6a2bae2d13770ad818a38b3d3d6040 (patch)
treec2016c38ad00cdd769540983397341caeac0f7fd
parentdd05e8f37b90cff5ab4bce5019d688f09b4fbf52 (diff)
downloadSTC-modified-e31376cace6a2bae2d13770ad818a38b3d3d6040.tar.gz
STC-modified-e31376cace6a2bae2d13770ad818a38b3d3d6040.zip
Final changes on carrays. Perfect now.
-rw-r--r--docs/carray_api.md4
-rw-r--r--stc/carray.h14
2 files changed, 12 insertions, 6 deletions
diff --git a/docs/carray_api.md b/docs/carray_api.md
index 3f868130..afa9d62f 100644
--- a/docs/carray_api.md
+++ b/docs/carray_api.md
@@ -33,8 +33,8 @@ All carray definitions and prototypes are available by including a single header
carray2X carray2X_init(size_t xdim, size_t ydim, Value val);
carray2X carray2X_from(Value* array, size_t xdim, size_t ydim);
carray2X carray2X_clone(carray2X arr);
+Value* carray2X_release(carray2X* self); // give away data
void carray2X_del(carray2X* self);
-void carray2X_del_internals(carray2X* self); // destroy pointers only
size_t carray2X_size(carray2X arr);
Value* carray2X_data(carray2X* self); // contiguous memory
@@ -47,8 +47,8 @@ void carray2X_next(carray2X_iter_t* it);
carray3X carray3X_init(size_t xdim, size_t ydim, size_t zdim, Value val);
carray3X carray3X_from(Value* array, size_t xdim, size_t ydim, size_t zdim);
carray3X carray3X_clone(carray3X arr);
+Value* carray3X_release(carray3X* self); // give away data
void carray3X_del(carray3X* self);
-void carray3X_del_internals(carray3X* self); // destroy pointers only
size_t carray3X_size(carray3X arr);
Value* carray3X_data(carray3X* self); // contiguous memory
diff --git a/stc/carray.h b/stc/carray.h
index 3fe60bf6..95ca9a63 100644
--- a/stc/carray.h
+++ b/stc/carray.h
@@ -70,8 +70,10 @@ int main() {
STC_API carray2##X carray2##X##_clone(carray2##X src); \
\
STC_INLINE size_t carray2##X##_size(carray2##X arr) { return arr.xdim*arr.ydim; } \
- STC_INLINE carray2##X##_value_t* carray2##X##_data(carray2##X* self) { return self->at[0]; } \
- STC_INLINE void carray2##X##_del_internals(carray2##X* self) { c_free(self->at); } \
+ STC_INLINE carray2##X##_value_t *carray2##X##_data(carray2##X* self) { return self->at[0]; } \
+ STC_INLINE carray2##X##_value_t *carray2##X##_release(carray2##X* self) { \
+ carray2##X##_value_t *t = self->at[0]; c_free(self->at); self->at = NULL; return t; \
+ } \
\
STC_INLINE carray2##X##_iter_t carray2##X##_begin(const carray2##X* self) { \
carray2##X##_iter_t it = {self->at[0]}; return it; \
@@ -102,8 +104,10 @@ int main() {
STC_API carray3##X carray3##X##_clone(carray3##X src); \
\
STC_INLINE size_t carray3##X##_size(carray3##X arr) { return arr.xdim*arr.ydim*arr.zdim; } \
- STC_INLINE carray3##X##_value_t* carray3##X##_data(carray3##X* self) { return self->at[0][0]; } \
- STC_INLINE void carray3##X##_del_internals(carray3##X* self) { c_free(self->at); } \
+ STC_INLINE carray3##X##_value_t *carray3##X##_data(carray3##X* self) { return self->at[0][0]; } \
+ STC_INLINE carray3##X##_value_t *carray3##X##_release(carray3##X* self) { \
+ carray3##X##_value_t *t = **self->at; c_free(self->at); self->at = NULL; return t; \
+ } \
\
STC_INLINE carray3##X##_iter_t carray3##X##_begin(const carray3##X* self) { \
carray3##X##_iter_t it = {self->at[0][0]}; return it; \
@@ -148,6 +152,7 @@ int main() {
} \
\
STC_DEF void carray2##X##_del(carray2##X* self) { \
+ if (!self->at) return; \
for (carray2##X##_value_t* p = self->at[0], *e = p + self->xdim*self->ydim; p != e; ++p) \
valueDel(p); \
c_free(self->at[0]); /* data */ \
@@ -187,6 +192,7 @@ int main() {
} \
\
STC_DEF void carray3##X##_del(carray3##X* self) { \
+ if (!self->at) return; \
for (carray3##X##_value_t* p = **self->at, *e = p + carray3##X##_size(*self); p != e; ++p) \
valueDel(p); \
c_free(self->at[0][0]); /* data */ \