diff --git a/vlib/math/limit.v b/vlib/math/limit.v new file mode 100644 index 0000000000..c752e40737 --- /dev/null +++ b/vlib/math/limit.v @@ -0,0 +1,68 @@ +// Copyright (c) 2019-2023 Alexander Medvednikov. All rights reserved. +// Use of this source code is governed by an MIT license +// that can be found in the LICENSE file. +module math + +// maxof returns the maximum value of the type `T` +[inline] +pub fn maxof[T]() T { + $if T is i8 { + return max_i8 + } $else $if T is i16 { + return max_i16 + } $else $if T is int { + return max_i32 + } $else $if T is i32 { + return max_i32 + } $else $if T is i64 { + return max_i64 + } $else $if T is u8 { + return max_u8 + } $else $if T is byte { + return max_u8 + } $else $if T is u16 { + return max_u16 + } $else $if T is u32 { + return max_u32 + } $else $if T is u64 { + return max_u64 + } $else $if T is f32 { + return max_f32 + } $else $if T is f64 { + return max_f64 + } $else { + panic('A maximum value of the type `${typeof[T]().name}` is not defined.') + } +} + +// minof returns the minimum value of the type `T` +[inline] +pub fn minof[T]() T { + $if T is i8 { + return min_i8 + } $else $if T is i16 { + return min_i16 + } $else $if T is int { + return min_i32 + } $else $if T is i32 { + return min_i32 + } $else $if T is i64 { + return min_i64 + } $else $if T is u8 { + return min_u8 + } $else $if T is byte { + return min_u8 + } $else $if T is u16 { + return min_u16 + } $else $if T is u32 { + return min_u32 + } $else $if T is u64 { + return min_u64 + } $else $if T is f32 { + return -max_f32 + } $else $if T is f64 { + return -max_f64 + } $else { + panic('A minimum value of the type `${typeof[T]().name}` is not defined.') + } +} diff --git a/vlib/math/math_test.v b/vlib/math/math_test.v index 5636173c9f..ed841e314b 100644 --- a/vlib/math/math_test.v +++ b/vlib/math/math_test.v @@ -1059,3 +1059,31 @@ fn test_min_max_int_str() { assert min_i8.str() == '-128' assert max_i8.str() == '127' } + +fn test_maxof_minof() { + assert maxof[i8]() == 127 + assert maxof[i16]() == 32767 + assert maxof[int]() == 2147483647 + assert maxof[i32]() == 2147483647 + assert maxof[i64]() == 9223372036854775807 + assert maxof[u8]() == 255 + assert maxof[byte]() == 255 + assert maxof[u16]() == 65535 + assert maxof[u32]() == 4294967295 + assert maxof[u64]() == 18446744073709551615 + assert maxof[f32]() == 3.40282346638528859811704183484516925440e+38 + assert maxof[f64]() == 1.797693134862315708145274237317043567981e+308 + + assert minof[i8]() == -128 + assert minof[i16]() == -32768 + assert minof[int]() == -2147483648 + assert minof[i32]() == -2147483648 + assert minof[i64]() == -9223372036854775807 - 1 + assert minof[u8]() == 0 + assert minof[byte]() == 0 + assert minof[u16]() == 0 + assert minof[u32]() == 0 + assert minof[u64]() == 0 + assert minof[f32]() == -3.40282346638528859811704183484516925440e+38 + assert minof[f64]() == -1.797693134862315708145274237317043567981e+308 +}