Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 47 additions & 50 deletions lib/tinyset.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
extern crate tinyset;

use self::tinyset::u64set;
use self::tinyset::set64;
use __std::option2std;
use differential_datalog::record::*;
use serde;
Expand All @@ -21,8 +21,8 @@ use flatbuf::{FBIter, FromFlatBuffer, ToFlatBuffer, ToFlatBufferVectorElement};
use flatbuffers as fbrt;

#[derive(Eq, Clone, Hash, PartialEq)]
pub struct tinyset_Set64<T: u64set::Fits64> {
pub x: u64set::Set64<T>,
pub struct tinyset_Set64<T: set64::Fits64> {
pub x: set64::Set64<T>,
}

/* This is needed so we can support for-loops over `Set64`'s.
Expand All @@ -31,11 +31,11 @@ pub struct tinyset_Set64<T: u64set::Fits64> {
* This can be costly, but is necessary to make sure that all `Set64`
* operations are deterministic.
*/
pub struct Set64Iter<X: u64set::Fits64 + Ord> {
pub struct Set64Iter<X: set64::Fits64 + Ord> {
iter: vec::IntoIter<X>,
}

impl<X: u64set::Fits64 + Ord> Set64Iter<X> {
impl<X: set64::Fits64 + Ord> Set64Iter<X> {
pub fn new(set: &tinyset_Set64<X>) -> Set64Iter<X> {
let mut v: Vec<_> = set.x.iter().collect();
v.sort();
Expand All @@ -45,7 +45,7 @@ impl<X: u64set::Fits64 + Ord> Set64Iter<X> {
}
}

impl<X: u64set::Fits64 + Ord> Iterator for Set64Iter<X> {
impl<X: set64::Fits64 + Ord> Iterator for Set64Iter<X> {
type Item = X;

fn next(&mut self) -> Option<Self::Item> {
Expand All @@ -67,12 +67,12 @@ impl<T: tinyset::Fits64> tinyset_Set64<T> {
/* In cases when order really, definitely, 100% does not matter,
* a more efficient iterator can be used.
*/
pub fn unsorted_iter(&self) -> u64set::Iter64<T> {
pub fn unsorted_iter<'a>(&'a self) -> impl Iterator<Item = T> + 'a {
self.x.iter()
}
}

impl<T: u64set::Fits64 + Ord> Ord for tinyset_Set64<T> {
impl<T: set64::Fits64 + Ord> Ord for tinyset_Set64<T> {
fn cmp(&self, other: &Self) -> cmp::Ordering {
let size_cmp = self.x.len().cmp(&other.x.len());
if size_cmp != cmp::Ordering::Equal {
Expand All @@ -83,21 +83,21 @@ impl<T: u64set::Fits64 + Ord> Ord for tinyset_Set64<T> {
}
}

impl<T: u64set::Fits64 + Ord> PartialOrd for tinyset_Set64<T> {
impl<T: set64::Fits64 + Ord> PartialOrd for tinyset_Set64<T> {
fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
Some(self.cmp(other))
}
}

impl<T: u64set::Fits64 + Ord> Default for tinyset_Set64<T> {
impl<T: set64::Fits64 + Ord> Default for tinyset_Set64<T> {
fn default() -> Self {
tinyset_Set64 {
x: u64set::Set64::default(),
x: set64::Set64::default(),
}
}
}

impl<T: u64set::Fits64 + serde::Serialize + Ord> serde::Serialize for tinyset_Set64<T> {
impl<T: set64::Fits64 + serde::Serialize + Ord> serde::Serialize for tinyset_Set64<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
Expand All @@ -106,7 +106,7 @@ impl<T: u64set::Fits64 + serde::Serialize + Ord> serde::Serialize for tinyset_Se
}
}

impl<'de, T: u64set::Fits64 + serde::Deserialize<'de> + Ord> serde::Deserialize<'de>
impl<'de, T: set64::Fits64 + serde::Deserialize<'de> + Ord> serde::Deserialize<'de>
for tinyset_Set64<T>
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
Expand All @@ -117,10 +117,10 @@ impl<'de, T: u64set::Fits64 + serde::Deserialize<'de> + Ord> serde::Deserialize<
}
}

impl<T: u64set::Fits64> tinyset_Set64<T> {
impl<T: set64::Fits64> tinyset_Set64<T> {
pub fn new() -> Self {
tinyset_Set64 {
x: u64set::Set64::new(),
x: set64::Set64::new(),
}
}
pub fn insert(&mut self, v: T) {
Expand All @@ -131,15 +131,15 @@ impl<T: u64set::Fits64> tinyset_Set64<T> {
}
}

impl<T: FromRecord + u64set::Fits64> FromRecord for tinyset_Set64<T> {
impl<T: FromRecord + set64::Fits64> FromRecord for tinyset_Set64<T> {
fn from_record(val: &Record) -> Result<Self, String> {
vec::Vec::from_record(val).map(|v| tinyset_Set64 {
x: u64set::Set64::from_iter(v),
x: set64::Set64::from_iter(v),
})
}
}

impl<T: IntoRecord + u64set::Fits64 + Ord> IntoRecord for tinyset_Set64<T> {
impl<T: IntoRecord + set64::Fits64 + Ord> IntoRecord for tinyset_Set64<T> {
fn into_record(self) -> Record {
Record::Array(
CollectionKind::Set,
Expand All @@ -148,7 +148,7 @@ impl<T: IntoRecord + u64set::Fits64 + Ord> IntoRecord for tinyset_Set64<T> {
}
}

impl<T: FromRecord + u64set::Fits64 + Ord> Mutator<tinyset_Set64<T>> for Record {
impl<T: FromRecord + set64::Fits64 + Ord> Mutator<tinyset_Set64<T>> for Record {
fn mutate(&self, set: &mut tinyset_Set64<T>) -> Result<(), String> {
let upd = <tinyset_Set64<T>>::from_record(self)?;
for v in upd.into_iter() {
Expand All @@ -160,26 +160,26 @@ impl<T: FromRecord + u64set::Fits64 + Ord> Mutator<tinyset_Set64<T>> for Record
}
}

impl<T: u64set::Fits64 + Ord> iter::IntoIterator for &tinyset_Set64<T> {
impl<T: set64::Fits64 + Ord> iter::IntoIterator for &tinyset_Set64<T> {
type Item = T;
type IntoIter = Set64Iter<T>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}

impl<T: u64set::Fits64> FromIterator<T> for tinyset_Set64<T> {
impl<T: set64::Fits64> FromIterator<T> for tinyset_Set64<T> {
fn from_iter<I>(iter: I) -> Self
where
I: iter::IntoIterator<Item = T>,
{
tinyset_Set64 {
x: u64set::Set64::from_iter(iter),
x: set64::Set64::from_iter(iter),
}
}
}

impl<T: fmt::Display + u64set::Fits64 + Ord> fmt::Display for tinyset_Set64<T> {
impl<T: fmt::Display + set64::Fits64 + Ord> fmt::Display for tinyset_Set64<T> {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
let len = self.x.len();
formatter.write_str("[")?;
Expand All @@ -194,7 +194,7 @@ impl<T: fmt::Display + u64set::Fits64 + Ord> fmt::Display for tinyset_Set64<T> {
}
}

impl<T: fmt::Debug + u64set::Fits64 + Ord> fmt::Debug for tinyset_Set64<T> {
impl<T: fmt::Debug + set64::Fits64 + Ord> fmt::Debug for tinyset_Set64<T> {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
let len = self.x.len();
formatter.write_str("[")?;
Expand All @@ -212,7 +212,7 @@ impl<T: fmt::Debug + u64set::Fits64 + Ord> fmt::Debug for tinyset_Set64<T> {
#[cfg(feature = "flatbuf")]
impl<'a, T, F> FromFlatBuffer<fbrt::Vector<'a, F>> for tinyset_Set64<T>
where
T: Ord + FromFlatBuffer<F::Inner> + u64set::Fits64,
T: Ord + FromFlatBuffer<F::Inner> + set64::Fits64,
F: fbrt::Follow<'a> + 'a,
{
fn from_flatbuf(fb: fbrt::Vector<'a, F>) -> Response<Self> {
Expand All @@ -228,7 +228,7 @@ where
#[cfg(feature = "flatbuf")]
impl<'a, T> FromFlatBuffer<&'a [T]> for tinyset_Set64<T>
where
T: Ord + u64set::Fits64,
T: Ord + set64::Fits64,
{
fn from_flatbuf(fb: &'a [T]) -> Response<Self> {
let mut set = tinyset_Set64::new();
Expand All @@ -242,7 +242,7 @@ where
#[cfg(feature = "flatbuf")]
impl<'b, T> ToFlatBuffer<'b> for tinyset_Set64<T>
where
T: Ord + u64set::Fits64 + ToFlatBufferVectorElement<'b>,
T: Ord + set64::Fits64 + ToFlatBufferVectorElement<'b>,
{
type Target = fbrt::WIPOffset<fbrt::Vector<'b, <T::Target as fbrt::Push>::Output>>;

Expand All @@ -255,25 +255,25 @@ where
}
}

pub fn tinyset_size<X: u64set::Fits64>(s: &tinyset_Set64<X>) -> u64 {
pub fn tinyset_size<X: set64::Fits64>(s: &tinyset_Set64<X>) -> u64 {
s.x.len() as u64
}

pub fn tinyset_empty<X: u64set::Fits64>() -> tinyset_Set64<X> {
pub fn tinyset_empty<X: set64::Fits64>() -> tinyset_Set64<X> {
tinyset_Set64::new()
}

pub fn tinyset_singleton<X: u64set::Fits64 + Clone>(v: &X) -> tinyset_Set64<X> {
pub fn tinyset_singleton<X: set64::Fits64 + Clone>(v: &X) -> tinyset_Set64<X> {
let mut s = tinyset_Set64::new();
s.insert(v.clone());
s
}

pub fn tinyset_insert<X: u64set::Fits64 + Clone>(s: &mut tinyset_Set64<X>, v: &X) {
pub fn tinyset_insert<X: set64::Fits64 + Clone>(s: &mut tinyset_Set64<X>, v: &X) {
s.x.insert((*v).clone());
}

pub fn tinyset_insert_imm<X: u64set::Fits64 + Clone>(
pub fn tinyset_insert_imm<X: set64::Fits64 + Clone>(
s: &tinyset_Set64<X>,
v: &X,
) -> tinyset_Set64<X> {
Expand All @@ -282,39 +282,36 @@ pub fn tinyset_insert_imm<X: u64set::Fits64 + Clone>(
s2
}

pub fn tinyset_contains<X: u64set::Fits64>(s: &tinyset_Set64<X>, v: &X) -> bool {
pub fn tinyset_contains<X: set64::Fits64>(s: &tinyset_Set64<X>, v: &X) -> bool {
s.x.contains(*v)
}

pub fn tinyset_is_empty<X: u64set::Fits64>(s: &tinyset_Set64<X>) -> bool {
pub fn tinyset_is_empty<X: set64::Fits64>(s: &tinyset_Set64<X>) -> bool {
s.x.len() == 0
}

pub fn tinyset_nth<X: u64set::Fits64 + Ord + Clone>(
s: &tinyset_Set64<X>,
n: &u64,
) -> std_Option<X> {
pub fn tinyset_nth<X: set64::Fits64 + Ord + Clone>(s: &tinyset_Set64<X>, n: &u64) -> std_Option<X> {
option2std(s.iter().nth(*n as usize))
}

pub fn tinyset_set2vec<X: u64set::Fits64 + Ord + Clone>(s: &tinyset_Set64<X>) -> std_Vec<X> {
pub fn tinyset_set2vec<X: set64::Fits64 + Ord + Clone>(s: &tinyset_Set64<X>) -> std_Vec<X> {
let mut v: Vec<_> = s.x.iter().collect();
v.sort();
std_Vec { x: v }
}

pub fn tinyset_union<X: u64set::Fits64 + Clone>(
pub fn tinyset_union<X: set64::Fits64 + Clone>(
s1: &tinyset_Set64<X>,
s2: &tinyset_Set64<X>,
) -> tinyset_Set64<X> {
let s = s1.x.clone();
tinyset_Set64 { x: s.bitor(&s2.x) }
}

pub fn tinyset_unions<X: u64set::Fits64 + Clone>(
pub fn tinyset_unions<X: set64::Fits64 + Clone>(
sets: &std_Vec<tinyset_Set64<X>>,
) -> tinyset_Set64<X> {
let mut s = u64set::Set64::new();
let mut s = set64::Set64::new();
for si in sets.x.iter() {
for v in si.unsorted_iter() {
s.insert(v);
Expand All @@ -323,11 +320,11 @@ pub fn tinyset_unions<X: u64set::Fits64 + Clone>(
tinyset_Set64 { x: s }
}

pub fn tinyset_intersection<X: u64set::Fits64 + Clone>(
pub fn tinyset_intersection<X: set64::Fits64 + Clone>(
s1: &tinyset_Set64<X>,
s2: &tinyset_Set64<X>,
) -> tinyset_Set64<X> {
let mut s = u64set::Set64::new();
let mut s = set64::Set64::new();
for v in s1.unsorted_iter() {
if s2.x.contains(v) {
s.insert(v);
Expand All @@ -336,7 +333,7 @@ pub fn tinyset_intersection<X: u64set::Fits64 + Clone>(
tinyset_Set64 { x: s }
}

pub fn tinyset_difference<X: u64set::Fits64 + Clone>(
pub fn tinyset_difference<X: set64::Fits64 + Clone>(
s1: &tinyset_Set64<X>,
s2: &tinyset_Set64<X>,
) -> tinyset_Set64<X> {
Expand All @@ -345,18 +342,18 @@ pub fn tinyset_difference<X: u64set::Fits64 + Clone>(
}
}

pub fn tinyset_group2set<K, V: u64set::Fits64>(g: &std_Group<K, V>) -> tinyset_Set64<V> {
pub fn tinyset_group2set<K, V: set64::Fits64>(g: &std_Group<K, V>) -> tinyset_Set64<V> {
let mut res = tinyset_Set64::new();
for ref v in g.iter() {
tinyset_insert(&mut res, v);
}
res
}

pub fn tinyset_group_set_unions<K, V: u64set::Fits64 + Clone>(
pub fn tinyset_group_set_unions<K, V: set64::Fits64 + Clone>(
g: &std_Group<K, tinyset_Set64<V>>,
) -> tinyset_Set64<V> {
let mut res = u64set::Set64::new();
let mut res = set64::Set64::new();
for gr in g.iter() {
for v in gr.unsorted_iter() {
res.insert(v.clone());
Expand All @@ -367,14 +364,14 @@ pub fn tinyset_group_set_unions<K, V: u64set::Fits64 + Clone>(
tinyset_Set64 { x: res }
}

pub fn tinyset_group_setref_unions<K, V: u64set::Fits64 + Ord + Clone>(
pub fn tinyset_group_setref_unions<K, V: set64::Fits64 + Ord + Clone>(
g: &std_Group<K, std_Ref<tinyset_Set64<V>>>,
) -> std_Ref<tinyset_Set64<V>> {
if std_group_count(g) == 1 {
std_group_first(g)
} else {
let mut res = std_ref_new(&tinyset_Set64 {
x: u64set::Set64::new(),
x: set64::Set64::new(),
});
{
let rres = std_Ref::get_mut(&mut res).unwrap();
Expand Down
2 changes: 1 addition & 1 deletion lib/tinyset.toml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
[dependencies.tinyset]
version = "0.2.2"
version = "0.4.3"
4 changes: 2 additions & 2 deletions rust/template/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ use cpuprofiler::PROFILER;

#[allow(clippy::let_and_return)]
fn handle_cmd(
start_time: &Instant,
start_time: Instant,
hddlog: &HDDlog,
print_deltas: bool,
interactive: bool,
Expand Down Expand Up @@ -224,7 +224,7 @@ fn run(mut hddlog: HDDlog, print_deltas: bool) -> Result<(), String> {
let start_time = Instant::now();
interact(|cmd, interactive| {
handle_cmd(
&start_time,
start_time,
&hddlog,
print_deltas,
interactive,
Expand Down