use crate::{
array::{DeviceArray, DeviceArrayView},
error::Result,
handle::EnteredContext,
types::CugraphElement,
};
#[derive(Debug, Clone, Copy, Default)]
pub enum VertexSelection<'a, V: CugraphElement = i32> {
#[default]
All,
Device(&'a DeviceArrayView<'a, V>),
Host(&'a [V]),
}
impl<'a, V: CugraphElement> From<&'a DeviceArrayView<'a, V>> for VertexSelection<'a, V> {
fn from(view: &'a DeviceArrayView<'a, V>) -> Self {
Self::Device(view)
}
}
impl<'a, V: CugraphElement> From<&'a [V]> for VertexSelection<'a, V> {
fn from(slice: &'a [V]) -> Self {
Self::Host(slice)
}
}
impl<'a, V: CugraphElement> VertexSelection<'a, V> {
pub(crate) fn resolve(self, handle: &EnteredContext<'_>) -> Result<ResolvedVertexSelection<'a, V>> {
match self {
Self::All => Ok(ResolvedVertexSelection::All),
Self::Device(view) => Ok(ResolvedVertexSelection::Borrowed(view)),
Self::Host(slice) => {
let array = DeviceArray::from_slice(handle, slice)?;
Ok(ResolvedVertexSelection::Owned(array))
},
}
}
}
pub(crate) enum ResolvedVertexSelection<'a, V: CugraphElement> {
All,
Borrowed(&'a DeviceArrayView<'a, V>),
Owned(DeviceArray<V>),
}
impl<V: CugraphElement> ResolvedVertexSelection<'_, V> {
pub(crate) fn view(&self) -> Result<Option<DeviceArrayView<'_, V>>> {
match self {
Self::All => Ok(None),
Self::Borrowed(view) => Ok(Some(DeviceArrayView::from_raw_unchecked(view.raw_view()))),
Self::Owned(array) => array.view().map(Some),
}
}
}