Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make const references to ForeverStack more useful #3211

Merged
merged 1 commit into from
Oct 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion gcc/rust/resolve/rust-forever-stack.h
Original file line number Diff line number Diff line change
Expand Up @@ -513,10 +513,11 @@ template <Namespace N> class ForeverStack
tl::optional<Rib::Definition> resolve_path (const std::vector<S> &segments);

// FIXME: Documentation
tl::optional<Resolver::CanonicalPath> to_canonical_path (NodeId id);
tl::optional<Resolver::CanonicalPath> to_canonical_path (NodeId id) const;

// FIXME: Documentation
tl::optional<Rib &> to_rib (NodeId rib_id);
tl::optional<const Rib &> to_rib (NodeId rib_id) const;

std::string as_debug_string ();

Expand Down Expand Up @@ -579,9 +580,12 @@ template <Namespace N> class ForeverStack

/* Reverse iterate on `Node`s from the cursor, in an outwards fashion */
void reverse_iter (std::function<KeepGoing (Node &)> lambda);
void reverse_iter (std::function<KeepGoing (const Node &)> lambda) const;

/* Reverse iterate on `Node`s from a specified one, in an outwards fashion */
void reverse_iter (Node &start, std::function<KeepGoing (Node &)> lambda);
void reverse_iter (const Node &start,
std::function<KeepGoing (const Node &)> lambda) const;

Node &cursor ();
const Node &cursor () const;
Expand Down Expand Up @@ -617,11 +621,20 @@ template <Namespace N> class ForeverStack
Node &first;
std::string second;
};
struct ConstDfsResult
{
const Node &first;
std::string second;
};

// FIXME: Documentation
tl::optional<DfsResult> dfs (Node &starting_point, NodeId to_find);
tl::optional<ConstDfsResult> dfs (const Node &starting_point,
NodeId to_find) const;
// FIXME: Documentation
tl::optional<Rib &> dfs_rib (Node &starting_point, NodeId to_find);
tl::optional<const Rib &> dfs_rib (const Node &starting_point,
NodeId to_find) const;
};

} // namespace Resolver2_0
Expand Down
91 changes: 88 additions & 3 deletions gcc/rust/resolve/rust-forever-stack.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,14 @@ ForeverStack<N>::reverse_iter (std::function<KeepGoing (Node &)> lambda)
return reverse_iter (cursor (), lambda);
}

template <Namespace N>
void
ForeverStack<N>::reverse_iter (
std::function<KeepGoing (const Node &)> lambda) const
{
return reverse_iter (cursor (), lambda);
}

template <Namespace N>
void
ForeverStack<N>::reverse_iter (Node &start,
Expand All @@ -212,6 +220,26 @@ ForeverStack<N>::reverse_iter (Node &start,
}
}

template <Namespace N>
void
ForeverStack<N>::reverse_iter (
const Node &start, std::function<KeepGoing (const Node &)> lambda) const
{
auto *tmp = &start;

while (true)
{
auto keep_going = lambda (*tmp);
if (keep_going == KeepGoing::No)
return;

if (tmp->is_root ())
return;

tmp = &tmp->parent.value ();
}
}

template <Namespace N>
typename ForeverStack<N>::Node &
ForeverStack<N>::cursor ()
Expand Down Expand Up @@ -507,22 +535,53 @@ ForeverStack<N>::dfs (ForeverStack<N>::Node &starting_point, NodeId to_find)
return tl::nullopt;
}

template <Namespace N>
tl::optional<typename ForeverStack<N>::ConstDfsResult>
ForeverStack<N>::dfs (const ForeverStack<N>::Node &starting_point,
NodeId to_find) const
{
auto values = starting_point.rib.get_values ();

for (auto &kv : values)
{
for (auto id : kv.second.ids_shadowable)
if (id == to_find)
return {{starting_point, kv.first}};
for (auto id : kv.second.ids_non_shadowable)
if (id == to_find)
return {{starting_point, kv.first}};
for (auto id : kv.second.ids_globbed)
if (id == to_find)
return {{starting_point, kv.first}};
}

for (auto &child : starting_point.children)
{
auto candidate = dfs (child.second, to_find);

if (candidate.has_value ())
return candidate;
}

return tl::nullopt;
}

template <Namespace N>
tl::optional<Resolver::CanonicalPath>
ForeverStack<N>::to_canonical_path (NodeId id)
ForeverStack<N>::to_canonical_path (NodeId id) const
{
// find the id in the current forever stack, starting from the root,
// performing either a BFS or DFS once the Node containing the ID is found, go
// back up to the root (parent().parent().parent()...) accumulate link
// segments reverse them that's your canonical path

return dfs (root, id).map ([this, id] (DfsResult tuple) {
return dfs (root, id).map ([this, id] (ConstDfsResult tuple) {
auto containing_node = tuple.first;
auto name = tuple.second;

auto segments = std::vector<Resolver::CanonicalPath> ();

reverse_iter (containing_node, [&segments] (Node &current) {
reverse_iter (containing_node, [&segments] (const Node &current) {
if (current.is_root ())
return KeepGoing::No;

Expand Down Expand Up @@ -581,13 +640,39 @@ ForeverStack<N>::dfs_rib (ForeverStack<N>::Node &starting_point, NodeId to_find)
return tl::nullopt;
}

template <Namespace N>
tl::optional<const Rib &>
ForeverStack<N>::dfs_rib (const ForeverStack<N>::Node &starting_point,
NodeId to_find) const
{
if (starting_point.id == to_find)
return starting_point.rib;

for (auto &child : starting_point.children)
{
auto candidate = dfs_rib (child.second, to_find);

if (candidate.has_value ())
return candidate;
}

return tl::nullopt;
}

template <Namespace N>
tl::optional<Rib &>
ForeverStack<N>::to_rib (NodeId rib_id)
{
return dfs_rib (root, rib_id);
}

template <Namespace N>
tl::optional<const Rib &>
ForeverStack<N>::to_rib (NodeId rib_id) const
{
return dfs_rib (root, rib_id);
}

template <Namespace N>
void
ForeverStack<N>::stream_rib (std::stringstream &stream, const Rib &rib,
Expand Down
Loading