#![doc = include_str!("../README.md")]
use std::any::TypeId;
mod set;
pub use set::*;
pub mod sets;
pub unsafe trait Contains<E> {}
unsafe impl<T: ?Sized, E> Contains<E> for Set<T> where T: Contains<E> {}
unsafe impl<T, E> Contains<E> for T
where
T: AsSet,
T::Set: Contains<E>,
{
}
pub unsafe trait Members {
fn members() -> Vec<TypeId>;
}
unsafe impl<T> Members for T
where
T: AsSet,
{
fn members() -> Vec<TypeId> {
<T::Set as Members>::members()
}
}
pub unsafe trait SubsetOf<S> {}
unsafe impl<T, S> SubsetOf<S> for T
where
T: AsSet,
T::Set: SubsetOf<S>,
{
}
pub unsafe trait SupersetOf<S> {}
unsafe impl<T, S> SupersetOf<S> for T where S: SubsetOf<T> {}
pub trait AsSet {
type Set: Members;
}
#[cfg(test)]
mod tests {
use super::*;
struct MySet;
impl AsSet for MySet {
type Set = Set![u32, u64];
}
#[test]
fn test() {
contains_string::<Set![String]>();
contains_string::<Set![String, u32]>();
contains_string::<Set![String, u32, u64]>();
contains_string::<Set![u32, u64, u128, String]>();
is_subset::<Set![u32, u64, u32, u32]>();
is_subset::<Set![u32, u64]>();
is_subset2::<Set![u32]>();
is_subset::<Set![]>();
is_subset::<MySet>();
is_superset1::<Set![u32, u64]>();
is_superset2::<Set![u32, u64, u128]>();
is_superset1::<MySet>();
let _: Set![];
let _: Set![u32];
let _: Set![u32, u64];
let _: Set![u32, u64, u128];
let _: Set![u32, u64, u128, u32];
let _: Set![u32, u64, u128, u32, u64];
let _: Set![u32, u64, u128, u32, u64, u128];
let _: Set![u32, u64, u128, u32, u64, u128, u32];
let _: Set![u32, u64, u128, u32, u64, u128, u32, u64];
let _: Set![u32, u64, u128, u32, u64, u128, u32, u64, u128];
let _: Set![u32, u64, u128, u32, u64, u128, u32, u64, u128, u32];
let _: Set![u32, u64, u128, u32, u64, u128, u32, u64, u128, u32, u64];
let _: Set![u32, u64, u128, u32, u64, u128, u32, u64, u128, u32, u64, u128];
}
fn contains_string<T>()
where
T: Contains<String>,
{
}
fn is_subset<T>()
where
T: SubsetOf<Set![u32, u64]>,
{
}
fn is_subset2<T>()
where
T: SubsetOf<Set![u32]>,
{
}
fn is_superset1<T>()
where
T: SupersetOf<Set![u32, u64]>,
{
}
fn is_superset2<T>()
where
T: SupersetOf<Set![u32, u64, u128]>,
{
}
}