OGLplus  (0.59.0) a C++ wrapper for rendering APIs

data_type.hpp
Go to the documentation of this file.
1 #ifndef OGLPLUS_TEXGEN_DATA_TYPE_HPP
9 #define OGLPLUS_TEXGEN_DATA_TYPE_HPP
10 
11 #include "../config/basic.hpp"
12 #include <eagine/string_span.hpp>
13 #include <eagine/types.hpp>
15 #include <iosfwd>
16 
17 namespace eagine::oglp::texgen {
18 
19 enum class slot_data_type {
20  float_,
21  float_2,
22  float_3,
23  float_4,
24  int_,
25  int_2,
26  int_3,
27  int_4,
28  bool_,
29  bool_2,
30  bool_3,
31  bool_4
32 };
33 
34 enum class scalar_data_type : int { bool_ = 1, int_ = 2, float_ = 3 };
35 
36 template <typename T>
37 struct get_data_type;
38 
39 template <typename T>
40 struct get_data_type<T[1]> : get_data_type<T> {};
41 
42 template <>
43 struct get_data_type<bool>
44  : std::integral_constant<slot_data_type, slot_data_type::bool_> {};
45 
46 template <>
47 struct get_data_type<bool[2]>
48  : std::integral_constant<slot_data_type, slot_data_type::bool_2> {};
49 
50 template <>
51 struct get_data_type<bool[3]>
52  : std::integral_constant<slot_data_type, slot_data_type::bool_3> {};
53 
54 template <>
55 struct get_data_type<bool[4]>
56  : std::integral_constant<slot_data_type, slot_data_type::bool_4> {};
57 
58 template <>
59 struct get_data_type<int>
60  : std::integral_constant<slot_data_type, slot_data_type::int_> {};
61 
62 template <>
63 struct get_data_type<int[2]>
64  : std::integral_constant<slot_data_type, slot_data_type::int_2> {};
65 
66 template <>
67 struct get_data_type<int[3]>
68  : std::integral_constant<slot_data_type, slot_data_type::int_3> {};
69 
70 template <>
71 struct get_data_type<int[4]>
72  : std::integral_constant<slot_data_type, slot_data_type::int_4> {};
73 
74 template <>
75 struct get_data_type<float>
76  : std::integral_constant<slot_data_type, slot_data_type::float_> {};
77 
78 template <>
79 struct get_data_type<float[2]>
80  : std::integral_constant<slot_data_type, slot_data_type::float_2> {};
81 
82 template <>
83 struct get_data_type<float[3]>
84  : std::integral_constant<slot_data_type, slot_data_type::float_3> {};
85 
86 template <>
87 struct get_data_type<float[4]>
88  : std::integral_constant<slot_data_type, slot_data_type::float_4> {};
89 
90 template <typename T>
91 constexpr slot_data_type get_data_type_v = get_data_type<T>::value;
92 
93 string_view data_type_name(slot_data_type) noexcept;
94 
95 scalar_data_type elem_data_type(slot_data_type) noexcept;
96 
97 span_size_t data_type_dims(slot_data_type) noexcept;
98 
99 slot_data_type make_data_type(
100  scalar_data_type type,
101  const valid_if_between<span_size_t, 1, 4>& dims) noexcept;
102 
103 scalar_data_type common_elem_type(slot_data_type a, slot_data_type b) noexcept;
104 
105 span_size_t common_dims(slot_data_type a, slot_data_type b) noexcept;
106 
107 slot_data_type common_data_type(slot_data_type a, slot_data_type b) noexcept;
108 
109 std::ostream&
110 conversion_prefix(std::ostream& out, slot_data_type from, slot_data_type to);
111 
112 std::ostream&
113 conversion_suffix(std::ostream& out, slot_data_type from, slot_data_type to);
114 
115 std::ostream& conversion_suffix(
116  std::ostream& out,
117  slot_data_type from,
118  slot_data_type to,
119  string_view x,
120  string_view y,
121  string_view z,
122  string_view w);
123 
124 namespace expr {
125 
126 struct conversion_prefix {
127  slot_data_type from{};
128  slot_data_type to{};
129 };
130 std::ostream& operator<<(std::ostream&, conversion_prefix);
131 
132 struct conversion_suffix {
133  slot_data_type from{};
134  slot_data_type to{};
135 };
136 std::ostream& operator<<(std::ostream&, conversion_suffix);
137 
138 struct conversion_suffix_v {
139  slot_data_type from{};
140  slot_data_type to{};
141  string_view val[4]{};
142 };
143 std::ostream& operator<<(std::ostream&, conversion_suffix_v);
144 
145 } // namespace expr
146 } // namespace eagine::oglp::texgen
147 
148 #if !OGLPLUS_LINK_LIBRARY || defined(OGLPLUS_IMPLEMENTING_LIBRARY)
149 #include <oglplus/texgen/data_type.inl>
150 #endif
151 
152 #endif // OGLPLUS_TEXGEN_DATA_TYPE_HPP
std::ptrdiff_t span_size_t
Signed span size type used by eagine.
Definition: types.hpp:36
basic_string_span< const char > string_view
Alias for const string views.
Definition: string_span.hpp:116
static auto operator<<(std::ostream &out, const identifier_name< M > &n) -> std::ostream &
Operator for writing identifier_name into output streams.
Definition: identifier.hpp:159

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).