pub struct CommitStateSpace { /* private fields */ }
Expand description
A set of commits with directed (acyclic) dependencies between them.
Vertices in the CommitStateSpace
are Commit
s and there is an edge
from a commit c1
to a commit c2
if c1
must be applied before c2
:
in other words, if c2
deletes nodes that are introduced in c1
. We say
c2
depends on (or is a child of) c1
.
A CommitStateSpace
always has a unique base commit (the root of the
graph). All other commits are PersistentReplacement
s that apply on top
of it. Commits are stored as RelRc
s: they are reference-counted pointers
to the patch data that also maintain strong references to the commit’s
parents. This means that commits can be cloned cheaply and dropped freely;
the memory of a commit will be released whenever no other commit in scope
depends on it.
Commits in a CommitStateSpace
DO NOT represent a valid history in the
general case: pairs of commits may be mutually exclusive if they modify the
same subgraph. Use Self::try_extract_hugr
to get a PersistentHugr
with a set of compatible commits.
Implementations§
Source§impl CommitStateSpace
impl CommitStateSpace
Sourcepub fn with_base(hugr: Hugr) -> Self
pub fn with_base(hugr: Hugr) -> Self
Create a new commit state space with a single base commit.
Sourcepub fn try_from_commits(
commits: impl IntoIterator<Item = Commit>,
) -> Result<Self, InvalidCommit>
pub fn try_from_commits( commits: impl IntoIterator<Item = Commit>, ) -> Result<Self, InvalidCommit>
Create a new commit state space from a set of commits.
Return a InvalidCommit::NonUniqueBase
error if the commits do
not share a unique common ancestor base commit.
Sourcepub fn try_add_replacement(
&mut self,
replacement: PersistentReplacement,
) -> Result<CommitId, InvalidCommit>
pub fn try_add_replacement( &mut self, replacement: PersistentReplacement, ) -> Result<CommitId, InvalidCommit>
Add a replacement commit to the graph.
Return an InvalidCommit::EmptyReplacement
error if the replacement
is empty.
Sourcepub fn extend(&mut self, commits: impl IntoIterator<Item = Commit>)
pub fn extend(&mut self, commits: impl IntoIterator<Item = Commit>)
Add a set of commits to the state space.
Commits must be valid replacement commits or coincide with the existing base commit.
Sourcepub fn try_add_commit(
&mut self,
commit: Commit,
) -> Result<CommitId, InvalidCommit>
pub fn try_add_commit( &mut self, commit: Commit, ) -> Result<CommitId, InvalidCommit>
Add a commit (and all its ancestors) to the state space.
Returns an InvalidCommit::NonUniqueBase
error if the commit is a
base commit and does not coincide with the existing base commit.
Sourcepub fn contains_id(&self, commit_id: CommitId) -> bool
pub fn contains_id(&self, commit_id: CommitId) -> bool
Check if commit_id
is in the commit state space.
Sourcepub fn try_extract_hugr(
&self,
commits: impl IntoIterator<Item = CommitId>,
) -> Result<PersistentHugr, InvalidCommit>
pub fn try_extract_hugr( &self, commits: impl IntoIterator<Item = CommitId>, ) -> Result<PersistentHugr, InvalidCommit>
Extract a PersistentHugr
from this state space, consisting of
commits
and their ancestors.
All commits in the resulting PersistentHugr
are guaranteed to be
compatible. If the selected commits would include two commits which
are incompatible, a InvalidCommit::IncompatibleHistory
error is
returned. If commits
is empty, a InvalidCommit::NonUniqueBase
error is returned.
Sourcepub fn base_commit(&self) -> &Commit
pub fn base_commit(&self) -> &Commit
Get the base commit.
Sourcepub fn get_commit(&self, commit_id: CommitId) -> &Commit
pub fn get_commit(&self, commit_id: CommitId) -> &Commit
Get the commit with ID commit_id
.
Sourcepub fn all_commit_ids(&self) -> impl Iterator<Item = CommitId> + Clone + '_
pub fn all_commit_ids(&self) -> impl Iterator<Item = CommitId> + Clone + '_
Get an iterator over all commit IDs in the state space.
Sourcepub fn inserted_nodes(
&self,
commit_id: CommitId,
) -> impl Iterator<Item = PatchNode> + '_
pub fn inserted_nodes( &self, commit_id: CommitId, ) -> impl Iterator<Item = PatchNode> + '_
Get an iterator over all nodes inserted by commit_id
.
All nodes will be PatchNodes with commit ID commit_id
.
Sourcepub fn invalidation_set(
&self,
commit_id: CommitId,
parent: CommitId,
) -> impl Iterator<Item = Node> + '_
pub fn invalidation_set( &self, commit_id: CommitId, parent: CommitId, ) -> impl Iterator<Item = Node> + '_
Get the set of nodes invalidated by commit_id
in parent
.
Sourcepub fn parents(
&self,
commit_id: CommitId,
) -> impl Iterator<Item = CommitId> + '_
pub fn parents( &self, commit_id: CommitId, ) -> impl Iterator<Item = CommitId> + '_
Get the parents of commit_id
Source§impl CommitStateSpace
impl CommitStateSpace
Sourcepub fn get_optype(&self, PatchNode: PatchNode) -> &OpType
pub fn get_optype(&self, PatchNode: PatchNode) -> &OpType
Get the type of the operation at node
.
Sourcepub fn num_ports(&self, PatchNode: PatchNode, dir: Direction) -> usize
pub fn num_ports(&self, PatchNode: PatchNode, dir: Direction) -> usize
Get the number of ports of node
in dir
.
Sourcepub fn node_outputs(
&self,
node: PatchNode,
) -> impl Iterator<Item = OutgoingPort> + Clone + '_
pub fn node_outputs( &self, node: PatchNode, ) -> impl Iterator<Item = OutgoingPort> + Clone + '_
Iterator over output ports of node.
Like CommitStateSpace::node_ports
(node, Direction::Outgoing)`
but preserves knowledge that the ports are OutgoingPorts.
Sourcepub fn node_inputs(
&self,
node: PatchNode,
) -> impl Iterator<Item = IncomingPort> + Clone + '_
pub fn node_inputs( &self, node: PatchNode, ) -> impl Iterator<Item = IncomingPort> + Clone + '_
Iterator over inputs ports of node.
Like CommitStateSpace::node_ports
(node, Direction::Incoming)`
but preserves knowledge that the ports are IncomingPorts.
Sourcepub fn node_ports(
&self,
PatchNode: PatchNode,
dir: Direction,
) -> impl Iterator<Item = Port> + Clone + '_
pub fn node_ports( &self, PatchNode: PatchNode, dir: Direction, ) -> impl Iterator<Item = Port> + Clone + '_
Get an iterator over the ports of node
in dir
.
Sourcepub fn all_node_ports(
&self,
PatchNode: PatchNode,
) -> impl Iterator<Item = Port> + Clone + '_
pub fn all_node_ports( &self, PatchNode: PatchNode, ) -> impl Iterator<Item = Port> + Clone + '_
Get an iterator over all ports of node
.
Sourcepub fn node_metadata_map(&self, PatchNode: PatchNode) -> &NodeMetadataMap
pub fn node_metadata_map(&self, PatchNode: PatchNode) -> &NodeMetadataMap
Get the metadata map of node
.
Trait Implementations§
Source§impl Clone for CommitStateSpace
impl Clone for CommitStateSpace
Source§fn clone(&self) -> CommitStateSpace
fn clone(&self) -> CommitStateSpace
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for CommitStateSpace
impl Debug for CommitStateSpace
Source§impl<'a> From<&'a CommitStateSpace> for Cow<'a, CommitStateSpace>
impl<'a> From<&'a CommitStateSpace> for Cow<'a, CommitStateSpace>
Source§fn from(value: &'a CommitStateSpace) -> Self
fn from(value: &'a CommitStateSpace) -> Self
Source§impl From<CommitStateSpace> for Cow<'_, CommitStateSpace>
impl From<CommitStateSpace> for Cow<'_, CommitStateSpace>
Source§fn from(value: CommitStateSpace) -> Self
fn from(value: CommitStateSpace) -> Self
Auto Trait Implementations§
impl Freeze for CommitStateSpace
impl !RefUnwindSafe for CommitStateSpace
impl !Send for CommitStateSpace
impl !Sync for CommitStateSpace
impl Unpin for CommitStateSpace
impl !UnwindSafe for CommitStateSpace
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
, which can then be
downcast
into Box<dyn ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
, which can then be further
downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§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 moreSource§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 moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§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.Source§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.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.