3#include <wmtk/utils/VectorUtils.h>
4#include <wmtk/utils/Logger.hpp>
6#include <tbb/concurrent_vector.h>
7#include <tbb/enumerable_thread_specific.h>
14#include <unordered_map>
26 virtual void move(
size_t from,
size_t to) {};
27 virtual void resize(
size_t) = 0;
28 virtual void clear() = 0;
29 virtual void rollback() = 0;
30 virtual void begin_protect() = 0;
31 virtual void end_protect() = 0;
38 void move(
size_t from,
size_t to)
override
40 if (from == to)
return;
41 m_attributes[to] = std::move(m_attributes[from]);
43 void resize(
size_t s)
override
45 m_attributes.grow_to_at_least(s);
52 void clear()
override { m_attributes.clear(); }
54 bool assign(
size_t to, T&& val)
56 m_attributes[to] = val;
57 if (recording.local()) m_rollback_list.local()[to] = val;
67 for (
auto& [i, v] : m_rollback_list.local()) {
68 m_attributes[i] = std::move(v);
78 m_rollback_list.local().clear();
79 recording.local() =
true;
87 m_rollback_list.local().clear();
88 recording.local() =
false;
91 const T& at(
size_t i)
const {
return m_attributes[i]; }
93 const T& operator[](
size_t i)
const {
return at(i); }
95 T& operator[](
size_t i)
97 if (recording.local()) {
98 m_rollback_list.local().emplace(i, m_attributes[i]);
100 return m_attributes[i];
104 size_t size()
const {
return m_attributes.size(); }
105 tbb::enumerable_thread_specific<std::unordered_map<size_t, T>> m_rollback_list;
107 tbb::concurrent_vector<T> m_attributes;
108 tbb::enumerable_thread_specific<bool> recording{
false};
serving as buffers for attributes data that can be modified by operations
Definition AttributeCollection.hpp:23
Definition AttributeCollection.hpp:37
void rollback() override
retrieve the protected attribute data on operation-fail
Definition AttributeCollection.hpp:65
void end_protect() override
clear local buffers and finish recording
Definition AttributeCollection.hpp:85
void begin_protect() override
clean local buffers for attribute, and start recording
Definition AttributeCollection.hpp:76