Wildmeshing Toolkit
Loading...
Searching...
No Matches
Attribute.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <Eigen/Core>
4#include <vector>
6#include "MapTypes.hpp"
9
10namespace wmtk {
11class MeshWriter;
12
13namespace attribute {
14template <typename T, int Dim>
15class AccessorBase;
16
17template <typename T>
18class PerThreadAttributeScopeStacks;
19namespace internal {
20template <typename T>
22} // namespace internal
23
30template <typename T>
32{
33public:
34 template <int D = Eigen::Dynamic>
36 template <int D = Eigen::Dynamic>
38
39
40 // attribute directly hashes its "children" components so it overrides "child_hashes"
41 std::map<std::string, size_t> child_hashes() const override;
42
43
44 template <typename U, int D>
45 friend class AccessorBase;
47 void serialize(const std::string& name, const int dim, MeshWriter& writer) const;
48
58 Attribute(const std::string& name, int64_t dimension, T default_value = T(0), int64_t size = 0);
59
63
64 template <int D = Eigen::Dynamic>
65 ConstMapResult<D> const_vector_attribute(const int64_t index) const;
66 template <int D = Eigen::Dynamic>
67 MapResult<D> vector_attribute(const int64_t index);
68 template <int D = Eigen::Dynamic>
69 MapResult<D> vector_attribute2(const int64_t index);
70
71 T const_scalar_attribute(const int64_t index) const;
72 T& scalar_attribute(const int64_t index);
73 T const_scalar_attribute(const int64_t index, const int8_t offset) const;
74 T& scalar_attribute(const int64_t index, const int8_t offset);
75
79 void set(std::vector<T> val);
80
86 int64_t reserved_size() const;
87
91 int64_t dimension() const;
92 void reserve(const int64_t size);
93
97 const T& default_value() const;
98
99 bool operator==(const Attribute<T>& o) const;
100
101 void push_scope();
102 void pop_scope(bool apply_updates);
104
107
112 void consolidate(const std::vector<int64_t>& new2old);
113
118 void index_remap(const std::vector<T>& old2new);
119 void index_remap(const std::vector<T>& old2new, const std::vector<Eigen::Index>& cols);
120
126 template <int D = Eigen::Dynamic>
127 ConstMapResult<D> const_vector_attribute(const int64_t index, const std::vector<T>& data) const;
128
134 template <int D = Eigen::Dynamic>
136 const int64_t index,
137 const std::vector<T>& data) const;
142 template <int D = Eigen::Dynamic>
143 MapResult<D> vector_attribute(const int64_t index, std::vector<T>& data) const;
144
150 template <int D = Eigen::Dynamic>
151 MapResult<D> vector_attribute_from_start(const int64_t index, std::vector<T>& data) const;
157 T const_scalar_attribute(const int64_t index, const std::vector<T>& data) const;
162 T& scalar_attribute(const int64_t index, std::vector<T>& data) const;
163
169 T const_scalar_attribute(const int64_t index, const int8_t offset, const std::vector<T>& data)
170 const;
175 T& scalar_attribute(const int64_t index, const int8_t offset, std::vector<T>& data) const;
176
177 // computes the "reserved size" but using the passed in data
178 int64_t reserved_size(const std::vector<T>& data) const;
179
180private:
181 std::vector<T> m_data;
183 int64_t m_dimension = -1;
185
186public:
187 std::string m_name;
188};
189
190template <typename T>
191template <int D>
192inline auto Attribute<T>::const_vector_attribute(const int64_t index) const -> ConstMapResult<D>
193{
194 return const_vector_attribute<D>(index, m_data);
195}
196
197template <typename T>
198template <int D>
199inline auto Attribute<T>::const_vector_attribute(const int64_t index, const std::vector<T>& data)
200 const -> ConstMapResult<D>
201{
202 assert(index < reserved_size(data));
203 assert(data.size() % m_dimension == 0);
204 const int64_t start = index * m_dimension;
205 return const_vector_attribute_from_start<D>(start, data);
206}
207template <typename T>
208template <int D>
210 const int64_t start,
211 const std::vector<T>& data) const -> ConstMapResult<D>
212{
213 assert(m_dimension > 0);
214 if constexpr (D != Eigen::Dynamic) {
215 assert(D == m_dimension);
216 }
217 ConstMapResult<D> R(data.data() + start, m_dimension);
218
219 assert(R.size() == m_dimension);
220
221 return R;
222}
223
224
225template <typename T>
226template <int D>
227inline auto Attribute<T>::vector_attribute(const int64_t index) -> MapResult<D>
228{
229 // return MapResult<D>(m_data.data(), m_dimension);
230 return vector_attribute<D>(index, m_data);
231}
232
233template <typename T>
234template <int D>
235inline auto Attribute<T>::vector_attribute2(const int64_t index) -> MapResult<D>
236{
237 return MapResult<D>(m_data.data(), m_dimension);
238 // return vector_attribute<D>(index, m_data);
239}
240
241template <typename T>
242template <int D>
243inline auto Attribute<T>::vector_attribute(const int64_t index, std::vector<T>& data) const
244 -> MapResult<D>
245{
246 assert(index < reserved_size(data));
247 assert(data.size() % m_dimension == 0);
248 const int64_t start = index * m_dimension;
249 return vector_attribute_from_start<D>(start, data);
250}
251
252template <typename T>
253template <int D>
254inline auto Attribute<T>::vector_attribute_from_start(const int64_t start, std::vector<T>& data)
255 const -> MapResult<D>
256{
257 assert(m_dimension > 0);
258 if constexpr (D != Eigen::Dynamic) {
259 assert(D == m_dimension);
260 }
261 // assert(start < data.size());
262 // assert(start + m_dimension < data.size());
263 MapResult<D> R(data.data() + start, m_dimension);
264 assert(R.size() == m_dimension);
265 return R;
266}
267
268template <typename T>
269inline T Attribute<T>::const_scalar_attribute(const int64_t index) const
270{
271 return const_scalar_attribute(index, m_data);
272}
273template <typename T>
274inline T Attribute<T>::const_scalar_attribute(const int64_t index, const std::vector<T>& data) const
275{
276 assert(index < reserved_size(data));
277 assert(m_dimension == 1);
278 return data[index];
279}
280
281template <typename T>
282inline T& Attribute<T>::scalar_attribute(const int64_t index)
283{
284 return scalar_attribute(index, m_data);
285}
286template <typename T>
287inline T& Attribute<T>::scalar_attribute(const int64_t index, std::vector<T>& data) const
288{
289 assert(index < reserved_size(data));
290 assert(m_dimension == 1);
291 return data[index];
292}
293
294template <typename T>
295inline T Attribute<T>::const_scalar_attribute(const int64_t index, const int8_t offset) const
296{
297 return const_scalar_attribute(index, offset, m_data);
298}
299template <typename T>
301 const int64_t index,
302 const int8_t offset,
303 const std::vector<T>& data) const
304{
305 const int64_t idx = index * m_dimension + offset;
306 assert(index < reserved_size(data));
307 return data[idx];
308}
309
310template <typename T>
311inline T& Attribute<T>::scalar_attribute(const int64_t index, const int8_t offset)
312{
313 return scalar_attribute(index, offset, m_data);
314}
315template <typename T>
316inline T&
317Attribute<T>::scalar_attribute(const int64_t index, const int8_t offset, std::vector<T>& data) const
318{
319 const int64_t idx = index * m_dimension + offset;
320 assert(index < reserved_size(data));
321 return data[idx];
322}
323
324
325template <typename T>
326inline int64_t Attribute<T>::dimension() const
327{
328 return m_dimension;
329}
330
331template <typename T>
332inline const T& Attribute<T>::default_value() const
333{
334 return m_default_value;
335}
336
337template <typename T>
339{
340 return m_scope_stacks.local();
341}
342template <typename T>
344{
345 return m_scope_stacks.local();
346}
347
348template <typename T>
350{
351 m_scope_stacks.local().emplace();
352}
353template <typename T>
354inline void Attribute<T>::pop_scope(bool apply_updates)
355{
356 m_scope_stacks.local().pop(*this, apply_updates);
357}
358
359template <typename T>
361{
362 m_scope_stacks.local().rollback_current_scope(*this);
363}
364
365} // namespace attribute
366} // namespace wmtk
367#include "AccessorBase.hpp"
368#include "AttributeCache.hpp"
This class stores data of type T in a vector.
Definition Attribute.hpp:32
Attribute & operator=(Attribute &&o)
ConstMapResult< D > const_vector_attribute_from_start(const int64_t index, const std::vector< T > &data) const
Accesses the attribute using the specified vector as the underlying data This is internally used by t...
MapResult< D > vector_attribute2(const int64_t index)
void index_remap(const std::vector< T > &old2new)
Applies the scalar old2new map to the indices in the attribute This is commonly used after a consolid...
MapResult< D > vector_attribute_from_start(const int64_t index, std::vector< T > &data) const
Accesses the attribute using the specified vector as the underlying data This is internally used by t...
internal::ConstMapResult< T, D > ConstMapResult
Definition Attribute.hpp:37
const internal::AttributeTransactionStack< T > & get_local_scope_stack() const
MapResult< D > vector_attribute(const int64_t index)
MapResult< D > vector_attribute(const int64_t index, std::vector< T > &data) const
Accesses the attribute using the specified vector as the underlying data This is internally used by t...
const T & default_value() const
returns the default value of this attribute
ConstMapResult< D > const_vector_attribute(const int64_t index, const std::vector< T > &data) const
Accesses the attribute using the specified vector as the underlying data This is internally used by t...
PerThreadAttributeScopeStacks< T > m_scope_stacks
int64_t dimension() const
The number of values for each index.
T & scalar_attribute(const int64_t index)
internal::MapResult< T, D > MapResult
Definition Attribute.hpp:35
void pop_scope(bool apply_updates)
bool operator==(const Attribute< T > &o) const
Definition Attribute.cpp:58
void serialize(const std::string &name, const int dim, MeshWriter &writer) const
Definition Attribute.cpp:12
void reserve(const int64_t size)
Definition Attribute.cpp:66
ConstMapResult< D > const_vector_attribute(const int64_t index) const
void consolidate(const std::vector< int64_t > &new2old)
Consolidate the vector, using the new2old map m provided and resizing the vector to m....
Definition Attribute.cpp:91
int64_t reserved_size() const
The total number of elements in a vector.
Definition Attribute.cpp:73
std::vector< T > m_data
void set(std::vector< T > val)
Replace the internal data with val.
Definition Attribute.cpp:84
std::map< std::string, size_t > child_hashes() const override
Definition Attribute.cpp:36
T const_scalar_attribute(const int64_t index) const
typename VectorResult< T, R >::MapType MapResult
the default map type used by attributes is a map of our vector type.
Definition MapTypes.hpp:21
typename VectorResult< T, R >::ConstMapType ConstMapResult
Definition MapTypes.hpp:23