41 if (!layout.
valid()) {
59 topology.
nLayers =
static_cast<uint16_t
>(layout.
size());
60 for (uint16_t position = 0; position < layout.
size(); ++position) {
61 if (!disabledLayers.has(position)) {
74 const auto componentOf = [componentOffsets](uint16_t position) {
75 return componentForPosition(componentOffsets, position);
78 for (uint16_t fromPosition = 0; fromPosition + 1 < layout.
size(); ++fromPosition) {
82 for (uint16_t toPosition = fromPosition + 1; toPosition < layout.
size(); ++toPosition) {
84 componentOf(fromPosition) != componentOf(toPosition)) {
87 const auto skipped = skippedBetween(fromPosition, toPosition) & topology.
seedingLayers;
88 if (skipped.count() > parameters.
MaxHoles || !skipped.isSubsetOf(holeLayers)) {
100 for (uint32_t second = 0; second < topology.
edges.size(); ++second) {
101 const auto& firstEdge = topology.
edges[
first];
102 const auto& secondEdge = topology.
edges[second];
103 if (firstEdge.to != secondEdge.from || firstEdge.from == secondEdge.to) {
106 const auto skipped = (skippedBetween(firstEdge.from.value(), firstEdge.to.value()) |
107 skippedBetween(secondEdge.from.value(), secondEdge.to.value())) &
109 if (skipped.count() > parameters.
MaxHoles || !skipped.isSubsetOf(holeLayers)) {
121 for (
const auto&
path : topology.
paths) {
138 const auto lhsTarget = topology.
edges[topology.
paths[lhs.value()].second.value()].to;
139 const auto rhsTarget = topology.
edges[topology.
paths[rhs.value()].second.value()].to;
140 return lhsTarget != rhsTarget ? lhsTarget < rhsTarget : lhs < rhs;
147 if (roadStartLayers.has(
target.value())) {
152 uint16_t previousComponent = std::numeric_limits<uint16_t>::max();
156 const auto component = componentOf(
target.value());
157 if (component != previousComponent &&
index != 0) {
160 previousComponent = component;
164 result.topology.emplace(std::move(topology));