Antares Simulator
Power System Simulator
VariadicNodeFunctionVisit.h
1 /*
2 ** Copyright 2007-2025, RTE (https://www.rte-france.com)
3 ** See AUTHORS.txt
4 ** SPDX-License-Identifier: MPL-2.0
5 ** This file is part of Antares-Simulator,
6 ** Adequacy and Performance assessment for interconnected energy networks.
7 **
8 ** Antares_Simulator is free software: you can redistribute it and/or modify
9 ** it under the terms of the Mozilla Public Licence 2.0 as published by
10 ** the Mozilla Foundation, either version 2 of the License, or
11 ** (at your option) any later version.
12 **
13 ** Antares_Simulator is distributed in the hope that it will be useful,
14 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ** Mozilla Public Licence 2.0 for more details.
17 **
18 ** You should have received a copy of the Mozilla Public Licence 2.0
19 ** along with Antares_Simulator. If not, see <https://opensource.org/license/mpl-2-0/>.
20 */
21 #pragma once
22 
23 #include <antares/expressions/nodes/FunctionNode.h>
24 #include <antares/expressions/visitors/NodeVisitor.h>
25 
26 namespace Antares::Expressions::Visitors
27 {
28 
29 template<typename T>
30 concept HasSizeMethod = requires(const T& t) {
31  { t.size() } -> std::convertible_to<std::size_t>;
32 };
33 
34 template<HasSizeMethod T>
35 std::size_t getMaxSize(const std::vector<T>& elements)
36 {
37  std::size_t maxSize = 0;
38  for (const auto& element: elements)
39  {
40  maxSize = std::max(maxSize, element.size());
41  }
42  return maxSize;
43 }
44 
45 template<class R>
46 std::vector<R> variadicFunction(NodeVisitor<R>& visitor, const Nodes::FunctionNode* node)
47 {
48  const auto& operands = node->getOperands();
49  std::vector<R> result;
50  result.reserve(operands.size());
51  for (const auto* operand: operands)
52  {
53  result.push_back(visitor.dispatch(operand));
54  }
55  return result;
56 }
57 } // namespace Antares::Expressions::Visitors