Blender V5.0
BKE_node_socket_value.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
8
9#pragma once
10
11#include "DNA_node_types.h"
12
13#include "BLI_any.hh"
15
17
18namespace blender::bke {
19
35 private:
44 enum class Kind {
48 None,
52 Single,
56 Field,
60 Grid,
62 List,
63 };
64
68 Kind kind_ = Kind::None;
73 eNodeSocketDatatype socket_type_;
81 Any<void, 24> value_;
82
83 public:
87 SocketValueVariant() = default;
88 SocketValueVariant(const SocketValueVariant &other) = default;
93
98 template<typename T,
99 /* The enable-if is necessary to avoid overriding the copy/moveconstructors. */
100 BLI_ENABLE_IF((std::is_trivial_v<std::decay_t<T>> ||
101 is_same_any_v<std::decay_t<T>, std::string>))>
102 explicit SocketValueVariant(T &&value)
103 {
104 this->set(std::forward<T>(value));
105 }
106
108 template<typename T> static SocketValueVariant &ConstructIn(void *ptr, T &&value);
109
111 template<typename T> static SocketValueVariant From(T &&value);
112
117 bool valid_for_socket(eNodeSocketDatatype socket_type) const;
118
127 template<typename T> T extract();
128
133 template<typename T> T get() const;
134
138 template<typename T> void set(T &&value);
139
143 bool is_context_dependent_field() const;
144
148 bool is_volume_grid() const;
149
153 bool is_single() const;
154
158 bool is_list() const;
159
167 void convert_to_single();
168
173 GPointer get_single_ptr() const;
175
181 const void *get_single_ptr_raw() const;
182
186 void store_single(eNodeSocketDatatype socket_type, const void *value);
187
192 void *allocate_single(eNodeSocketDatatype socket_type);
193
194 friend std::ostream &operator<<(std::ostream &stream, const SocketValueVariant &value_variant);
195
196 private:
201 template<typename T> void store_impl(T value);
202};
203
204template<typename T>
206{
207 SocketValueVariant *value_variant = new (ptr) SocketValueVariant();
208 value_variant->set(std::forward<T>(value));
209 return *value_variant;
210}
211
212template<typename T> inline SocketValueVariant SocketValueVariant::From(T &&value)
213{
214 SocketValueVariant value_variant;
215 value_variant.set(std::forward<T>(value));
216 return value_variant;
217}
218
219template<typename T> inline void SocketValueVariant::set(T &&value)
220{
222 this->store_impl<std::decay_t<T>>(std::forward<T>(value));
223}
224
226{
227 BLI_assert(kind_ == Kind::Single);
228 return value_.get();
229}
230
231} // namespace blender::bke
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_ENABLE_IF(condition)
eNodeSocketDatatype
static SocketValueVariant & ConstructIn(void *ptr, T &&value)
bool valid_for_socket(eNodeSocketDatatype socket_type) const
SocketValueVariant & operator=(const SocketValueVariant &other)=default
friend std::ostream & operator<<(std::ostream &stream, const SocketValueVariant &value_variant)
SocketValueVariant(const SocketValueVariant &other)=default
static SocketValueVariant From(T &&value)
void store_single(eNodeSocketDatatype socket_type, const void *value)
SocketValueVariant & operator=(SocketValueVariant &&other)=default
void * allocate_single(eNodeSocketDatatype socket_type)
SocketValueVariant(SocketValueVariant &&other)=default
#define T
constexpr bool is_same_any_v
PointerRNA * ptr
Definition wm_files.cc:4238