summaryrefslogtreecommitdiff
path: root/rust/src/rc.rs
diff options
context:
space:
mode:
authorFabian Freyer <fabian.freyer@physik.tu-berlin.de>2022-01-31 06:24:07 +0100
committerKyleMiles <krm504@nyu.edu>2022-02-14 18:45:09 -0500
commit181ad567199e5685578ecf7ad400257098c2e175 (patch)
tree9e45c986cc8157dfe0fd6f5a8e80898d4a128309 /rust/src/rc.rs
parentae7ae4f63f931342e155d77bb4cf6d75289682bf (diff)
rust: add ArrayGuard and for non-owned arrays
To make use of shard functionality, we split the CoreOwnedArrayProvider into CoreArrayProvider and CoreOwnedArrayProvider. Array makes use of the CoreOwnedArrayProvider, which depends on CoreArrayProvider, while the new ArrayGuard only requires CoreArrayProvider and represents a non-owned array.
Diffstat (limited to 'rust/src/rc.rs')
-rw-r--r--rust/src/rc.rs92
1 files changed, 77 insertions, 15 deletions
diff --git a/rust/src/rc.rs b/rust/src/rc.rs
index 7c5d610f..bc60bf94 100644
--- a/rust/src/rc.rs
+++ b/rust/src/rc.rs
@@ -146,14 +146,16 @@ impl<'a, T> Borrow<T> for Guard<'a, T> {
}
}
-pub unsafe trait CoreOwnedArrayProvider {
+pub trait CoreArrayProvider {
type Raw;
type Context;
+}
+pub unsafe trait CoreOwnedArrayProvider: CoreArrayProvider {
unsafe fn free(raw: *mut Self::Raw, count: usize, context: &Self::Context);
}
-pub unsafe trait CoreOwnedArrayWrapper<'a>: CoreOwnedArrayProvider
+pub unsafe trait CoreArrayWrapper<'a>: CoreArrayProvider
where
Self::Raw: 'a,
Self::Context: 'a,
@@ -197,7 +199,7 @@ impl<P: CoreOwnedArrayProvider> Array<P> {
}
}
-impl<'a, P: 'a + CoreOwnedArrayWrapper<'a>> Array<P> {
+impl<'a, P: 'a + CoreArrayWrapper<'a> + CoreOwnedArrayProvider> Array<P> {
#[inline]
pub fn get(&'a self, index: usize) -> P::Wrapped {
unsafe {
@@ -214,7 +216,7 @@ impl<'a, P: 'a + CoreOwnedArrayWrapper<'a>> Array<P> {
}
}
-impl<'a, P: 'a + CoreOwnedArrayWrapper<'a>> IntoIterator for &'a Array<P> {
+impl<'a, P: 'a + CoreArrayWrapper<'a> + CoreOwnedArrayProvider> IntoIterator for &'a Array<P> {
type Item = P::Wrapped;
type IntoIter = ArrayIter<'a, P>;
@@ -231,9 +233,69 @@ impl<P: CoreOwnedArrayProvider> Drop for Array<P> {
}
}
+pub struct ArrayGuard<P: CoreArrayProvider> {
+ contents: *mut P::Raw,
+ count: usize,
+ context: P::Context,
+}
+
+unsafe impl<P> Sync for ArrayGuard<P>
+where
+ P: CoreArrayProvider,
+ P::Context: Sync,
+{
+}
+unsafe impl<P> Send for ArrayGuard<P>
+where
+ P: CoreArrayProvider,
+ P::Context: Send,
+{
+}
+
+impl<P: CoreArrayProvider> ArrayGuard<P> {
+ pub(crate) unsafe fn new(raw: *mut P::Raw, count: usize, context: P::Context) -> Self {
+ Self {
+ contents: raw,
+ count,
+ context,
+ }
+ }
+
+ #[inline]
+ pub fn len(&self) -> usize {
+ self.count
+ }
+}
+
+impl<'a, P: 'a + CoreArrayWrapper<'a> + CoreArrayProvider> ArrayGuard<P> {
+ #[inline]
+ pub fn get(&'a self, index: usize) -> P::Wrapped {
+ unsafe {
+ let backing = slice::from_raw_parts(self.contents, self.count);
+ P::wrap_raw(&backing[index], &self.context)
+ }
+ }
+
+ pub fn iter(&'a self) -> ArrayIter<'a, P> {
+ ArrayIter {
+ it: unsafe { slice::from_raw_parts(self.contents, self.count).iter() },
+ context: &self.context,
+ }
+ }
+}
+
+impl<'a, P: 'a + CoreArrayWrapper<'a> + CoreArrayProvider> IntoIterator for &'a ArrayGuard<P> {
+ type Item = P::Wrapped;
+ type IntoIter = ArrayIter<'a, P>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ self.iter()
+ }
+}
+
pub struct ArrayIter<'a, P>
where
- P: 'a + CoreOwnedArrayWrapper<'a>,
+ P: 'a + CoreArrayWrapper<'a>,
{
it: slice::Iter<'a, P::Raw>,
context: &'a P::Context,
@@ -241,14 +303,14 @@ where
unsafe impl<'a, P> Send for ArrayIter<'a, P>
where
- P: CoreOwnedArrayWrapper<'a>,
+ P: CoreArrayWrapper<'a>,
P::Context: Sync,
{
}
impl<'a, P> Iterator for ArrayIter<'a, P>
where
- P: 'a + CoreOwnedArrayWrapper<'a>,
+ P: 'a + CoreArrayWrapper<'a>,
{
type Item = P::Wrapped;
@@ -267,7 +329,7 @@ where
impl<'a, P> ExactSizeIterator for ArrayIter<'a, P>
where
- P: 'a + CoreOwnedArrayWrapper<'a>,
+ P: 'a + CoreArrayWrapper<'a>,
{
#[inline]
fn len(&self) -> usize {
@@ -277,7 +339,7 @@ where
impl<'a, P> DoubleEndedIterator for ArrayIter<'a, P>
where
- P: 'a + CoreOwnedArrayWrapper<'a>,
+ P: 'a + CoreArrayWrapper<'a>,
{
#[inline]
fn next_back(&mut self) -> Option<P::Wrapped> {
@@ -296,7 +358,7 @@ use rayon::iter::plumbing::*;
#[cfg(feature = "rayon")]
impl<'a, P> Array<P>
where
- P: 'a + CoreOwnedArrayWrapper<'a>,
+ P: 'a + CoreArrayWrapper<'a>,
P::Context: Sync,
P::Wrapped: Send,
{
@@ -307,7 +369,7 @@ where
#[cfg(feature = "rayon")]
pub struct ParArrayIter<'a, P>
where
- P: 'a + CoreOwnedArrayWrapper<'a>,
+ P: 'a + CoreArrayWrapper<'a>,
ArrayIter<'a, P>: Send,
{
it: ArrayIter<'a, P>,
@@ -316,7 +378,7 @@ where
#[cfg(feature = "rayon")]
impl<'a, P> ParallelIterator for ParArrayIter<'a, P>
where
- P: 'a + CoreOwnedArrayWrapper<'a>,
+ P: 'a + CoreArrayWrapper<'a>,
P::Wrapped: Send,
ArrayIter<'a, P>: Send,
{
@@ -337,7 +399,7 @@ where
#[cfg(feature = "rayon")]
impl<'a, P> IndexedParallelIterator for ParArrayIter<'a, P>
where
- P: 'a + CoreOwnedArrayWrapper<'a>,
+ P: 'a + CoreArrayWrapper<'a>,
P::Wrapped: Send,
ArrayIter<'a, P>: Send,
{
@@ -363,7 +425,7 @@ where
#[cfg(feature = "rayon")]
struct ArrayIterProducer<'a, P>
where
- P: 'a + CoreOwnedArrayWrapper<'a>,
+ P: 'a + CoreArrayWrapper<'a>,
ArrayIter<'a, P>: Send,
{
it: ArrayIter<'a, P>,
@@ -372,7 +434,7 @@ where
#[cfg(feature = "rayon")]
impl<'a, P> Producer for ArrayIterProducer<'a, P>
where
- P: 'a + CoreOwnedArrayWrapper<'a>,
+ P: 'a + CoreArrayWrapper<'a>,
ArrayIter<'a, P>: Send,
{
type Item = P::Wrapped;