Blender V4.3
FN_multi_function_signature.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
15
16#include "BLI_vector.hh"
17
19
20enum class ParamFlag {
21 None = 0,
27 SupportsUnusedOutput = 1 << 0,
28};
30
48
50 private:
51 Signature &signature_;
52
53 public:
54 SignatureBuilder(const char *function_name, Signature &signature_to_build);
55
56 /* Input Parameter Types */
57
58 template<typename T> void single_input(const char *name);
59 void single_input(const char *name, const CPPType &type);
60 template<typename T> void vector_input(const char *name);
61 void vector_input(const char *name, const CPPType &base_type);
62 void input(const char *name, DataType data_type);
63
64 /* Output Parameter Types */
65
66 template<typename T>
67 void single_output(const char *name, const ParamFlag flag = ParamFlag::None);
68 void single_output(const char *name,
69 const CPPType &type,
71 template<typename T>
72 void vector_output(const char *name, const ParamFlag flag = ParamFlag::None);
73 void vector_output(const char *name,
74 const CPPType &base_type,
76 void output(const char *name, DataType data_type, const ParamFlag flag = ParamFlag::None);
77
78 /* Mutable Parameter Types */
79
80 template<typename T> void single_mutable(const char *name);
81 void single_mutable(const char *name, const CPPType &type);
82 template<typename T> void vector_mutable(const char *name);
83 void vector_mutable(const char *name, const CPPType &base_type);
84 void mutable_(const char *name, DataType data_type);
85
86 template<ParamCategory Category, typename T>
87 void add(ParamTag<Category, T> /*tag*/, const char *name);
88 void add(const char *name, const ParamType &param_type);
89};
90
91/* -------------------------------------------------------------------- */
95inline SignatureBuilder::SignatureBuilder(const char *function_name, Signature &signature_to_build)
96 : signature_(signature_to_build)
97{
98 signature_.function_name = function_name;
99}
100
101template<typename T> inline void SignatureBuilder::single_input(const char *name)
102{
103 this->single_input(name, CPPType::get<T>());
104}
105
106inline void SignatureBuilder::single_input(const char *name, const CPPType &type)
107{
108 this->input(name, DataType::ForSingle(type));
109}
110
111template<typename T> inline void SignatureBuilder::vector_input(const char *name)
112{
113 this->vector_input(name, CPPType::get<T>());
114}
115
116inline void SignatureBuilder::vector_input(const char *name, const CPPType &base_type)
117{
118 this->input(name, DataType::ForVector(base_type));
119}
120
121inline void SignatureBuilder::input(const char *name, DataType data_type)
122{
123 signature_.params.append({ParamType(ParamType::Input, data_type), name});
124}
125
126template<typename T>
127inline void SignatureBuilder::single_output(const char *name, const ParamFlag flag)
128{
129 this->single_output(name, CPPType::get<T>(), flag);
130}
131
132inline void SignatureBuilder::single_output(const char *name,
133 const CPPType &type,
134 const ParamFlag flag)
135{
136 this->output(name, DataType::ForSingle(type), flag);
137}
138
139template<typename T>
140inline void SignatureBuilder::vector_output(const char *name, const ParamFlag flag)
141{
142 this->vector_output(name, CPPType::get<T>(), flag);
143}
144
145inline void SignatureBuilder::vector_output(const char *name,
146 const CPPType &base_type,
147 const ParamFlag flag)
148{
149 this->output(name, DataType::ForVector(base_type), flag);
150}
151
152inline void SignatureBuilder::output(const char *name, DataType data_type, const ParamFlag flag)
153{
154 signature_.params.append({ParamType(ParamType::Output, data_type), name, flag});
155}
156
157template<typename T> inline void SignatureBuilder::single_mutable(const char *name)
158{
159 this->single_mutable(name, CPPType::get<T>());
160}
161
162inline void SignatureBuilder::single_mutable(const char *name, const CPPType &type)
163{
164 this->mutable_(name, DataType::ForSingle(type));
165}
166
167template<typename T> inline void SignatureBuilder::vector_mutable(const char *name)
168{
169 this->vector_mutable(name, CPPType::get<T>());
170}
171
172inline void SignatureBuilder::vector_mutable(const char *name, const CPPType &base_type)
173{
174 this->mutable_(name, DataType::ForVector(base_type));
175}
176
177inline void SignatureBuilder::mutable_(const char *name, DataType data_type)
178{
179 signature_.params.append({ParamType(ParamType::Mutable, data_type), name});
180}
181
182inline void SignatureBuilder::add(const char *name, const ParamType &param_type)
183{
184 switch (param_type.interface_type()) {
185 case ParamType::Input:
186 this->input(name, param_type.data_type());
187 break;
189 this->mutable_(name, param_type.data_type());
190 break;
192 this->output(name, param_type.data_type());
193 break;
194 }
195}
196
197template<ParamCategory Category, typename T>
198inline void SignatureBuilder::add(ParamTag<Category, T> /*tag*/, const char *name)
199{
200 switch (Category) {
202 this->single_input<T>(name);
203 return;
205 this->vector_input<T>(name);
206 return;
208 this->single_output<T>(name);
209 return;
211 this->vector_output<T>(name);
212 return;
214 this->single_mutable<T>(name);
215 return;
217 this->vector_mutable<T>(name);
218 return;
219 }
221}
222
225} // namespace blender::fn::multi_function
#define BLI_assert_unreachable()
Definition BLI_assert.h:97
#define ENUM_OPERATORS(_type, _max)
#define output
static const CPPType & get()
void input(const char *name, DataType data_type)
void add(ParamTag< Category, T >, const char *name)
SignatureBuilder(const char *function_name, Signature &signature_to_build)
void vector_output(const char *name, const ParamFlag flag=ParamFlag::None)
void mutable_(const char *name, DataType data_type)
void output(const char *name, DataType data_type, const ParamFlag flag=ParamFlag::None)
void single_output(const char *name, const ParamFlag flag=ParamFlag::None)
uint8_t flag
Definition wm_window.cc:138