pub trait Constructed<const RL: usize = 0, const EL: usize = 0> {
const FIELDS: super::fields::Fields<RL>;
const IS_EXTENSIBLE: bool = false;
const EXTENDED_FIELDS: Option<super::fields::Fields<EL>> = None;
}
pub type SequenceOf<T> = alloc::vec::Vec<T>;
#[derive(Debug, Clone)]
pub struct SetOf<T> {
elements: alloc::vec::Vec<T>,
}
impl<T> SetOf<T>
where
T: Eq,
{
#[must_use]
pub fn new() -> Self {
SetOf {
elements: alloc::vec::Vec::new(),
}
}
#[must_use]
pub fn from_vec(elements: alloc::vec::Vec<T>) -> Self {
Self { elements }
}
#[must_use]
pub fn with_capacity(n: usize) -> Self {
Self {
elements: alloc::vec::Vec::with_capacity(n),
}
}
pub fn insert(&mut self, item: T) {
self.elements.push(item);
}
#[must_use]
pub fn len(&self) -> usize {
self.elements.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.elements.is_empty()
}
pub fn remove(&mut self, item: &T) -> bool {
if let Some(idx) = self.elements.iter().position(|i| i == item) {
self.elements.swap_remove(idx);
true
} else {
false
}
}
pub fn contains(&self, item: &T) -> bool {
for i in &self.elements {
if i == item {
return true;
}
}
false
}
#[must_use]
pub fn to_vec(&self) -> alloc::vec::Vec<&T> {
self.elements.iter().collect()
}
}
impl<T> PartialEq for SetOf<T>
where
T: Eq,
{
fn eq(&self, other: &Self) -> bool {
if self.elements.len() != other.len() {
return false;
}
for item in &self.elements {
if !other.contains(item) {
return false;
}
}
for item in &other.elements {
if !self.elements.contains(item) {
return false;
}
}
true
}
}
impl<T> PartialEq<alloc::vec::Vec<T>> for SetOf<T>
where
T: Eq,
{
fn eq(&self, other: &alloc::vec::Vec<T>) -> bool {
if self.elements.len() != other.len() {
return false;
}
for item in &self.elements {
if !other.contains(item) {
return false;
}
}
for item in other {
if !self.elements.contains(item) {
return false;
}
}
true
}
}
impl<T> Eq for SetOf<T> where T: Eq {}
impl<T> core::hash::Hash for SetOf<T>
where
T: Eq + core::hash::Hash,
{
fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
for item in &self.elements {
item.hash(state);
}
}
}
impl<T: Eq> From<alloc::vec::Vec<T>> for SetOf<T> {
fn from(vec: alloc::vec::Vec<T>) -> Self {
Self::from_vec(vec)
}
}
impl<T: Clone + Eq> From<&[T]> for SetOf<T> {
fn from(vec: &[T]) -> Self {
Self::from_vec(vec.to_vec())
}
}
impl<T: Clone + Eq, const N: usize> From<[T; N]> for SetOf<T> {
fn from(array: [T; N]) -> Self {
Self::from_vec(array.to_vec())
}
}
impl<T: Eq> Default for SetOf<T> {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_set_of() {
let int_set: SetOf<u8> = [1, 2, 3, 4, 5].into();
let int_set_reversed: &SetOf<u8> = &[5, 4, 3, 2, 1].into();
let int_set_diff: SetOf<u8> = [1, 2, 3, 4, 6].into();
assert_eq!(&int_set, int_set_reversed);
assert_ne!(int_set, int_set_diff);
let mut set_a = SetOf::new();
set_a.insert(1);
set_a.insert(2);
set_a.insert(3);
let mut set_b = SetOf::new();
set_b.insert(3);
set_b.insert(2);
set_b.insert(1);
let set_c: SetOf<_> = alloc::vec![4, 5, 6].into();
assert_eq!(set_a, set_b);
assert_ne!(set_a, set_c);
let set_d = SetOf::from_vec(alloc::vec![1, 1, 2, 2, 3, 3]);
assert_ne!(set_a, set_d);
}
}