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>(), ...);
122 bool isComponentEnabled()
const
124 constexpr uint ind = indexOfType<C>();
125 return mVecEnabled[ind];
128 template<u
int COMP_ID>
129 bool isComponentEnabled()
const
132 return isComponentEnabled<C>();
136 void enableComponent()
138 constexpr uint ind = indexOfType<C>();
139 mVecEnabled[ind] =
true;
140 vector<C>().resize(mSize);
143 template<u
int COMP_ID>
144 void enableComponent()
147 enableComponent<C>();
151 void disableComponent()
153 constexpr uint ind = indexOfType<C>();
154 mVecEnabled[ind] =
false;
158 template<u
int COMP_ID>
159 void disableComponent()
162 disableComponent<C>();
167 static constexpr uint indexOfType()
169 return IndexInTypes<C, Comp...>::value;
172 template<std::
size_t N>
173 void vectorResize(std::size_t size)
175 if (mVecEnabled[N]) {
176 std::get<N>(mVecTuple).resize(size);
178 if constexpr (N != 0)
179 vectorResize<N - 1>(size);
182 template<std::
size_t N>
183 void vectorReserve(std::size_t size)
185 if (mVecEnabled[N]) {
186 std::get<N>(mVecTuple).reserve(size);
188 if constexpr (N != 0)
189 vectorReserve<N - 1>(size);
192 template<std::
size_t N>
193 void vectorCompact(
const std::vector<uint>& newIndices)
195 if (mVecEnabled[N]) {
196 compactVector(std::get<N>(mVecTuple), newIndices);
198 if constexpr (N != 0)
199 vectorCompact<N - 1>(newIndices);
202 template<
typename C,
bool E>
203 void setComponentEnabled()
206 enableComponent<C>();
209 disableComponent<C>();
213 template<
typename C,
bool E>
214 void setComponentEnabledIfOptional()
216 if constexpr (comp::IsOptionalComponent<C>) {
217 setComponentEnabled<C, E>();
226template<
typename... Comp>
227class VerticalComponentsVectorTuple<TypeWrapper<Comp...>> :
228 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:194