26 #include <unordered_map>
27 #include <unordered_set>
29 #include "antares/expressions/nodes/FunctionNode.h"
30 #include "antares/expressions/nodes/Node.h"
32 namespace Antares::IO::Inputs::ModelConverter
35 template<
typename NodeType>
36 std::type_index forbiddenNodeKey()
38 static_assert(!std::is_same_v<NodeType, Expressions::Nodes::FunctionNode>,
39 "Use Expressions::Nodes::FunctionNodeType enum values or "
40 "forbiddenNodeKey(Expressions::Nodes::FunctionNodeType) "
41 "instead of FunctionNode for forbidden rules.");
42 return std::type_index(
typeid(NodeType));
45 template<Expressions::Nodes::FunctionNodeType T>
46 std::type_index forbiddenNodeKey()
48 using Tag = std::integral_constant<Expressions::Nodes::FunctionNodeType, T>;
49 return std::type_index(
typeid(Tag));
52 inline std::type_index forbiddenNodeKey(
const Expressions::Nodes::FunctionNodeType& funcType)
56 using NT = Expressions::Nodes::FunctionNodeType;
58 return forbiddenNodeKey<NT::max>();
60 return forbiddenNodeKey<NT::min>();
62 return forbiddenNodeKey<NT::pow>();
64 return forbiddenNodeKey<NT::dual>();
65 case NT::reduced_cost:
66 return forbiddenNodeKey<NT::reduced_cost>();
68 throw std::runtime_error(
"ForbiddenNodeKey is not implemented");
72 inline std::type_index forbiddenNodeKey(
const Expressions::Nodes::Node& node)
74 if (
auto* funcNode =
dynamic_cast<const Expressions::Nodes::FunctionNode*
>(&node))
76 return forbiddenNodeKey(funcNode->type());
78 return {
typeid(node)};
86 template<
typename... NodeType>
87 void addGlobalForbidden()
89 (global_.insert(forbiddenNodeKey<NodeType>()), ...);
92 template<Expressions::Nodes::FunctionNodeType... NodeType>
93 void addGlobalForbidden()
95 (global_.insert(forbiddenNodeKey<NodeType>()), ...);
99 template<Expressions::Nodes::FunctionNodeType Parent,
typename Child>
100 requires(!std::is_same_v<Child, Expressions::Nodes::FunctionNodeType>)
101 void addForbiddenFor()
103 rules_[forbiddenNodeKey<Parent>()].insert(forbiddenNodeKey<Child>());
106 template<Expressions::Nodes::FunctionNodeType Parent,
107 Expressions::Nodes::FunctionNodeType Child>
108 void addForbiddenFor()
110 rules_[forbiddenNodeKey<Parent>()].insert(forbiddenNodeKey<Child>());
113 template<
typename Parent, Expressions::Nodes::FunctionNodeType Child>
114 void addForbiddenFor()
116 rules_[forbiddenNodeKey<Parent>()].insert(forbiddenNodeKey<Child>());
120 template<
typename Parent, Expressions::Nodes::FunctionNodeType Child>
121 [[nodiscard]]
bool isForbiddenFor()
const
123 return check(forbiddenNodeKey<Parent>(), forbiddenNodeKey<Child>());
126 template<
typename Parent,
typename Child>
127 [[nodiscard]]
bool isForbiddenFor()
const
129 return check(forbiddenNodeKey<Parent>(), forbiddenNodeKey<Child>());
134 template<Expressions::Nodes::FunctionNodeType Child>
135 [[nodiscard]]
bool isForbiddenFor(
const std::type_index& parentKey)
const
137 return check(parentKey, forbiddenNodeKey<Child>());
140 template<
typename Child>
141 [[nodiscard]]
bool isForbiddenFor(
const std::type_index& parentKey)
const
143 return check(parentKey, forbiddenNodeKey<Child>());
148 template<
typename NodeType>
149 [[nodiscard]]
bool isForbidden()
const
151 return global_.contains(forbiddenNodeKey<NodeType>());
154 template<Expressions::Nodes::FunctionNodeType NodeType>
155 [[nodiscard]]
bool isForbidden()
const
157 return global_.contains(forbiddenNodeKey<NodeType>());
161 std::unordered_set<std::type_index> global_;
162 std::unordered_map<std::type_index ,
163 std::unordered_set<std::type_index> >
166 [[nodiscard]]
bool check(
const std::type_index& parentKey,
167 const std::type_index& childKey)
const
170 if (global_.contains(childKey))
176 const auto& it = rules_.find(parentKey);
177 if (it == rules_.end())
182 return it->second.contains(childKey);