diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-20 17:55:27 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-20 17:55:27 +0000 |
commit | 960ac4694db2060429ec54c9ff2878cad34d8661 (patch) | |
tree | a25dbdd3a20255f0209719ce775ac135d94d098d /array.c | |
parent | fbcb1cad3eca5ca670f623bdb25a78b8fe54af1b (diff) |
Implement dyadic ⌷, monadic ⍋ and monadic ⍒
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 71 |
1 files changed, 44 insertions, 27 deletions
@@ -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 |