diff options
Diffstat (limited to 'functions.c')
-rw-r--r-- | functions.c | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/functions.c b/functions.c index 411f90b..ef9aa97 100644 --- a/functions.c +++ b/functions.c @@ -54,8 +54,8 @@ fnmonad monadfunctiondefs[] = { fnRavel, /* , */ 0, /* ⍪ */ fnShape, /* ⍴ */ - 0, /* ⌽ */ - 0, /* ⊖ */ + fnReverseLast, /* ⌽ */ + fnReverseFirst, /* ⊖ */ 0, /* ⍉ */ 0, /* ⍎ */ 0, /* ⍕ */ @@ -226,6 +226,46 @@ fnShape(Array *right) return res; } +Array * +fnReverseLast(Array *right) +{ + if(right->rank < 1) + return fnSame(right); + + Array *res = duparray(right); + + int nrows = 1; + int rowsize = res->shape[res->rank-1]; + for(int i = 0; i < res->rank - 1; i++) + nrows *= res->shape[i]; + + for(int row = 0; row < nrows; row++){ + for(int i = 0; i < rowsize; i++) + memcpy( + res->rawdata + (row * rowsize + i) * datasizes[res->type], + right->rawdata + ((1+row) * rowsize - 1 - i) * datasizes[res->type], + datasizes[res->type]); + } + return res; +} + +Array * +fnReverseFirst(Array *right) +{ + if(right->rank < 1 || right->shape[0] == 0) + return fnSame(right); + + Array *res = duparray(right); + int cells = res->shape[0]; + int elems = res->size / cells; + for(int i = 0; i < cells; i++) + memcpy( + res->rawdata + i * elems * datasizes[res->type], + right->rawdata + (cells - 1 - i) * elems * datasizes[res->type], + datasizes[res->type] * elems); + return res; +} + /* Dyadic functions */ Array * |