3#include <tess/path/request.h>
4#include <tess/topology/topology.h>
16enum class PrecheckStatus : std::uint8_t {
42[[nodiscard]]
constexpr bool precheck_rules_out_path(
43 PrecheckStatus status)
noexcept {
44 return status == PrecheckStatus::Unreachable;
93template <
typename ClassOrTag,
typename World,
typename Prov
ider>
94[[nodiscard]]
auto precheck_path(
97 MissingChunkPolicy missing_chunk_policy,
const Provider& provider)
99 if (graph.local_topologies().empty()) {
100 return PrecheckStatus::NoGraph;
102 if (!is_region_graph_fresh_for<ClassOrTag>(world, graph) ||
103 !graph.matches_provider(provider)) {
104 return PrecheckStatus::GraphStale;
107 reachable<typename World::shape_type>(graph, request, scratch);
108 switch (result.status) {
109 case ReachabilityStatus::Reachable:
110 return PrecheckStatus::Reachable;
111 case ReachabilityStatus::Unreachable:
112 return PrecheckStatus::Unreachable;
113 case ReachabilityStatus::Indeterminate:
114 if (missing_chunk_policy == MissingChunkPolicy::ReportIndeterminate) {
115 return PrecheckStatus::MissingChunk;
117 if constexpr (!std::is_same_v<
typename World::residency_type,
119 using Shape =
typename World::shape_type;
120 if (contains<Shape>(request.start) &&
121 world.try_chunk(chunk_key<Shape>(
122 chunk_coord<Shape>(request.start))) ==
nullptr) {
123 return PrecheckStatus::InvalidStart;
125 if (contains<Shape>(request.goal) &&
126 world.try_chunk(chunk_key<Shape>(
127 chunk_coord<Shape>(request.goal))) ==
nullptr) {
128 return PrecheckStatus::InvalidGoal;
131 return PrecheckStatus::Unreachable;
132 case ReachabilityStatus::InvalidStart:
133 return PrecheckStatus::InvalidStart;
134 case ReachabilityStatus::InvalidGoal:
135 return PrecheckStatus::InvalidGoal;
137 return PrecheckStatus::NoGraph;
145template <
typename ClassOrTag,
typename World>
146[[nodiscard]]
auto precheck_path(
149 MissingChunkPolicy missing_chunk_policy =
150 MissingChunkPolicy::ReportIndeterminate) -> PrecheckStatus {
151 return precheck_path<ClassOrTag>(graph, world, request, scratch,
Reusable frontier and visitation storage for graph reachability queries.
Definition topology.h:198
Region graph storage specialized by dense or sparse residency policy.
Definition topology.h:382
Supplies no special transitions beyond ordinary face adjacency.
Definition transition_provider.h:132
Specifies inclusive start and goal coordinates for a path query.
Definition request.h:10