23#ifndef VCL_MESH_CONTAINERS_DETAIL_VERTICAL_COMPONENTS_VECTOR_TUPLE_H
24#define VCL_MESH_CONTAINERS_DETAIL_VERTICAL_COMPONENTS_VECTOR_TUPLE_H
26#include <vclib/mesh/components/concepts/component.h>
28#include <vclib/base.h>
34namespace vcl::mesh::detail {
36template<
typename... Comp>
37class VerticalComponentsVectorTuple
39 using ComponentTypes = std::tuple<Comp...>;
41 static constexpr uint COMP_NUMBER =
42 std::tuple_size_v<std::tuple<std::vector<Comp>...>>;
44 std::tuple<std::vector<typename Comp::DataValueType>...> mVecTuple;
46 std::array<bool, COMP_NUMBER> mVecEnabled;
47 std::size_t mSize = 0;
50 VerticalComponentsVectorTuple()
52 (setComponentEnabled<Comp, !comp::IsOptionalComponent<Comp>>(), ...);
55 static constexpr uint componentsNumber() {
return COMP_NUMBER; }
58 constexpr bool hasComponent()
const
64 constexpr std::vector<typename C::DataValueType>& vector()
66 constexpr uint ind = indexOfType<C>();
67 return std::get<ind>(mVecTuple);
71 constexpr const std::vector<typename C::DataValueType>& vector()
const
73 constexpr uint ind = indexOfType<C>();
74 return std::get<ind>(mVecTuple);
77 std::size_t size()
const {
return mSize; }
79 void resize(std::size_t size)
81 if constexpr (componentsNumber() > 0) {
82 vectorResize<componentsNumber() - 1>(size);
87 void reserve(std::size_t size)
89 if constexpr (componentsNumber() > 0) {
90 vectorReserve<componentsNumber() - 1>(size);
94 void compact(
const std::vector<uint>& newIndices)
96 if constexpr (componentsNumber() > 0) {
97 vectorCompact<componentsNumber() - 1>(newIndices);
103 auto function = [](
auto&... args) {
104 ((args.clear()), ...);
107 std::apply(function, mVecTuple);
111 void enableAllOptionalComponents()
113 (setComponentEnabledIfOptional<Comp, true>(), ...);
116 void disableAllOptionalComponents()
118 (setComponentEnabledIfOptional<Comp, false>(), ...);
121 void swapComponents(uint i, uint j) { (swapComponent<Comp>(i, j), ...); }
124 bool isComponentEnabled()
const
126 constexpr uint ind = indexOfType<C>();
127 return mVecEnabled[ind];
130 template<u
int COMP_ID>
131 bool isComponentEnabled()
const
134 return isComponentEnabled<C>();
138 void enableComponent()
140 constexpr uint ind = indexOfType<C>();
141 mVecEnabled[ind] =
true;
142 vector<C>().resize(mSize);
145 template<u
int COMP_ID>
146 void enableComponent()
149 enableComponent<C>();
153 void disableComponent()
155 constexpr uint ind = indexOfType<C>();
156 mVecEnabled[ind] =
false;
160 template<u
int COMP_ID>
161 void disableComponent()
164 disableComponent<C>();
168 void swapComponent(uint i, uint j)
170 constexpr uint ind = indexOfType<C>();
171 if (mVecEnabled[ind]) {
172 auto& vec = std::get<ind>(mVecTuple);
173 std::swap(vec[i], vec[j]);
179 static constexpr uint indexOfType()
181 return IndexInTypes<C, Comp...>::value;
184 template<std::
size_t N>
185 void vectorResize(std::size_t size)
187 if (mVecEnabled[N]) {
188 std::get<N>(mVecTuple).resize(size);
190 if constexpr (N != 0)
191 vectorResize<N - 1>(size);
194 template<std::
size_t N>
195 void vectorReserve(std::size_t size)
197 if (mVecEnabled[N]) {
198 std::get<N>(mVecTuple).reserve(size);
200 if constexpr (N != 0)
201 vectorReserve<N - 1>(size);
204 template<std::
size_t N>
205 void vectorCompact(
const std::vector<uint>& newIndices)
207 if (mVecEnabled[N]) {
208 compactVector(std::get<N>(mVecTuple), newIndices);
210 if constexpr (N != 0)
211 vectorCompact<N - 1>(newIndices);
214 template<
typename C,
bool E>
215 void setComponentEnabled()
218 enableComponent<C>();
221 disableComponent<C>();
225 template<
typename C,
bool E>
226 void setComponentEnabledIfOptional()
228 if constexpr (comp::IsOptionalComponent<C>) {
229 setComponentEnabled<C, E>();
238template<
typename... Comp>
239class VerticalComponentsVectorTuple<TypeWrapper<Comp...>> :
240 public VerticalComponentsVectorTuple<Comp...>
constexpr uint UINT_NULL
The UINT_NULL value represent a null value of uint that is the maximum value that can be represented ...
Definition base.h:48
FirstTypeT< typename detail::ComponentOfTypePred< COMP_ID, Components... >::type > ComponentOfType
Given the ID of a Component and a list of Component types (or a TypeWrapper), this alias sets its typ...
Definition base.h:186