diff options
| author | Tyge Løvset <[email protected]> | 2021-03-24 08:28:53 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2021-03-24 08:47:40 +0100 |
| commit | c96dc0a43037dd14cd0e2539c988a343d99cc728 (patch) | |
| tree | 680c3dbdcda63a323c6a140e4e27703d4bb5a00d | |
| parent | c92f6f604dbb08530a8931bd6ce2db56d177130d (diff) | |
| download | STC-modified-c96dc0a43037dd14cd0e2539c988a343d99cc728.tar.gz STC-modified-c96dc0a43037dd14cd0e2539c988a343d99cc728.zip | |
Added alternative at() methods to carrays.
| -rw-r--r-- | docs/carray_api.md | 4 | ||||
| -rw-r--r-- | stc/carray.h | 20 |
2 files changed, 17 insertions, 7 deletions
diff --git a/docs/carray_api.md b/docs/carray_api.md index afa9d62f..1f42deb6 100644 --- a/docs/carray_api.md +++ b/docs/carray_api.md @@ -38,6 +38,7 @@ void carray2X_del(carray2X* self); size_t carray2X_size(carray2X arr); Value* carray2X_data(carray2X* self); // contiguous memory +Value* carray2X_at(carray2X* self, size_t x, size_t y); carray2X_iter_t carray2X_begin(const carray2X* self); carray2X_iter_t carray2X_end(const carray2X* self); @@ -52,6 +53,7 @@ void carray3X_del(carray3X* self); size_t carray3X_size(carray3X arr); Value* carray3X_data(carray3X* self); // contiguous memory +Value* carray3X_at(carray3X* self, size_t x, size_t y, size_t z); carray3X_iter_t carray3X_begin(const carray3X* self); carray3X_iter_t carray3X_end(const carray3X* self); @@ -68,6 +70,8 @@ void carray3X_next(carray3X_iter_t* it); | `carray3X_value_t` | `Value` | The value type | | `carray3X_iter_t` | `struct { Value *ref; }` | Iterator type | +The **carray** elements can be accessed like `carray3i arr = ...; int val = arr.at[x][y][z];`, or with `carray3i_at(&arr, x, y, z)`. + ## Example ```c #include "stc/carray.h" diff --git a/stc/carray.h b/stc/carray.h index 54c0c71c..aca632d6 100644 --- a/stc/carray.h +++ b/stc/carray.h @@ -70,16 +70,19 @@ 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 carray2##X##_value_t *carray2##X##_data(carray2##X* self) { return *self->at; } \
+ STC_INLINE carray2##X##_value_t *carray2##X##_at(carray2##X* self, size_t x, size_t y) { \
+ return *self->at + self->ydim*x + y; \
+ } \
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; \
+ carray2##X##_value_t *t = *self->at; 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; \
+ carray2##X##_iter_t it = {*self->at}; return it; \
} \
STC_INLINE carray2##X##_iter_t carray2##X##_end(const carray2##X* self) { \
- carray2##X##_iter_t it = {self->at[0] + carray2##X##_size(*self)}; return it; \
+ carray2##X##_iter_t it = {*self->at + carray2##X##_size(*self)}; return it; \
} \
STC_INLINE void carray2##X##_next(carray2##X##_iter_t* it) { ++it->ref; } \
\
@@ -104,16 +107,19 @@ 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 carray3##X##_value_t *carray3##X##_data(carray3##X* self) { return **self->at; } \
+ STC_INLINE carray3##X##_value_t *carray3##X##_at(carray3##X* self, size_t x, size_t y, size_t z) { \
+ return **self->at + self->zdim*(self->ydim*x + y) + z; \
+ } \
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; \
+ carray3##X##_iter_t it = {**self->at}; return it; \
} \
STC_INLINE carray3##X##_iter_t carray3##X##_end(const carray3##X* self) { \
- carray3##X##_iter_t it = {self->at[0][0] + carray3##X##_size(*self)}; return it; \
+ carray3##X##_iter_t it = {**self->at + carray3##X##_size(*self)}; return it; \
} \
STC_INLINE void carray3##X##_next(carray3##X##_iter_t* it) { ++it->ref; } \
\
|
