mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-03 05:08:14 +00:00
Add rand.choice_enum
This commit is contained in:
@@ -834,3 +834,23 @@ choice :: proc(array: $T/[]$E, r: ^Rand = nil) -> (res: E) {
|
|||||||
}
|
}
|
||||||
return array[int63_max(n, r)]
|
return array[int63_max(n, r)]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
choice_enum :: proc($T: typeid, r: ^Rand = nil) -> T
|
||||||
|
where
|
||||||
|
intrinsics.type_is_enum(T),
|
||||||
|
size_of(T) <= 8,
|
||||||
|
len(T) == cap(T) /* Only allow contiguous enum types */
|
||||||
|
{
|
||||||
|
when intrinsics.type_is_unsigned(intrinsics.type_core_type(T)) &&
|
||||||
|
u64(max(T)) > u64(max(i64)) {
|
||||||
|
i := uint64(r) % u64(len(T))
|
||||||
|
i += u64(min(T))
|
||||||
|
return T(i)
|
||||||
|
} else {
|
||||||
|
i := int63_max(i64(len(T)), r)
|
||||||
|
i += i64(min(T))
|
||||||
|
return T(i)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user