Struct immutable_chunkmap::set::Set
source · Expand description
This set uses a similar strategy to BTreeSet to ensure cache efficient performance on modern hardware while still providing log(N) get, insert, and remove operations.
Examples
use std::string::String;
use self::immutable_chunkmap::set::SetM;
let m =
SetM::new()
.insert(String::from("1")).0
.insert(String::from("2")).0
.insert(String::from("3")).0;
assert_eq!(m.contains("1"), true);
assert_eq!(m.contains("2"), true);
assert_eq!(m.contains("3"), true);
assert_eq!(m.contains("4"), false);
for k in &m { println!("{}", k) }Implementations§
source§impl<K, const SIZE: usize> Set<K, SIZE>where
K: Ord + Clone,
impl<K, const SIZE: usize> Set<K, SIZE>where
K: Ord + Clone,
sourcepub fn new() -> Self
pub fn new() -> Self
Create a new empty set
Examples found in repository?
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
fn default() -> Set<K, SIZE> {
Set::new()
}
}
impl<K, const SIZE: usize> PartialEq for Set<K, SIZE>
where
K: Ord + Clone,
{
fn eq(&self, other: &Set<K, SIZE>) -> bool {
self.0 == other.0
}
}
impl<K, const SIZE: usize> Eq for Set<K, SIZE> where K: Eq + Ord + Clone {}
impl<K, const SIZE: usize> PartialOrd for Set<K, SIZE>
where
K: Ord + Clone,
{
fn partial_cmp(&self, other: &Set<K, SIZE>) -> Option<Ordering> {
self.0.partial_cmp(&other.0)
}
}
impl<K, const SIZE: usize> Ord for Set<K, SIZE>
where
K: Ord + Clone,
{
fn cmp(&self, other: &Set<K, SIZE>) -> Ordering {
self.0.cmp(&other.0)
}
}
impl<K, const SIZE: usize> Debug for Set<K, SIZE>
where
K: Debug + Ord + Clone,
{
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
f.debug_set().entries(self.into_iter()).finish()
}
}
impl<K, const SIZE: usize> FromIterator<K> for Set<K, SIZE>
where
K: Ord + Clone,
{
fn from_iter<T: IntoIterator<Item = K>>(iter: T) -> Self {
Set::new().insert_many(iter)
}sourcepub fn downgrade(&self) -> WeakSetRef<K, SIZE>
pub fn downgrade(&self) -> WeakSetRef<K, SIZE>
Create a weak reference to this set
sourcepub fn strong_count(&self) -> usize
pub fn strong_count(&self) -> usize
Return the number of strong references to this set (see Arc)
sourcepub fn weak_count(&self) -> usize
pub fn weak_count(&self) -> usize
Return the number of weak references to this set (see Arc)
sourcepub fn insert_many<E: IntoIterator<Item = K>>(&self, elts: E) -> Self
pub fn insert_many<E: IntoIterator<Item = K>>(&self, elts: E) -> Self
This will insert many elements at once, and is potentially a lot faster than inserting one by one, especially if the data is sorted.
#Examples
use self::immutable_chunkmap::set::SetM;
let mut v = vec![1, 10, -12, 44, 50];
v.sort_unstable();
let m = SetM::new().insert_many(v.iter().map(|k| *k));
for k in &v {
assert_eq!(m.contains(k), true)
}sourcepub fn remove_many<Q, E>(&self, elts: E) -> Selfwhere
Q: Ord,
K: Borrow<Q>,
E: IntoIterator<Item = Q>,
pub fn remove_many<Q, E>(&self, elts: E) -> Selfwhere
Q: Ord,
K: Borrow<Q>,
E: IntoIterator<Item = Q>,
Remove multiple elements in a single pass. Similar performance to insert_many.
sourcepub fn update_many<Q, E, F>(&self, elts: E, f: F) -> Selfwhere
Q: Ord,
K: Borrow<Q>,
E: IntoIterator<Item = Q>,
F: FnMut(Q, Option<&K>) -> Option<K>,
pub fn update_many<Q, E, F>(&self, elts: E, f: F) -> Selfwhere
Q: Ord,
K: Borrow<Q>,
E: IntoIterator<Item = Q>,
F: FnMut(Q, Option<&K>) -> Option<K>,
This is just slightly wierd, however if you have a bunch of borrowed forms of members of the set, and you want to look at the real entries and possibly add/update/remove them, then this method is for you.
sourcepub fn insert(&self, k: K) -> (Self, bool)
pub fn insert(&self, k: K) -> (Self, bool)
return a new set with k inserted into it. If k already exists in the old set return true, else false. If the element already exists in the set memory will not be allocated.
sourcepub fn insert_cow(&mut self, k: K) -> bool
pub fn insert_cow(&mut self, k: K) -> bool
insert k with copy on write semantics. if self is a unique
reference to the set, then k will be inserted in
place. Otherwise, only the parts of the set necessary to
insert k will be copied, and then the copies will be
mutated. self will share all the parts that weren’t modfied
with any previous clones.
sourcepub fn contains<'a, Q>(&'a self, k: &Q) -> boolwhere
Q: ?Sized + Ord,
K: Borrow<Q>,
pub fn contains<'a, Q>(&'a self, k: &Q) -> boolwhere
Q: ?Sized + Ord,
K: Borrow<Q>,
return true if the set contains k, else false. Runs in log(N) time and constant space. where N is the size of the set.
sourcepub fn get<'a, Q>(&'a self, k: &Q) -> Option<&K>where
Q: ?Sized + Ord,
K: Borrow<Q>,
pub fn get<'a, Q>(&'a self, k: &Q) -> Option<&K>where
Q: ?Sized + Ord,
K: Borrow<Q>,
return a reference to the item in the set that is equal to the given value, or None if no such value exists.
sourcepub fn remove<Q: Sized + Ord>(&self, k: &Q) -> (Self, bool)where
K: Borrow<Q>,
pub fn remove<Q: Sized + Ord>(&self, k: &Q) -> (Self, bool)where
K: Borrow<Q>,
return a new set with k removed. Runs in log(N) time and log(N) space, where N is the size of the set
sourcepub fn remove_cow<Q: Sized + Ord>(&mut self, k: &Q) -> boolwhere
K: Borrow<Q>,
pub fn remove_cow<Q: Sized + Ord>(&mut self, k: &Q) -> boolwhere
K: Borrow<Q>,
remove k from the set in place with copy on write semantics
(see insert_cow). return true if k was in the set.
sourcepub fn union(&self, other: &Set<K, SIZE>) -> Self
pub fn union(&self, other: &Set<K, SIZE>) -> Self
return the union of 2 sets. Runs in O(log(N) + M) time and space, where N is the largest of the two sets, and M is the number of chunks that intersect, which is roughly proportional to the size of the intersection.
Examples
use std::iter::FromIterator;
use self::immutable_chunkmap::set::SetM;
let s0 = SetM::from_iter(0..10);
let s1 = SetM::from_iter(5..15);
let s2 = s0.union(&s1);
for i in 0..15 {
assert!(s2.contains(&i));
}sourcepub fn intersect(&self, other: &Set<K, SIZE>) -> Self
pub fn intersect(&self, other: &Set<K, SIZE>) -> Self
return the intersection of 2 sets. Runs in O(log(N) + M) time and space, where N is the smallest of the two sets, and M is the number of intersecting chunks.
Examples
use std::iter::FromIterator; use self::immutable_chunkmap::set::SetM;
let s0 = SetM::from_iter(0..100); let s1 = SetM::from_iter(20..50); let s2 = s0.intersect(&s1);
assert!(s2.len() == 30); for i in 0..100 { if i < 20 || i >= 50 { assert!(!s2.contains(&i)); } else { assert!(s2.contains(&i)); } }
sourcepub fn diff(&self, other: &Set<K, SIZE>) -> Selfwhere
K: Debug,
pub fn diff(&self, other: &Set<K, SIZE>) -> Selfwhere
K: Debug,
Return the difference of two sets. Runs in O(log(N) + M) time and space, where N is the smallest of the two sets, and M is the number of intersecting chunks.
Examples
use std::iter::FromIterator;
use self::immutable_chunkmap::set::SetM;
let s0 = SetM::from_iter(0..100);
let s1 = SetM::from_iter(0..50);
let s2 = s0.diff(&s1);
assert!(s2.len() == 50);
for i in 0..50 {
assert!(!s2.contains(&i));
}
for i in 50..100 {
assert!(s2.contains(&i));
}sourcepub fn range<'a, Q>(
&'a self,
lbound: Bound<Q>,
ubound: Bound<Q>
) -> SetIter<'a, Q, K, SIZE> ⓘwhere
Q: Ord,
K: 'a + Clone + Ord + Borrow<Q>,
pub fn range<'a, Q>(
&'a self,
lbound: Bound<Q>,
ubound: Bound<Q>
) -> SetIter<'a, Q, K, SIZE> ⓘwhere
Q: Ord,
K: 'a + Clone + Ord + Borrow<Q>,
return an iterator over the subset of elements in the set that are within the specified range.
The returned iterator runs in O(log(N) + M) time, and constant space. N is the number of elements in the tree, and M is the number of elements you examine.
if lbound >= ubound the returned iterator will be empty
Trait Implementations§
source§impl<K, const SIZE: usize> FromIterator<K> for Set<K, SIZE>where
K: Ord + Clone,
impl<K, const SIZE: usize> FromIterator<K> for Set<K, SIZE>where
K: Ord + Clone,
source§fn from_iter<T: IntoIterator<Item = K>>(iter: T) -> Self
fn from_iter<T: IntoIterator<Item = K>>(iter: T) -> Self
source§impl<K, const SIZE: usize> Ord for Set<K, SIZE>where
K: Ord + Clone,
impl<K, const SIZE: usize> Ord for Set<K, SIZE>where
K: Ord + Clone,
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
source§impl<K, const SIZE: usize> PartialEq<Set<K, SIZE>> for Set<K, SIZE>where
K: Ord + Clone,
impl<K, const SIZE: usize> PartialEq<Set<K, SIZE>> for Set<K, SIZE>where
K: Ord + Clone,
source§impl<K, const SIZE: usize> PartialOrd<Set<K, SIZE>> for Set<K, SIZE>where
K: Ord + Clone,
impl<K, const SIZE: usize> PartialOrd<Set<K, SIZE>> for Set<K, SIZE>where
K: Ord + Clone,
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self and other) and is used by the <=
operator. Read moreimpl<K, const SIZE: usize> Eq for Set<K, SIZE>where
K: Eq + Ord + Clone,
Auto Trait Implementations§
impl<K, const SIZE: usize> RefUnwindSafe for Set<K, SIZE>where
K: RefUnwindSafe,
impl<K, const SIZE: usize> Send for Set<K, SIZE>where
K: Send + Sync,
impl<K, const SIZE: usize> Sync for Set<K, SIZE>where
K: Send + Sync,
impl<K, const SIZE: usize> Unpin for Set<K, SIZE>
impl<K, const SIZE: usize> UnwindSafe for Set<K, SIZE>where
K: RefUnwindSafe,
Blanket Implementations§
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
self, then passes self.as_mut() into the pipe
function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
.tap_ref_mut() only in debug builds, and is erased in release
builds.