mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-29 00:49:42 +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,
|
|
}
|
|
}
|
|
}
|