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