85 throw ChimeraTK::logic_error(
"UserInputValidator was finalised without any call to add()");
98 std::deque<Model::ApplicationModuleProxy> stack;
99 std::map<ApplicationModule*, int> distances;
103 auto orderVisitor = [&](
auto proxy) {
105 stack.push_front(proxy);
106 distances.try_emplace(&proxy.getApplicationModule(), std::numeric_limits<int>::min());
115 Model::keepPvAccesWithReturnChannel, Model::keepApplicationModules);
120 std::unordered_set<ApplicationModule*> downstreamModulesWithFeedback;
122 auto downstreamModuleCollector = [&](
auto proxy) {
124 downstreamModulesWithFeedback.insert(&proxy.getApplicationModule());
128 auto connectingVariableVisitor = [&](
auto proxy) {
130 proxy.visit(downstreamModuleCollector, Model::adjacentOutSearch, Model::keepPvAccesWithReturnChannel,
131 Model::keepProcessVariables);
135 for(
const auto& stackEntry : stack) {
136 downstreamModulesWithFeedback.clear();
142 stackEntry.visit(connectingVariableVisitor, Model::adjacentOutSearch, Model::keepApplicationModules,
143 Model::keepPvAccesWithReturnChannel);
148 for(
auto* vtx : downstreamModulesWithFeedback) {
149 distances[vtx] = std::max(distances[vtx], distances[&stackEntry.getApplicationModule()] + 1);
153 _validationDepth = 1 + std::max_element(distances.begin(), distances.end(), [](
auto& a,
auto& b) ->
bool {
154 return a.second < b.second;