MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
DataSpec.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Eigen/Core"
4
7
8namespace MayaFlux::Yantra {
9
10template <typename T>
11concept VariantVector = requires {
12 typename T::value_type;
13 requires std::same_as<T, std::vector<typename T::value_type>>;
14 requires std::constructible_from<Kakshya::DataVariant, typename T::value_type>;
15};
16
17// clang-format off
18
19/**
20 * @concept ComputeData
21 * @brief Universal concept for types that can be used as data in compute operations.
22 *
23 * Defines the valid types that can flow through the computation pipeline.
24 * Supports both direct type matching and constructible conversion patterns.
25 *
26 * Following types are considered valid:
27 * - Kakshya::DataVariant: Universal data container
28 * - std::shared_ptr<Kakshya::SignalSourceContainer>: Shared signal sources
29 * - Kakshya::Region: Spatial/temporal markers
30 * - Kakshya::RegionGroup: Collections of regions
31 * - Eigen::MatrixBase<T>: Any Eigen matrix type (e.g., Vector3f, MatrixXd)
32 * - std::vector<Kakshya::RegionSegment>: Cached region data (with values)
33 * - Any type constructible from Kakshya::DataVariant
34 */
35template <typename T>
36concept ComputeData =
37 std::same_as<T, Kakshya::DataVariant> ||
38 std::same_as<T, std::vector<Kakshya::DataVariant>> ||
39 std::same_as<T, std::shared_ptr<Kakshya::SignalSourceContainer>> ||
40 std::same_as<T, Kakshya::Region> ||
41 std::same_as<T, Kakshya::RegionGroup> ||
42 std::same_as<T, std::vector<Kakshya::RegionSegment>> ||
43 std::is_base_of_v<Eigen::MatrixBase<T>, T> ||
45 std::constructible_from<Kakshya::DataVariant, T>;
46// clang-format on
47
48/**
49 * @struct extraction_traits_d
50 * @brief Traits to determine how to extract data from various types. The returned values are alwayu doubles (_d)
51 *
52 * This struct provides compile-time information about how to handle different data types
53 * in terms of whether they represent multiple variants, require a container, or are region-like.
54 * It also defines the expected result types for data extraction.
55 *
56 * Specializations are provided for:
57 * - Kakshya::DataVariant
58 * - std::vector<Kakshya::DataVariant>
59 * - std::shared_ptr<Kakshya::SignalSourceContainer>
60 * - Kakshya::Region
61 * - Kakshya::RegionGroup
62 * - std::vector<Kakshya::RegionSegment>
63 * - Eigen::Matrix and its specializations (e.g., Eigen::VectorXd, Eigen::MatrixXd)
64 */
65template <typename T>
67 static constexpr bool is_multi_variant = false;
68 static constexpr bool requires_container = false;
69 static constexpr bool is_region_like = false;
70 using result_type = std::span<double>;
72};
73
74// Helper concepts for easier SFINAE and static_assert usage
75template <typename T>
76concept RegionLike = std::is_same_v<T, Kakshya::Region>
77 || std::is_same_v<T, Kakshya::RegionGroup>
78 || std::is_same_v<T, std::vector<Kakshya::RegionSegment>>;
79
80// A MultiVariant is either a vector of DataVariants, a shared_ptr to a SignalSourceContainer, or any RegionLike type
81template <typename T>
82concept MultiVariant = std::is_same_v<T, std::vector<Kakshya::DataVariant>>
83 || std::is_same_v<T, std::shared_ptr<Kakshya::SignalSourceContainer>>
85
86// A RequiresContainer is any RegionLike type
87template <typename T>
89
90/**
91 * @brief A SingleVariant is either a single DataVariant, an Eigen vector type, or any type constructible from DataVariant
92 * but not a vector of DataVariants, not a shared_ptr to SignalSourceContainer, and not RegionLike.
93 *
94 * This concept ensures that the type represents a single data source rather than multiple sources.
95 */
96template <typename T>
97concept SingleVariant = std::is_same_v<T, Kakshya::DataVariant>
98 || (std::is_base_of_v<Eigen::MatrixBase<T>, T> && T::ColsAtCompileTime == 1)
99 || std::is_same_v<T, Eigen::VectorXd>
100 || (std::constructible_from<Kakshya::DataVariant, T>
101 && !std::is_same_v<T, std::vector<Kakshya::DataVariant>>
102 && !std::is_same_v<T, std::shared_ptr<Kakshya::SignalSourceContainer>>
103 && !RegionLike<T>
104 && !std::is_base_of_v<Eigen::MatrixBase<T>, T>);
105
106/**
107 * @brief Specialization of extraction_traits_d for single Kakshya::DataVariant
108 */
109template <>
110struct extraction_traits_d<Kakshya::DataVariant> {
111 static constexpr bool is_multi_variant = false;
112 static constexpr bool requires_container = false;
113 static constexpr bool is_region_like = false;
114 using result_type = std::span<double>;
116};
117
118/**
119 * @brief Specialization of extraction_traits_d for vector of Kakshya::DataVariant
120 */
121template <>
122struct extraction_traits_d<std::vector<Kakshya::DataVariant>> {
123 static constexpr bool is_multi_variant = true;
124 static constexpr bool requires_container = false;
125 static constexpr bool is_region_like = false;
126 using result_type = std::vector<std::span<double>>;
127 using variant_result_type = std::vector<Kakshya::DataVariant>;
128};
129
130/**
131 * @brief Specialization of extraction_traits_d for shared_ptr to Kakshya::SignalSourceContainer
132 */
133template <>
134struct extraction_traits_d<std::shared_ptr<Kakshya::SignalSourceContainer>> {
135 static constexpr bool is_multi_variant = true;
136 static constexpr bool requires_container = false;
137 static constexpr bool is_region_like = false;
138 using result_type = std::vector<std::span<double>>;
139 using variant_result_type = std::vector<Kakshya::DataVariant>;
140};
141
142/**
143 * @brief Specialization of extraction_traits_d for Kakshya::Region
144 */
145template <>
146struct extraction_traits_d<Kakshya::Region> {
147 static constexpr bool is_multi_variant = true;
148 static constexpr bool requires_container = true;
149 static constexpr bool is_region_like = true;
150 using result_type = std::vector<std::span<double>>;
151 using variant_result_type = std::vector<Kakshya::DataVariant>;
152};
153
154/**
155 * @brief Specialization of extraction_traits_d for Kakshya::RegionGroup
156 */
157template <>
158struct extraction_traits_d<Kakshya::RegionGroup> {
159 static constexpr bool is_multi_variant = true;
160 static constexpr bool requires_container = true;
161 static constexpr bool is_region_like = true;
162 using result_type = std::vector<std::span<double>>;
163 using variant_result_type = std::vector<Kakshya::DataVariant>;
164};
165
166/**
167 * @brief Specialization of extraction_traits_d for vector of Kakshya::RegionSegment
168 */
169template <>
170struct extraction_traits_d<std::vector<Kakshya::RegionSegment>> {
171 static constexpr bool is_multi_variant = true;
172 static constexpr bool requires_container = true;
173 static constexpr bool is_region_like = true;
174 using result_type = std::vector<std::span<double>>;
175 using variant_result_type = std::vector<Kakshya::DataVariant>;
176};
177
178// Trait to detect if a type is an Eigen matrix
179template <typename T>
180struct is_eigen_matrix : std::false_type { };
181template <typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
182struct is_eigen_matrix<Eigen::Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>> : std::true_type { };
183template <typename T>
185
186/**
187 * @brief Specialization of extraction_traits_d for Eigen matrices with double scalar type
188 *
189 * This specialization ensures that Eigen matrices with double precision are treated as multi-variant types.
190 */
191template <typename T>
192 requires is_eigen_matrix_v<T> && std::is_same_v<typename T::Scalar, double>
194 static constexpr bool is_multi_variant = true;
195 static constexpr bool requires_container = false;
196 static constexpr bool is_region_like = false;
197 using result_type = std::vector<std::span<double>>;
198 using variant_result_type = std::vector<Kakshya::DataVariant>;
199};
200
201/**
202 * @brief Specialization of extraction_traits_d for Eigen::MatrixXd
203 *
204 * This specialization handles Eigen matrices, treating them as multi-variant types.
205 */
206template <>
207struct extraction_traits_d<Eigen::MatrixXd> {
208 static constexpr bool is_multi_variant = true;
209 static constexpr bool requires_container = false;
210 static constexpr bool is_region_like = false;
211 using result_type = std::vector<std::span<double>>;
212 using variant_result_type = std::vector<Kakshya::DataVariant>;
213};
214
215/**
216 * @concept EigenMatrixLike
217 * @brief Concept for Eigen matrix types with double scalar
218 */
219template <typename T>
220concept EigenMatrixLike = is_eigen_matrix_v<T> && std::is_same_v<typename T::Scalar, double>;
221
222template <typename T>
223using enable_if_single_variant_t = std::enable_if_t<SingleVariant<T>>;
224
225template <typename T>
226using enable_if_multi_variant_t = std::enable_if_t<extraction_traits_d<T>::is_multi_variant>;
227
228template <typename T>
229using enable_if_region_like_t = std::enable_if_t<extraction_traits_d<T>::is_region_like>;
230
231template <typename T>
232using enable_if_multi_no_container_t = std::enable_if_t<extraction_traits_d<T>::is_multi_variant && !extraction_traits_d<T>::requires_container>;
233
234template <typename T>
235using enable_if_multi_with_container_t = std::enable_if_t<extraction_traits_d<T>::is_multi_variant && extraction_traits_d<T>::requires_container>;
236
237template <typename T>
238using enable_if_eigen_matrix_t = std::enable_if_t<is_eigen_matrix_v<T> && std::is_same_v<typename T::Scalar, double>>;
239
240template <typename T>
242
243template <typename T>
245
246}
Universal concept for types that can be used as data in compute operations.
Definition DataSpec.hpp:36
Concept for Eigen matrix types with double scalar.
Definition DataSpec.hpp:220
A SingleVariant is either a single DataVariant, an Eigen vector type, or any type constructible from ...
Definition DataSpec.hpp:97
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
Definition NDData.hpp:76
std::enable_if_t< extraction_traits_d< T >::is_region_like > enable_if_region_like_t
Definition DataSpec.hpp:229
std::enable_if_t< extraction_traits_d< T >::is_multi_variant > enable_if_multi_variant_t
Definition DataSpec.hpp:226
typename extraction_traits_d< T >::result_type extraction_result_t
Definition DataSpec.hpp:241
std::enable_if_t< is_eigen_matrix_v< T > &&std::is_same_v< typename T::Scalar, double > > enable_if_eigen_matrix_t
Definition DataSpec.hpp:238
constexpr bool is_eigen_matrix_v
Definition DataSpec.hpp:184
std::enable_if_t< SingleVariant< T > > enable_if_single_variant_t
Definition DataSpec.hpp:223
typename extraction_traits_d< T >::variant_result_type variant_result_t
Definition DataSpec.hpp:244
std::enable_if_t< extraction_traits_d< T >::is_multi_variant &&!extraction_traits_d< T >::requires_container > enable_if_multi_no_container_t
Definition DataSpec.hpp:232
std::enable_if_t< extraction_traits_d< T >::is_multi_variant &&extraction_traits_d< T >::requires_container > enable_if_multi_with_container_t
Definition DataSpec.hpp:235
std::vector< Kakshya::DataVariant > variant_result_type
Definition DataSpec.hpp:212
std::vector< std::span< double > > result_type
Definition DataSpec.hpp:211
std::vector< Kakshya::DataVariant > variant_result_type
Definition DataSpec.hpp:163
std::vector< Kakshya::DataVariant > variant_result_type
Definition DataSpec.hpp:151
std::vector< std::span< double > > result_type
Definition DataSpec.hpp:150
std::vector< std::span< double > > result_type
Definition DataSpec.hpp:197
std::vector< Kakshya::DataVariant > variant_result_type
Definition DataSpec.hpp:198
static constexpr bool requires_container
Definition DataSpec.hpp:68
Kakshya::DataVariant variant_result_type
Definition DataSpec.hpp:71
static constexpr bool is_region_like
Definition DataSpec.hpp:69
static constexpr bool is_multi_variant
Definition DataSpec.hpp:67
Traits to determine how to extract data from various types.
Definition DataSpec.hpp:66