1 #ifndef OGLPLUS_TEXGEN_DATA_TYPE_HPP
9 #define OGLPLUS_TEXGEN_DATA_TYPE_HPP
11 #include "../config/basic.hpp"
17 namespace eagine::oglp::texgen {
19 enum class slot_data_type {
34 enum class scalar_data_type : int { bool_ = 1, int_ = 2,
float_ = 3 };
40 struct get_data_type<T[1]> : get_data_type<T> {};
43 struct get_data_type<bool>
44 : std::integral_constant<slot_data_type, slot_data_type::bool_> {};
47 struct get_data_type<bool[2]>
48 : std::integral_constant<slot_data_type, slot_data_type::bool_2> {};
51 struct get_data_type<bool[3]>
52 : std::integral_constant<slot_data_type, slot_data_type::bool_3> {};
55 struct get_data_type<bool[4]>
56 : std::integral_constant<slot_data_type, slot_data_type::bool_4> {};
59 struct get_data_type<int>
60 : std::integral_constant<slot_data_type, slot_data_type::int_> {};
63 struct get_data_type<int[2]>
64 : std::integral_constant<slot_data_type, slot_data_type::int_2> {};
67 struct get_data_type<int[3]>
68 : std::integral_constant<slot_data_type, slot_data_type::int_3> {};
71 struct get_data_type<int[4]>
72 : std::integral_constant<slot_data_type, slot_data_type::int_4> {};
75 struct get_data_type<float>
76 : std::integral_constant<slot_data_type, slot_data_type::float_> {};
79 struct get_data_type<float[2]>
80 : std::integral_constant<slot_data_type, slot_data_type::float_2> {};
83 struct get_data_type<float[3]>
84 : std::integral_constant<slot_data_type, slot_data_type::float_3> {};
87 struct get_data_type<float[4]>
88 : std::integral_constant<slot_data_type, slot_data_type::float_4> {};
91 constexpr slot_data_type get_data_type_v = get_data_type<T>::value;
93 string_view data_type_name(slot_data_type) noexcept;
95 scalar_data_type elem_data_type(slot_data_type) noexcept;
97 span_size_t data_type_dims(slot_data_type) noexcept;
99 slot_data_type make_data_type(
100 scalar_data_type type,
101 const valid_if_between<span_size_t, 1, 4>& dims) noexcept;
103 scalar_data_type common_elem_type(slot_data_type a, slot_data_type b) noexcept;
105 span_size_t common_dims(slot_data_type a, slot_data_type b) noexcept;
107 slot_data_type common_data_type(slot_data_type a, slot_data_type b) noexcept;
110 conversion_prefix(std::ostream& out, slot_data_type from, slot_data_type to);
113 conversion_suffix(std::ostream& out, slot_data_type from, slot_data_type to);
115 std::ostream& conversion_suffix(
126 struct conversion_prefix {
127 slot_data_type from{};
130 std::ostream&
operator<<(std::ostream&, conversion_prefix);
132 struct conversion_suffix {
133 slot_data_type from{};
136 std::ostream&
operator<<(std::ostream&, conversion_suffix);
138 struct conversion_suffix_v {
139 slot_data_type from{};
143 std::ostream&
operator<<(std::ostream&, conversion_suffix_v);
148 #if !OGLPLUS_LINK_LIBRARY || defined(OGLPLUS_IMPLEMENTING_LIBRARY)
149 #include <oglplus/texgen/data_type.inl>
152 #endif // OGLPLUS_TEXGEN_DATA_TYPE_HPP