summaryrefslogtreecommitdiff
path: root/engine/src/util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/util.rs')
-rw-r--r--engine/src/util.rs145
1 files changed, 98 insertions, 47 deletions
diff --git a/engine/src/util.rs b/engine/src/util.rs
index a505a38..9174734 100644
--- a/engine/src/util.rs
+++ b/engine/src/util.rs
@@ -1,3 +1,73 @@
+use ecs::util::VecExt;
+
+#[derive(Debug)]
+pub struct MapVec<Key: Ord, Value>
+{
+ inner: Vec<(Key, Value)>,
+}
+
+impl<Key: Ord, Value> MapVec<Key, Value>
+{
+ pub fn insert(&mut self, key: Key, value: Value)
+ {
+ self.inner
+ .insert_at_part_pt_by_key((key, value), |(a_key, _)| a_key);
+ }
+
+ pub fn remove(&mut self, key: Key) -> Option<Value>
+ {
+ let index = self
+ .inner
+ .binary_search_by_key(&&key, |(a_key, _)| a_key)
+ .ok()?;
+
+ let (_, value) = self.inner.remove(index);
+
+ Some(value)
+ }
+
+ pub fn get(&self, key: &Key) -> Option<&Value>
+ {
+ let index = self
+ .inner
+ .binary_search_by_key(&key, |(a_key, _)| a_key)
+ .ok()?;
+
+ let Some((_, value)) = self.inner.get(index) else {
+ unreachable!(); // Reason: Index from binary search cannot be OOB
+ };
+
+ Some(value)
+ }
+
+ pub fn get_mut(&mut self, key: &Key) -> Option<&mut Value>
+ {
+ let index = self
+ .inner
+ .binary_search_by_key(&key, |(a_key, _)| a_key)
+ .ok()?;
+
+ let Some((_, value)) = self.inner.get_mut(index) else {
+ unreachable!(); // Reason: Index from binary search cannot be OOB
+ };
+
+ Some(value)
+ }
+
+ pub fn values(&self) -> impl Iterator<Item = &Value>
+ {
+ self.inner.iter().map(|(_, value)| value)
+ }
+}
+
+impl<Key: Ord, Value> Default for MapVec<Key, Value>
+{
+ fn default() -> Self
+ {
+ Self { inner: Vec::new() }
+ }
+}
+
macro_rules! try_option {
($expr: expr) => {
match $expr {
@@ -9,9 +79,6 @@ macro_rules! try_option {
};
}
-use std::mem::ManuallyDrop;
-use std::ops::{Deref, DerefMut};
-
pub(crate) use try_option;
macro_rules! or {
@@ -26,6 +93,18 @@ macro_rules! or {
pub(crate) use or;
+#[macro_export]
+macro_rules! expand_map_opt {
+ ($in: tt, no_occurance=($($no_occurance: tt)*), occurance=($($occurance: tt)*)) => {
+ $($occurance)*
+ };
+
+ (, no_occurance=($($no_occurance: tt)*), occurance=($($occurance: tt)*)) => {
+ $($no_occurance)*
+ };
+}
+
+#[macro_export]
macro_rules! builder {
(
$(#[doc = $doc: literal])*
@@ -37,7 +116,8 @@ macro_rules! builder {
$visibility: vis struct $name: ident
{
$(
- $(#[$field_attr: meta])*
+ $(#[doc = $field_doc: literal])*
+ $(#[builder(skip_generate_fn$($field_skip_generate_fn: tt)?)])?
$field_visibility: vis $field: ident: $field_type: ty,
)*
}
@@ -47,7 +127,7 @@ macro_rules! builder {
$visibility struct $name
{
$(
- $(#[$field_attr])*
+ $(#[doc = $field_doc])*
$field_visibility $field: $field_type,
)*
}
@@ -63,12 +143,18 @@ macro_rules! builder {
impl $builder_name
{
$(
- #[must_use]
- $visibility fn $field(mut self, $field: $field_type) -> Self
- {
- self.$field = $field;
- self
- }
+ $crate::expand_map_opt!(
+ $(true $($field_skip_generate_fn)?)?,
+ no_occurance=(
+ #[must_use]
+ $visibility fn $field(mut self, $field: $field_type) -> Self
+ {
+ self.$field = $field;
+ self
+ }
+ ),
+ occurance=()
+ );
)*
#[must_use]
@@ -83,6 +169,7 @@ macro_rules! builder {
impl From<$name> for $builder_name
{
+ #[allow(unused_variables)]
fn from(built: $name) -> Self
{
Self {
@@ -94,39 +181,3 @@ macro_rules! builder {
}
};
}
-
-pub(crate) use builder;
-
-/// Wrapper that ensures the contained value will never be dropped.
-#[derive(Debug)]
-pub struct NeverDrop<Value>
-{
- value: ManuallyDrop<Value>,
-}
-
-impl<Value> NeverDrop<Value>
-{
- #[must_use]
- pub fn new(value: Value) -> Self
- {
- Self { value: ManuallyDrop::new(value) }
- }
-}
-
-impl<Value> Deref for NeverDrop<Value>
-{
- type Target = Value;
-
- fn deref(&self) -> &Self::Target
- {
- &self.value
- }
-}
-
-impl<Value> DerefMut for NeverDrop<Value>
-{
- fn deref_mut(&mut self) -> &mut Self::Target
- {
- &mut self.value
- }
-}