mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-11-01 02:57:02 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			243 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use std::{fmt, iter, marker::PhantomData, ops, slice, vec};
 | |
| 
 | |
| pub trait EntityId {
 | |
|     fn get_id(&self) -> usize;
 | |
|     fn with_id(id: usize) -> Self;
 | |
| }
 | |
| 
 | |
| macro_rules! impl_entity {
 | |
|     ($name:ident) => {
 | |
|         impl $crate::dense_map::EntityId for $name {
 | |
|             #[inline]
 | |
|             fn get_id(&self) -> usize {
 | |
|                 self.0
 | |
|             }
 | |
| 
 | |
|             #[inline]
 | |
|             fn with_id(id: usize) -> Self {
 | |
|                 Self(id)
 | |
|             }
 | |
|         }
 | |
|     };
 | |
| }
 | |
| 
 | |
| pub(crate) use impl_entity;
 | |
| 
 | |
| pub struct DenseMap<K, V> {
 | |
|     data: Vec<V>,
 | |
|     _marker: PhantomData<K>,
 | |
| }
 | |
| 
 | |
| impl<K, V> DenseMap<K, V> {
 | |
|     pub fn new() -> Self {
 | |
|         Self {
 | |
|             data: Vec::new(),
 | |
|             _marker: PhantomData,
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<K, V> Default for DenseMap<K, V> {
 | |
|     fn default() -> Self {
 | |
|         Self::new()
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<K, V> DenseMap<K, V>
 | |
| where
 | |
|     K: EntityId,
 | |
| {
 | |
|     pub fn push(&mut self, elem: V) -> K {
 | |
|         let curr_len = self.data.len();
 | |
|         self.data.push(elem);
 | |
|         K::with_id(curr_len)
 | |
|     }
 | |
| 
 | |
|     #[inline]
 | |
|     pub fn get(&self, idx: K) -> Option<&V> {
 | |
|         self.data.get(idx.get_id())
 | |
|     }
 | |
| 
 | |
|     #[inline]
 | |
|     pub fn get_mut(&mut self, idx: K) -> Option<&mut V> {
 | |
|         self.data.get_mut(idx.get_id())
 | |
|     }
 | |
| 
 | |
|     #[inline]
 | |
|     pub fn contains_key(&self, key: K) -> bool {
 | |
|         key.get_id() < self.data.len()
 | |
|     }
 | |
| 
 | |
|     #[inline]
 | |
|     pub fn keys(&self) -> Keys<K> {
 | |
|         Keys::new(0..self.data.len())
 | |
|     }
 | |
| 
 | |
|     #[inline]
 | |
|     pub fn into_keys(self) -> Keys<K> {
 | |
|         Keys::new(0..self.data.len())
 | |
|     }
 | |
| 
 | |
|     #[inline]
 | |
|     pub fn values(&self) -> slice::Iter<'_, V> {
 | |
|         self.data.iter()
 | |
|     }
 | |
| 
 | |
|     #[inline]
 | |
|     pub fn values_mut(&mut self) -> slice::IterMut<'_, V> {
 | |
|         self.data.iter_mut()
 | |
|     }
 | |
| 
 | |
|     #[inline]
 | |
|     pub fn into_values(self) -> vec::IntoIter<V> {
 | |
|         self.data.into_iter()
 | |
|     }
 | |
| 
 | |
|     #[inline]
 | |
|     pub fn iter(&self) -> Iter<'_, K, V> {
 | |
|         Iter::new(self.data.iter())
 | |
|     }
 | |
| 
 | |
|     #[inline]
 | |
|     pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
 | |
|         IterMut::new(self.data.iter_mut())
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<K, V> fmt::Debug for DenseMap<K, V>
 | |
| where
 | |
|     K: EntityId + fmt::Debug,
 | |
|     V: fmt::Debug,
 | |
| {
 | |
|     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 | |
|         f.debug_map().entries(self.iter()).finish()
 | |
|     }
 | |
| }
 | |
| 
 | |
| pub struct Keys<K> {
 | |
|     inner: ops::Range<usize>,
 | |
|     _marker: PhantomData<K>,
 | |
| }
 | |
| 
 | |
| impl<K> Keys<K> {
 | |
|     fn new(range: ops::Range<usize>) -> Self {
 | |
|         Self {
 | |
|             inner: range,
 | |
|             _marker: PhantomData,
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<K> Iterator for Keys<K>
 | |
| where
 | |
|     K: EntityId,
 | |
| {
 | |
|     type Item = K;
 | |
| 
 | |
|     fn next(&mut self) -> Option<Self::Item> {
 | |
|         self.inner.next().map(K::with_id)
 | |
|     }
 | |
| }
 | |
| 
 | |
| pub struct Iter<'a, K, V> {
 | |
|     inner: iter::Enumerate<slice::Iter<'a, V>>,
 | |
|     _marker: PhantomData<K>,
 | |
| }
 | |
| 
 | |
| impl<'a, K, V> Iter<'a, K, V> {
 | |
|     fn new(iter: slice::Iter<'a, V>) -> Self {
 | |
|         Self {
 | |
|             inner: iter.enumerate(),
 | |
|             _marker: PhantomData,
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<'a, K, V> Iterator for Iter<'a, K, V>
 | |
| where
 | |
|     K: EntityId,
 | |
| {
 | |
|     type Item = (K, &'a V);
 | |
| 
 | |
|     fn next(&mut self) -> Option<Self::Item> {
 | |
|         self.inner.next().map(|(id, val)| (K::with_id(id), val))
 | |
|     }
 | |
| }
 | |
| 
 | |
| pub struct IterMut<'a, K, V> {
 | |
|     inner: iter::Enumerate<slice::IterMut<'a, V>>,
 | |
|     _marker: PhantomData<K>,
 | |
| }
 | |
| 
 | |
| impl<'a, K, V> IterMut<'a, K, V> {
 | |
|     fn new(iter: slice::IterMut<'a, V>) -> Self {
 | |
|         Self {
 | |
|             inner: iter.enumerate(),
 | |
|             _marker: PhantomData,
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<'a, K, V> Iterator for IterMut<'a, K, V>
 | |
| where
 | |
|     K: EntityId,
 | |
| {
 | |
|     type Item = (K, &'a mut V);
 | |
| 
 | |
|     fn next(&mut self) -> Option<Self::Item> {
 | |
|         self.inner.next().map(|(id, val)| (K::with_id(id), val))
 | |
|     }
 | |
| }
 | |
| 
 | |
| pub struct IntoIter<K, V> {
 | |
|     inner: iter::Enumerate<vec::IntoIter<V>>,
 | |
|     _marker: PhantomData<K>,
 | |
| }
 | |
| 
 | |
| impl<K, V> IntoIter<K, V> {
 | |
|     fn new(iter: vec::IntoIter<V>) -> Self {
 | |
|         Self {
 | |
|             inner: iter.enumerate(),
 | |
|             _marker: PhantomData,
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<K, V> Iterator for IntoIter<K, V>
 | |
| where
 | |
|     K: EntityId,
 | |
| {
 | |
|     type Item = (K, V);
 | |
| 
 | |
|     fn next(&mut self) -> Option<Self::Item> {
 | |
|         self.inner.next().map(|(id, val)| (K::with_id(id), val))
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<K, V> IntoIterator for DenseMap<K, V>
 | |
| where
 | |
|     K: EntityId,
 | |
| {
 | |
|     type Item = (K, V);
 | |
|     type IntoIter = IntoIter<K, V>;
 | |
| 
 | |
|     fn into_iter(self) -> Self::IntoIter {
 | |
|         IntoIter::new(self.data.into_iter())
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl<K, V> FromIterator<V> for DenseMap<K, V>
 | |
| where
 | |
|     K: EntityId,
 | |
| {
 | |
|     fn from_iter<T>(iter: T) -> Self
 | |
|     where
 | |
|         T: IntoIterator<Item = V>,
 | |
|     {
 | |
|         Self {
 | |
|             data: Vec::from_iter(iter),
 | |
|             _marker: PhantomData,
 | |
|         }
 | |
|     }
 | |
| }
 | 
