nstd_sys/core/
optional.rs1use crate::{
3 NSTDAny, NSTDAnyMut, NSTDAnyRef, NSTDAnyRefMut, NSTDBool, NSTDChar, NSTDChar16, NSTDChar32,
4 NSTDChar8, NSTDFloat32, NSTDFloat64, NSTDInt, NSTDInt16, NSTDInt32, NSTDInt64, NSTDInt8,
5 NSTDRef, NSTDRefMut, NSTDUInt, NSTDUInt16, NSTDUInt32, NSTDUInt64, NSTDUInt8,
6};
7use nstdapi::nstdapi;
8
9pub const NSTD_OPTIONAL_NONE: NSTDUInt8 = 0;
11pub const NSTD_OPTIONAL_SOME: NSTDUInt8 = 1;
13
14#[nstdapi]
16#[repr(u8)]
17#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
18pub enum NSTDOptional<T> {
19 #[default]
21 None,
22 Some(T),
24}
25impl<T> NSTDOptional<T> {
26 #[inline]
35 pub fn unwrap(self) -> T {
36 match self {
37 Self::Some(value) => value,
38 Self::None => panic!("called `NSTDOptional::unwrap()` on a `None` value"),
39 }
40 }
41
42 #[inline]
48 pub fn expect(self, msg: &str) -> T {
49 match self {
50 Self::Some(value) => value,
51 Self::None => panic!("{msg}"),
52 }
53 }
54}
55
56macro_rules! gen_optional {
71 ($name: ident, $T: ty) => {
72 #[doc = concat!("Represents an optional value of type `", stringify!($T), "`.")]
73 pub type $name = NSTDOptional<$T>;
74 };
75}
76pub(crate) use gen_optional;
77gen_optional!(NSTDOptionalAny, NSTDAny);
78gen_optional!(NSTDOptionalAnyMut, NSTDAnyMut);
79gen_optional!(NSTDOptionalBool, NSTDBool);
80gen_optional!(NSTDOptionalChar, NSTDChar);
81gen_optional!(NSTDOptionalChar8, NSTDChar8);
82gen_optional!(NSTDOptionalChar16, NSTDChar16);
83gen_optional!(NSTDOptionalChar32, NSTDChar32);
84gen_optional!(NSTDOptionalFloat32, NSTDFloat32);
85gen_optional!(NSTDOptionalFloat64, NSTDFloat64);
86gen_optional!(NSTDOptionalInt, NSTDInt);
87gen_optional!(NSTDOptionalUInt, NSTDUInt);
88gen_optional!(NSTDOptionalInt8, NSTDInt8);
89gen_optional!(NSTDOptionalUInt8, NSTDUInt8);
90gen_optional!(NSTDOptionalInt16, NSTDInt16);
91gen_optional!(NSTDOptionalUInt16, NSTDUInt16);
92gen_optional!(NSTDOptionalInt32, NSTDInt32);
93gen_optional!(NSTDOptionalUInt32, NSTDUInt32);
94gen_optional!(NSTDOptionalInt64, NSTDInt64);
95gen_optional!(NSTDOptionalUInt64, NSTDUInt64);
96
97pub type NSTDOptionalRef<'a, T> = NSTDOptional<NSTDRef<'a, T>>;
99pub type NSTDOptionalRefMut<'a, T> = NSTDOptional<NSTDRefMut<'a, T>>;
101
102pub type NSTDOptionalAnyRef<'a> = NSTDOptional<NSTDAnyRef<'a>>;
104pub type NSTDOptionalAnyRefMut<'a> = NSTDOptional<NSTDAnyRefMut<'a>>;