GLSL Struct 1.4.0
glslstruct
Loading...
Searching...
No Matches
scalar_traits.hpp
1/*
2 * glslstruct - a C++ library designed to easily represent GLSL's Uniform Buffer Objects (UBOs) and Shader Storage Buffer Objects (SSBOs) in C++.
3 *
4 * Licensed under the BSD 3-Clause License with Attribution Requirement.
5 * See the LICENSE file for details: https://github.com/MAIPA01/glslstruct/blob/main/LICENSE
6 *
7 * Copyright (c) 2025, Patryk Antosik (MAIPA01)
8 */
9
10#pragma once
11#ifndef _GLSL_STRUCT_SCALAR_TRAITS_HPP_
12 #define _GLSL_STRUCT_SCALAR_TRAITS_HPP_
13
14 #include <glslstruct/config.hpp>
15
17_GLSL_STRUCT_ERROR("This is only available for c++17 and greater!");
18 #else
19
20 #include <glslstruct/type/data/scalar_data.hpp>
21 #include <glslstruct/utils/ValueType.hpp>
22
23namespace glslstruct {
24 #pragma region DEFAULT_TRAITS
25
26 /**
27 * @brief scalar_traits for bool values
28 * @ingroup glslstruct
29 */
30 template<>
31 struct scalar_traits<bool> {
32 /// @brief returns ValueType of bool
33 static ValueType get_value_type() noexcept;
34
35 /// @brief returns scalar_data of bool value
36 static scalar_data get_data(bool value);
37
38 /// @brief returns bool value from scalar_data
39 static bool get_value(const scalar_data& data);
40 };
41
42 /**
43 * @brief scalar_traits for int values
44 * @ingroup glslstruct
45 */
46 template<>
47 struct scalar_traits<int> {
48 /// @brief returns ValueType of int
49 static ValueType get_value_type() noexcept;
50
51 /// @brief returns scalar_data of int value
52 static scalar_data get_data(int value);
53
54 /// @brief returns int value from scalar_data
55 static int get_value(const scalar_data& data);
56 };
57
58 /**
59 * @brief scalar_traits for unsigned int values
60 * @ingroup glslstruct
61 */
62 template<>
63 struct scalar_traits<unsigned int> {
64 /// @brief returns ValueType of unsigned int
65 static ValueType get_value_type() noexcept;
66
67 /// @brief returns scalar_data of unsigned int value
68 static scalar_data get_data(unsigned int value);
69
70 /// @brief returns unsigned int value from scalar_data
71 static unsigned int get_value(const scalar_data& data);
72 };
73
74 /**
75 * @brief scalar_traits for float values
76 * @ingroup glslstruct
77 */
78 template<>
79 struct scalar_traits<float> {
80 /// @brief returns ValueType of float
81 static ValueType get_value_type() noexcept;
82
83 /// @brief returns scalar_data of float value
84 static scalar_data get_data(float value);
85
86 /// @brief returns float value from scalar_data
87 static float get_value(const scalar_data& data);
88 };
89
90 /**
91 * @brief scalar_traits for double values
92 * @ingroup glslstruct
93 */
94 template<>
95 struct scalar_traits<double> {
96 /// @brief returns ValueType of double
97 static ValueType get_value_type() noexcept;
98
99 /// @brief returns scalar_data of double value
100 static scalar_data get_data(double value);
101
102 /// @brief returns double value from scalar_data
103 static double get_value(const scalar_data& data);
104 };
105
106 #pragma endregion
107
108 #pragma region FUNCTIONS
109 /// @brief returns ValueType of T based on scalar_traits
111 template<utils::glsl_scalar T>
112 #else
113 template<class T, std::enable_if_t<utils::is_glsl_scalar_v<T>, bool> = true>
114 #endif
115 static inline ValueType get_scalar_value_type() noexcept {
116 return scalar_traits<T>::get_value_type();
117 }
118
119 /// @brief returns scalar_data of T based on scalar_traits
121 template<utils::glsl_scalar T>
122 #else
123 template<class T, std::enable_if_t<utils::is_glsl_scalar_v<T>, bool> = true>
124 #endif
125 static inline scalar_data get_scalar_data(const T& value) {
126 return scalar_traits<T>::get_data(value);
127 }
128
129 /// @brief returns value of type T from scalar_data based on scalar_traits
131 template<utils::glsl_scalar T>
132 #else
133 template<class T, std::enable_if_t<utils::is_glsl_scalar_v<T>, bool> = true>
134 #endif
135 static inline T get_scalar_value(const scalar_data& data) {
136 return scalar_traits<T>::get_value(data);
137 }
138
139 /// @brief returns glsl scalar type string
140 std::string scalar_to_string(ValueType valueType);
141
142 /// @brief returns glsl scalar type string from type T based on scalar_traits
144 template<utils::glsl_scalar T>
145 #else
146 template<class T, std::enable_if_t<utils::is_glsl_scalar_v<T>, bool> = true>
147 #endif
148 static inline std::string scalar_to_string() {
149 return scalar_to_string(get_scalar_value_type<T>());
150 }
151
152 #pragma endregion
153} // namespace glslstruct
154
155 #endif
156#endif
#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