summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-20 17:55:27 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-20 17:55:27 +0000
commit960ac4694db2060429ec54c9ff2878cad34d8661 (patch)
treea25dbdd3a20255f0209719ce775ac135d94d098d /array.c
parentfbcb1cad3eca5ca670f623bdb25a78b8fe54af1b (diff)
Implement dyadic ⌷, monadic ⍋ and monadic ⍒
Diffstat (limited to 'array.c')
-rw-r--r--array.c71
1 files changed, 44 insertions, 27 deletions
diff --git a/array.c b/array.c
index cf5a7f3..1167cea 100644
--- a/array.c
+++ b/array.c
@@ -212,39 +212,56 @@ simplifyarray(Array *a)
}
int
-comparearray(Array *a, Array *b)
+comparearray(Array *a, Array *b, int checkshapes)
{
- /* returns -1 if a < b, 0 if a == b and 1 if a > b.
- Only correctly handles test for equality right now,
- and returns 1 for unequal data. */
+ /* returns -1 if a < b, 0 if a == b and 1 if a > b. */
+ int i;
- if(a->type != b->type)
- return 1;
- if(a->rank != b->rank)
- return 1;
- if(a->size != b->size)
+ if(a->type < b->type)
+ return -1;
+ else if(a->type > b->type)
return 1;
- for(int i = 0; i < a->rank; i++)
- if(a->shape[i] != b->shape[i])
+
+ if(checkshapes){
+ if(a->rank < b->rank)
+ return -1;
+ else if(a->rank > b->rank)
return 1;
- for(int i = 0; i < a->size; i++){
- if(a->type == AtypeArray){
- /* do something recursive here */
- int sub = comparearray(a->arraydata[i], b->arraydata[i]);
- if(sub != 0)
- return sub;
- }else{
- int sub = memcmp(
- a->rawdata + i * datasizes[a->type],
- b->rawdata + i * datasizes[a->type],
- datasizes[a->type]);
- if(sub < 0)
+ for(i = 0; i < a->rank; i++){
+ if(a->shape[i] < b->shape[i])
return -1;
- else if(sub > 0)
- return 1;
+ else if(a->shape[i] > b->shape[i])
+ return 1;
}
}
- /* if we get here, the arrays are equal */
- return 0;
+ for(i = 0; i < a->size && i < b->size; i++){
+ int sub = 0;
+ switch(a->type){
+ case AtypeInt:
+ sub = a->intdata[i] > b->intdata[i] ? 1 : a->intdata[i] == b->intdata[i] ? 0 : -1;
+ break;
+ case AtypeFloat:
+ sub = a->floatdata[i] > b->floatdata[i] ? 1 : a->floatdata[i] == b->floatdata[i] ? 0 : -1;
+ break;
+ case AtypeRune:
+ sub = a->runedata[i] > b->runedata[i] ? 1 : a->runedata[i] == b->runedata[i] ? 0 : -1;
+ break;
+ case AtypeArray:
+ sub = comparearray(a->arraydata[i], b->arraydata[i], checkshapes);
+ break;
+ default:
+ print("Missing comparison code for type %d\n", a->type);
+ exits(nil);
+ }
+ if(sub != 0)
+ return sub;
+ }
+
+ if(i < a->size)
+ return 1;
+ else if(i < b->size)
+ return -1;
+ else
+ return 0;
} \ No newline at end of file