Implement some traits for rayon support.

This commit is contained in:
2018-01-08 21:39:54 +01:00
parent 6960ce726b
commit 232d76ef36
3 changed files with 78 additions and 1 deletions

View File

@@ -1,3 +1,4 @@
extern crate rayon;
extern crate serde;
extern crate unreachable;
@@ -5,7 +6,9 @@ use std::fmt;
use std::ops;
use std::iter::{FromIterator, IntoIterator, Iterator};
use std::default::Default;
use std::collections::HashMap;
use std::collections::{HashMap, LinkedList};
use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, ParallelIterator};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use serde::ser::SerializeSeq;
@@ -330,6 +333,40 @@ impl Iterator for IntoIter {
}
}
impl ParallelExtend<u64> for BitSet {
fn par_extend<I>(&mut self, par_iter: I)
where I:
IntoParallelIterator<Item = u64>
{
let list = par_iter
.into_par_iter()
.fold(Vec::new, |mut vec, elem| {
vec.push(elem);
vec
})
.collect::<LinkedList<Vec<u64>>>();
let len = list.iter().map(Vec::len).sum();
let mut set = BitSet::with_capacity(len);
for vec in list {
set.extend(vec);
}
}
}
impl FromParallelIterator<u64> for BitSet {
fn from_par_iter<I>(par_iter: I) -> Self
where
I: IntoParallelIterator<Item = u64>
{
let mut set = BitSet::new();
set.par_extend(par_iter);
set
}
}
impl Serialize for BitSet {
#[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>