Skip to content

Commit

Permalink
Use RPITIT for Successors and Predecessors traits
Browse files Browse the repository at this point in the history
Now with RPITIT instead of GAT!
  • Loading branch information
WaffleLapkin committed Apr 15, 2024
1 parent e8d2221 commit 435db9b
Show file tree
Hide file tree
Showing 8 changed files with 14 additions and 46 deletions.
4 changes: 1 addition & 3 deletions compiler/rustc_borrowck/src/constraints/graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -223,9 +223,7 @@ impl<'s, 'tcx, D: ConstraintGraphDirection> graph::DirectedGraph for RegionGraph
}

impl<'s, 'tcx, D: ConstraintGraphDirection> graph::Successors for RegionGraph<'s, 'tcx, D> {
type Successors<'g> = Successors<'s, 'tcx, D> where Self: 'g;

fn successors(&self, node: Self::Node) -> Self::Successors<'_> {
fn successors(&self, node: Self::Node) -> impl Iterator<Item = Self::Node> {
self.outgoing_regions(node)
}
}
12 changes: 2 additions & 10 deletions compiler/rustc_data_structures/src/graph/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,11 @@ pub trait StartNode: DirectedGraph {
}

pub trait Successors: DirectedGraph {
type Successors<'g>: Iterator<Item = Self::Node>
where
Self: 'g;

fn successors(&self, node: Self::Node) -> Self::Successors<'_>;
fn successors(&self, node: Self::Node) -> impl Iterator<Item = Self::Node>;
}

pub trait Predecessors: DirectedGraph {
type Predecessors<'g>: Iterator<Item = Self::Node>
where
Self: 'g;

fn predecessors(&self, node: Self::Node) -> Self::Predecessors<'_>;
fn predecessors(&self, node: Self::Node) -> impl Iterator<Item = Self::Node>;
}

/// Alias for [`DirectedGraph`] + [`StartNode`] + [`Predecessors`] + [`Successors`].
Expand Down
8 changes: 2 additions & 6 deletions compiler/rustc_data_structures/src/graph/reference.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,13 @@ impl<'graph, G: StartNode> StartNode for &'graph G {
}

impl<'graph, G: Successors> Successors for &'graph G {
type Successors<'g> = G::Successors<'g> where 'graph: 'g;

fn successors(&self, node: Self::Node) -> Self::Successors<'_> {
fn successors(&self, node: Self::Node) -> impl Iterator<Item = Self::Node> {
(**self).successors(node)
}
}

impl<'graph, G: Predecessors> Predecessors for &'graph G {
type Predecessors<'g> = G::Predecessors<'g> where 'graph: 'g;

fn predecessors(&self, node: Self::Node) -> Self::Predecessors<'_> {
fn predecessors(&self, node: Self::Node) -> impl Iterator<Item = Self::Node> {
(**self).predecessors(node)
}
}
4 changes: 1 addition & 3 deletions compiler/rustc_data_structures/src/graph/scc/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,7 @@ impl<N: Idx, S: Idx + Ord> NumEdges for Sccs<N, S> {
}

impl<N: Idx, S: Idx + Ord> Successors for Sccs<N, S> {
type Successors<'g> = std::iter::Cloned<std::slice::Iter<'g, S>>;

fn successors(&self, node: S) -> Self::Successors<'_> {
fn successors(&self, node: S) -> impl Iterator<Item = Self::Node> {
self.successors(node).iter().cloned()
}
}
Expand Down
10 changes: 2 additions & 8 deletions compiler/rustc_data_structures/src/graph/tests.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
use crate::fx::FxHashMap;
use std::cmp::max;
use std::iter;
use std::slice;

use super::*;

Expand Down Expand Up @@ -49,17 +47,13 @@ impl StartNode for TestGraph {
}

impl Predecessors for TestGraph {
type Predecessors<'g> = iter::Cloned<slice::Iter<'g, usize>>;

fn predecessors(&self, node: usize) -> Self::Predecessors<'_> {
fn predecessors(&self, node: usize) -> impl Iterator<Item = Self::Node> {
self.predecessors[&node].iter().cloned()
}
}

impl Successors for TestGraph {
type Successors<'g> = iter::Cloned<slice::Iter<'g, usize>>;

fn successors(&self, node: usize) -> Self::Successors<'_> {
fn successors(&self, node: usize) -> impl Iterator<Item = Self::Node> {
self.successors[&node].iter().cloned()
}
}
4 changes: 1 addition & 3 deletions compiler/rustc_data_structures/src/graph/vec_graph/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,7 @@ impl<N: Idx> NumEdges for VecGraph<N> {
}

impl<N: Idx + Ord> Successors for VecGraph<N> {
type Successors<'g> = std::iter::Cloned<std::slice::Iter<'g, N>>;

fn successors(&self, node: N) -> Self::Successors<'_> {
fn successors(&self, node: N) -> impl Iterator<Item = Self::Node> {
self.successors(node).iter().cloned()
}
}
10 changes: 3 additions & 7 deletions compiler/rustc_middle/src/mir/basic_blocks.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::mir::traversal::Postorder;
use crate::mir::{BasicBlock, BasicBlockData, Successors, Terminator, TerminatorKind, START_BLOCK};
use crate::mir::{BasicBlock, BasicBlockData, Terminator, TerminatorKind, START_BLOCK};

use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::graph;
Expand Down Expand Up @@ -156,19 +156,15 @@ impl<'tcx> graph::StartNode for BasicBlocks<'tcx> {
}

impl<'tcx> graph::Successors for BasicBlocks<'tcx> {
type Successors<'b> = Successors<'b> where 'tcx: 'b;

#[inline]
fn successors(&self, node: Self::Node) -> Self::Successors<'_> {
fn successors(&self, node: Self::Node) -> impl Iterator<Item = Self::Node> {
self.basic_blocks[node].terminator().successors()
}
}

impl<'tcx> graph::Predecessors for BasicBlocks<'tcx> {
type Predecessors<'b> = std::iter::Copied<std::slice::Iter<'b, BasicBlock>> where 'tcx: 'b;

#[inline]
fn predecessors(&self, node: Self::Node) -> Self::Predecessors<'_> {
fn predecessors(&self, node: Self::Node) -> impl Iterator<Item = Self::Node> {
self.predecessors()[node].iter().copied()
}
}
Expand Down
8 changes: 2 additions & 6 deletions compiler/rustc_mir_transform/src/coverage/graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,19 +209,15 @@ impl graph::StartNode for CoverageGraph {
}

impl graph::Successors for CoverageGraph {
type Successors<'g> = std::iter::Cloned<std::slice::Iter<'g, BasicCoverageBlock>>;

#[inline]
fn successors(&self, node: Self::Node) -> Self::Successors<'_> {
fn successors(&self, node: Self::Node) -> impl Iterator<Item = Self::Node> {
self.successors[node].iter().cloned()
}
}

impl graph::Predecessors for CoverageGraph {
type Predecessors<'g> = std::iter::Copied<std::slice::Iter<'g, BasicCoverageBlock>>;

#[inline]
fn predecessors(&self, node: Self::Node) -> Self::Predecessors<'_> {
fn predecessors(&self, node: Self::Node) -> impl Iterator<Item = Self::Node> {
self.predecessors[node].iter().copied()
}
}
Expand Down

0 comments on commit 435db9b

Please sign in to comment.