55 const std::array<T, Num> value = {};
58 static std::array<T, Num> init_value(
const std::vector<T>& values) {
59 std::array<T, Num> temp;
60 std::copy_n(values.begin(), std::min(Num, values.size()), temp.begin());
65 static std::array<T, Num> init_value(
const T* values,
const size_t size) {
66 if (values ==
nullptr) {
return std::array<T, Num>(); }
68 std::array<T, Num> temp;
69 std::copy_n(values, std::min(Num, size), temp.begin());
74 static std::array<T, Num> init_value(
const T (&values)[Num]) {
75 std::array<T, Num> temp;
76 std::copy_n(values, Num, temp.begin());
82 static std::array<T, Num> init_value(
const std::span<
const T> values) {
83 std::array<T, Num> temp;
84 std::copy_n(values.begin(), std::min(Num, values.size()), temp.begin());
91 template<
class Type = T,
92 std::enable_if_t<std::is_default_constructible_v<Type> && std::is_same_v<Type, T>,
bool> =
true>
98 explicit array_value(
const std::vector<T>& values) : value(init_value(values)) {}
101 explicit array_value(
const std::array<T, Num>& values) : value(values) {}
104 explicit array_value(
const T* values,
const size_t size) : value(init_value(values, size)) {}
107 explicit array_value(
const T (&values)[Num]) : value(init_value(values)) {}
111 explicit array_value(
const std::span<
const T> values) : value(init_value(values)) {}
122 struct struct_array_value :
public array_value<std::vector<std::byte>, Num> {
125 using value_type = std::vector<std::byte>;
127 using array_type = array_value<value_type, Num>;
133 const layout_type layout;
136 explicit struct_array_value(
const layout_type& layout) : array_type(), layout(layout) {}
139 struct_array_value(
const layout_type& layout,
const std::vector<value_type>& values)
140 : array_type(values), layout(layout) {}
143 struct_array_value(
const layout_type& layout,
const std::array<value_type, Num>& values)
144 : array_type(values), layout(layout) {}
147 struct_array_value(
const layout_type& layout,
const value_type* values, size_t size)
148 : array_type(values, size), layout(layout) {}
151 struct_array_value(
const layout_type& layout,
const value_type (&values)[Num]) : array_type(values), layout(layout) {}
155 struct_array_value(
const layout_type& layout,
const std::span<
const value_type> values)
156 : array_type(values), layout(layout) {}
170 template<
class T, size_t Num, std::enable_if_t<utils::is_glsl_simple_or_struct_v<T>,
bool> >
173 :
public std::conditional_t<mstd::is_eq_v<Num, 0>, utils::single_value<T>,
174 std::conditional_t<utils::is_glsl_simple_v<T>, utils::array_value<T, Num>, utils::struct_array_value<T, Num> > > {
177 using base_struct = std::conditional_t<mstd::is_eq_v<Num, 0>, utils::single_value<T>,
178 std::conditional_t<utils::is_glsl_simple_v<T>, utils::array_value<T, Num>, utils::struct_array_value<T, Num> > >;
182 using value_type = T;
190 #pragma region VARIABLES
192 const std::string varName;
195 #pragma region DEFAULT_CONSTRUCTOR
198 template<
class Type = value_type,
199 std::enable_if_t<(utils::is_glsl_simple_v<Type> && std::is_default_constructible_v<base_struct> &&
200 std::is_same_v<Type, value_type>),
204 : base_struct(), varName(name) {
209 #pragma region SINGLE_VALUE_CONSTRUCTOR
212 template<
class Type = value_type,
213 std::enable_if_t<(utils::is_glsl_simple_or_struct_v<Type> && std::is_same_v<Type, value_type> && !is_array),
bool> =
216 glsl_value(
const std::string_view name,
217 const value_type& value)
_GLSL_STRUCT_REQUIRES(utils::is_glsl_simple_or_struct_v<value_type> && !is_array)
218 : base_struct(value), varName(name) {
223 #pragma region ARRAY_CONSTRUCTORS
226 template<
class Type = value_type,
227 std::enable_if_t<(utils::is_glsl_simple_v<Type> && std::is_same_v<Type, value_type> && is_array),
bool> =
true>
229 glsl_value(
const std::string_view name,
const value_type* values,
231 : base_struct(values, size), varName(name) {
236 template<
class Type = value_type,
237 std::enable_if_t<(utils::is_glsl_simple_v<Type> && std::is_same_v<Type, value_type> && is_array),
bool> =
true>
239 glsl_value(
const std::string_view name,
240 const std::vector<value_type>& values)
_GLSL_STRUCT_REQUIRES(utils::is_glsl_simple_v<value_type>&& is_array)
241 : base_struct(values), varName(name) {
246 template<
class Type = value_type,
247 std::enable_if_t<(utils::is_glsl_simple_v<Type> && std::is_same_v<Type, value_type> && is_array),
bool> =
true>
249 glsl_value(
const std::string_view name,
250 const std::array<value_type, array_size>& values)
_GLSL_STRUCT_REQUIRES(utils::is_glsl_simple_v<value_type>&& is_array)
251 : base_struct(values), varName(name) {
256 template<
class Type = value_type,
257 std::enable_if_t<(utils::is_glsl_simple_v<Type> && std::is_same_v<Type, value_type> && is_array),
bool> =
true>
259 glsl_value(
const std::string_view name,
260 const value_type (&values)[array_size])
_GLSL_STRUCT_REQUIRES(utils::is_glsl_simple_v<value_type>&& is_array)
261 : base_struct(values), varName(name) {
266 glsl_value(
const std::string_view name,
267 const std::span<
const value_type> values) _GLSL_STRUCT_REQUIRES(utils::is_glsl_simple_v<value_type>&& is_array)
268 : base_struct(values), varName(name) {}
273 #pragma region STRUCT_ARRAY_CONSTRUCTORS
276 template<utils::glsl_struct Type = value_type>
278 template<
class Type = value_type,
279 std::enable_if_t<(utils::is_glsl_struct_v<Type> && std::is_same_v<Type, value_type> && is_array),
bool> =
true>
282 (utils::is_glsl_struct_v<value_type> && std::is_same_v<Type, value_type> && is_array)
284 : base_struct(layout), varName(name) {
289 template<utils::glsl_struct Type = value_type>
291 template<
class Type = value_type,
292 std::enable_if_t<(utils::is_glsl_struct_v<Type> && std::is_same_v<Type, value_type> && is_array),
bool> =
true>
296 const std::vector<std::vector<std::byte> >& values
297 )
_GLSL_STRUCT_REQUIRES((utils::is_glsl_struct_v<value_type> && std::is_same_v<Type, value_type> && is_array))
298 : base_struct(layout, values), varName(name) {
303 template<utils::glsl_struct Type = value_type>
305 template<
class Type = value_type,
306 std::enable_if_t<(utils::is_glsl_struct_v<Type> && std::is_same_v<Type, value_type> && is_array),
bool> =
true>
310 const std::array<std::vector<std::byte>, array_size>& values
311 )
_GLSL_STRUCT_REQUIRES((utils::is_glsl_struct_v<value_type> && std::is_same_v<Type, value_type> && is_array))
312 : base_struct(layout, values), varName(name) {
317 template<utils::glsl_struct Type = value_type>
319 template<
class Type = value_type,
320 std::enable_if_t<(utils::is_glsl_struct_v<Type> && std::is_same_v<Type, value_type> && is_array),
bool> =
true>
324 const std::vector<std::byte>* values,
const size_t size
325 )
_GLSL_STRUCT_REQUIRES((utils::is_glsl_struct_v<value_type> && std::is_same_v<Type, value_type> && is_array))
326 : base_struct(layout, values, size), varName(name) {
331 template<utils::glsl_struct Type = value_type>
333 template<
class Type = value_type,
334 std::enable_if_t<(utils::is_glsl_struct_v<Type> && std::is_same_v<Type, value_type> && is_array),
bool> =
true>
337 const std::vector<std::byte> (&values)[Num])
_GLSL_STRUCT_REQUIRES((utils::is_glsl_struct_v<value_type> &&
338 std::is_same_v<Type, value_type> && is_array))
339 : base_struct(layout, values), varName(name) {
344 template<utils::glsl_struct Type = value_type>
346 const std::string_view name,
const _GLSL_STRUCT_TYPENAME17 Type::layout_type& layout,
347 const std::span<
const std::vector<std::byte> > values
348 ) _GLSL_STRUCT_REQUIRES((utils::is_glsl_struct_v<value_type> && std::is_same_v<Type, value_type> && is_array))
349 : base_struct(layout, values), varName(name) {}
#define _GLSL_STRUCT_HAS_CXX20
check if compiler has c++ version greater or equal to c++20 and if user enabled c++20 features using ...
Definition config.hpp:142
#define _GLSL_STRUCT_HAS_CXX17
check if compiler has c++ version greater or equal to c++17
Definition config.hpp:130