From 68fd366ceaa919293d348ce15c2596d485160cec Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Wed, 25 Jan 2023 20:18:02 +0100 Subject: Updates on cspan ++. --- docs/cspan_api.md | 21 ++-- include/stc/cspan.h | 8 +- misc/examples/forfilter.c | 8 +- misc/examples/gauss1.c | 2 +- misc/examples/multidim.c | 4 +- misc/examples/prime.c | 3 +- misc/examples/printspan.c | 2 +- misc/examples/shape.c | 12 +-- src/utf8code.c | 243 ++++++++++++++++++++++++---------------------- 9 files changed, 156 insertions(+), 147 deletions(-) diff --git a/docs/cspan_api.md b/docs/cspan_api.md index ce9236c3..6da2acca 100644 --- a/docs/cspan_api.md +++ b/docs/cspan_api.md @@ -18,27 +18,28 @@ using_cspan3(S, ValueType); // define span types S, S2, S3 with rank using_cspan4(S, ValueType); // define span types S, S2, S3, S4 with ranks 1, 2, 3, 4. ``` ## Methods -Note that `cspan_make()`, `cmake_from*()`, `cspan_atN()`, `and cspan_subspanN()` require a (safe) cast to its span-type +Note that `cspan_multidim()`, `cmake_from*()`, `cspan_atN()`, `and cspan_subspanN()` require a (safe) cast to its span-type on assignment, but not on initialization of a span variable. All functions are type-safe, and arguments are side-effect safe, except for SpanType arg. which must not have side-effects. ```c -SpanTypeN cspan_make(ValueType* data, size_t xdim, ...); // make N-dimensional cspan -SpanType cspan_from(STCContainer* cnt); // create a 1D cspan from a compatible STC container -SpanType cspan_from_array(ValueType array[]); // create a 1D cspan from a C array +SpanType cspan_make(T SpanType, {v1, v2, ...}); // make a 1d-dimensional cspan from values +SpanTypeN cspan_multidim(ValueType* data, size_t xdim, ...); // create a multi-dimensional cspan +SpanType cspan_from(STCContainer* cnt); // create a 1d cspan from a compatible STC container +SpanType cspan_from_array(ValueType array[]); // create a 1d cspan from a C array -SpanType cspan_flatten(SpanTypeN* span); // create a 1D cspan from a multidim span +SpanType cspan_flatten(SpanTypeN* span); // create a 1d cspan from a multidim span void cspan_resize(SpanTypeN* self, size_t xdim, ...); // change the extent of each dimension size_t cspan_size(const SpanTypeN* self); // return number of elements unsigned cspan_rank(const SpanTypeN* self); // return number of dimensions size_t cspan_index(const SpanTypeN* self, size_t x, ...); // index of element -ValueType* cspan_at(SpanTypeN* self, size_t x, ...); // at(): num of args decides input SpanTypeN. +ValueType* cspan_at(SpanTypeN* self, size_t x, ...); // at(): num of args specifies rank of input span. ValueType* cspan_front(SpanTypeN* self); ValueType* cspan_back(SpanTypeN* self); -SpanType cspan_at2(SpanType2* self, size_t x); // return a cspan from a 2D SpanType. -SpanTypeN cspan_at3(SpanType3* self, size_t x, ...); // atN(): N decides input SpanType, -SpanTypeN cspan_at4(SpanType4* self, size_t x, ...); // and num of args decides returned SpanTypeN. +SpanType cspan_at2(SpanType2* self, size_t x); // return a 1d subspan from a 2d span. +SpanTypeN cspan_at3(SpanType3* self, size_t x, ...); // return a 1 or 2d subspan from a 3d span. +SpanTypeN cspan_at4(SpanType4* self, size_t x, ...); // number of args determines rank of output span. // return a subspan of same rank: SpanType cspan_subspan(const SpanType* self, size_t offset, size_t count); @@ -76,7 +77,7 @@ int main() cstack_float_push(&vec, i); // define "span3[xd][yd][zd]" - Span3 span3 = cspan_make(vec.data, xd, yd, zd); + Span3 span3 = cspan_multidim(vec.data, xd, yd, zd); *cspan_at(&span3, 4, 3, 2) = 3.14159f; printf("index: %d", (int)cspan_index(&span3, 4, 3, 2)); diff --git a/include/stc/cspan.h b/include/stc/cspan.h index 2b600a2a..5b0358e2 100644 --- a/include/stc/cspan.h +++ b/include/stc/cspan.h @@ -30,7 +30,7 @@ using_cspan(Intspan, int, 1); int demo1() { float raw[4*5]; - Span2f ms = cspan_make(raw, 4, 5); + Span2f ms = cspan_multidim(raw, 4, 5); for (size_t i=0; isecond * StdDev * Scale * 2.5 / N); + int n = (int)(i.ref->second * StdDev * Scale * 2.5 / (double)N); if (n > 0) { printf("%4d ", i.ref->first); c_FORRANGE (n) printf("*"); diff --git a/misc/examples/multidim.c b/misc/examples/multidim.c index 3eef1497..8a5492dc 100644 --- a/misc/examples/multidim.c +++ b/misc/examples/multidim.c @@ -15,9 +15,9 @@ int main() // View data as contiguous memory representing 12 ints ispan ms1 = cspan_from(&v); // View data as contiguous memory representing 2 rows of 6 ints each - ispan2 ms2 = cspan_make(v.data, 2, 6); + ispan2 ms2 = cspan_multidim(v.data, 2, 6); // View the same data as a 3D array 2 x 3 x 2 - ispan3 ms3 = cspan_make(v.data, 2, 3, 2); + ispan3 ms3 = cspan_multidim(v.data, 2, 3, 2); // write data using 2D view for (unsigned i=0; i != ms2.dim[0]; i++) diff --git a/misc/examples/prime.c b/misc/examples/prime.c index 4a6b0f68..5c8d65d3 100644 --- a/misc/examples/prime.c +++ b/misc/examples/prime.c @@ -43,7 +43,8 @@ int main(void) puts(""); puts("Show the last 50 primes using a temporary crange generator:"); - c_FORFILTER (i, crange, crange_literal(n - 1, 0, -2) + crange R = crange_make(n - 1, 0, -2); + c_FORFILTER (i, crange, R , cbits_test(&primes, *i.ref>>1) , c_flt_take(i, 50)) { printf("%lld ", *i.ref); diff --git a/misc/examples/printspan.c b/misc/examples/printspan.c index 227fd2ed..82b54367 100644 --- a/misc/examples/printspan.c +++ b/misc/examples/printspan.c @@ -27,7 +27,7 @@ int main() c_AUTO (cdeq_int, deq) c_AUTO (cset_str, set) { - intspan sp1 = cspan_init(intspan, {1, 2}); + intspan sp1 = cspan_make(intspan, {1, 2}); printMe( sp1 ); printMe( c_make(intspan, {1, 2, 3}) ); diff --git a/misc/examples/shape.c b/misc/examples/shape.c index ed0c3fe1..75a5e174 100644 --- a/misc/examples/shape.c +++ b/misc/examples/shape.c @@ -50,12 +50,12 @@ typedef struct { Point p[3]; } Triangle; -static struct ShapeAPI Triangle_api; +extern struct ShapeAPI Triangle_api; Triangle Triangle_from(Point a, Point b, Point c) { - Triangle t = {{.api=&Triangle_api}, .p={a, b, c}}; + Triangle t = {.shape={.api=&Triangle_api}, .p={a, b, c}}; return t; } @@ -68,7 +68,7 @@ static void Triangle_draw(const Shape* shape) self->p[2].x, self->p[2].y); } -static struct ShapeAPI Triangle_api = { +struct ShapeAPI Triangle_api = { .drop = Shape_drop, .draw = Triangle_draw, }; @@ -85,12 +85,12 @@ typedef struct { PointVec points; } Polygon; -static struct ShapeAPI Polygon_api; +extern struct ShapeAPI Polygon_api; Polygon Polygon_init(void) { - Polygon p = {{.api=&Polygon_api}, .points=PointVec_init()}; + Polygon p = {.shape={.api=&Polygon_api}, .points=PointVec_init()}; return p; } @@ -116,7 +116,7 @@ static void Polygon_draw(const Shape* shape) puts(""); } -static struct ShapeAPI Polygon_api = { +struct ShapeAPI Polygon_api = { .drop = Polygon_drop, .draw = Polygon_draw, }; diff --git a/src/utf8code.c b/src/utf8code.c index ecf79880..3ad47941 100644 --- a/src/utf8code.c +++ b/src/utf8code.c @@ -122,13 +122,18 @@ typedef struct { int nr16; } UGroup; -static const UGroup unicode_groups[U8G_SIZE]; +#ifndef __cplusplus +static +#else +extern +#endif +const UGroup _utf8_unicode_groups[U8G_SIZE]; bool utf8_isgroup(int group, uint32_t c) { - for (int j=0; j