Skip to content

Commit

Permalink
FEAT: Add functionality to find maximum and minimum values in a vecto…
Browse files Browse the repository at this point in the history
…r using `query`
  • Loading branch information
Oldes committed Dec 11, 2024
1 parent 2199450 commit 9457bdd
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 16 deletions.
24 changes: 8 additions & 16 deletions src/core/t-vector.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,15 +169,13 @@ void Set_Vector_Row(REBSER *ser, REBVAL *blk)
}

void Find_Minimum_Of_Vector(REBSER *vect, REBVAL *ret) {
REBLEN len, n;
REBLEN len;
REBYTE *data;

len = SERIES_TAIL(vect);

if (len == 0) {
SET_NONE(ret);
return;
}
SET_NONE(ret);
if (len == 0) return;

#define FIND_MIN_INT(type) { \
type *typed_data = (type *)data; \
Expand Down Expand Up @@ -214,25 +212,20 @@ void Find_Minimum_Of_Vector(REBSER *vect, REBVAL *ret) {
case VTUI64: FIND_MIN_INT(u64); break;
case VTSF32: FIND_MIN_DEC(float); break;
case VTSF64: FIND_MIN_DEC(double); break;
default:
SET_NONE(ret); // Handle unknown types
return;
}

#undef FIND_MIN_INT
#undef FIND_MIN_DEC
}

void Find_Maximum_Of_Vector(REBSER *vect, REBVAL *ret) {
REBLEN len, n;
REBLEN len;
REBYTE *data;

len = SERIES_TAIL(vect);

if (len == 0) {
SET_NONE(ret);
return;
}
SET_NONE(ret);
if (len == 0) return;

#define FIND_MAX_INT(type) { \
type *typed_data = (type *)data; \
Expand Down Expand Up @@ -269,9 +262,6 @@ void Find_Maximum_Of_Vector(REBSER *vect, REBVAL *ret) {
case VTUI64: FIND_MAX_INT(u64); break;
case VTSF32: FIND_MAX_DEC(float); break;
case VTSF64: FIND_MAX_DEC(double); break;
default:
SET_NONE(ret); // Handle unknown types
return;
}

#undef FIND_MAX_INT
Expand Down Expand Up @@ -939,6 +929,8 @@ static void reverse_vector(REBVAL *value, REBCNT len)
Query_Vector_Field(vect, SYM_TYPE, Append_Value(blk));
Query_Vector_Field(vect, SYM_SIZE, Append_Value(blk));
Query_Vector_Field(vect, SYM_LENGTH, Append_Value(blk));
Query_Vector_Field(vect, SYM_MINIMUM, Append_Value(blk));
Query_Vector_Field(vect, SYM_MAXIMUM, Append_Value(blk));
Set_Series(REB_BLOCK, value, blk);
} else {
if(!Query_Vector_Field(vect, VAL_WORD_SYM(D_ARG(2)), value))
Expand Down
24 changes: 24 additions & 0 deletions src/tests/units/vector-test.r3
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,30 @@ Rebol [
--assert vf32/max == 1.0
--assert vf64/max == 1.0
--assert vi08/maximum == 1

--test-- "Find min/max using query v1"
--assert [minimum: -2 maximum: 1] == query vi08 [minimum maximum]
--assert [minimum: -2 maximum: 1] == query vi16 [minimum maximum]
--assert [minimum: -2 maximum: 1] == query vi32 [minimum maximum]
--assert [minimum: -2 maximum: 1] == query vi64 [minimum maximum]
--assert [minimum: 0 maximum: 2] == query vu08 [minimum maximum]
--assert [minimum: 0 maximum: 2] == query vu16 [minimum maximum]
--assert [minimum: 0 maximum: 2] == query vu32 [minimum maximum]
--assert [minimum: 0 maximum: 2] == query vu64 [minimum maximum]
--assert [minimum: -2.0 maximum: 1.0] == query vf32 [minimum maximum]
--assert [minimum: -2.0 maximum: 1.0] == query vf64 [minimum maximum]
--test-- "Find min/max using query v2"
--assert [-2 1] == query vi08 [:minimum :maximum]
--assert [-2 1] == query vi16 [:minimum :maximum]
--assert [-2 1] == query vi32 [:minimum :maximum]
--assert [-2 1] == query vi64 [:minimum :maximum]
--assert [ 0 2] == query vu08 [:minimum :maximum]
--assert [ 0 2] == query vu16 [:minimum :maximum]
--assert [ 0 2] == query vu32 [:minimum :maximum]
--assert [ 0 2] == query vu64 [:minimum :maximum]
--assert [-2.0 1.0] == query vf32 [:minimum :maximum]
--assert [-2.0 1.0] == query vf64 [:minimum :maximum]

vi08: #(i8! [])
vi16: #(i16! [])
vi32: #(i32! [])
Expand Down

0 comments on commit 9457bdd

Please sign in to comment.