28 #ifndef SPLA_STORAGE_MANAGER_HPP
29 #define SPLA_STORAGE_MANAGER_HPP
56 template<
typename T,
typename F,
int capacity>
76 std::vector<std::vector<std::pair<int, int>>> m_convert_rules;
77 std::vector<Function> m_constructors;
78 std::vector<Function> m_validators;
79 std::vector<Function> m_discards;
80 std::vector<Function> m_converters;
83 template<
typename T,
typename F,
int capacity>
85 m_convert_rules.resize(capacity);
86 m_constructors.resize(capacity);
87 m_validators.resize(capacity);
88 m_discards.resize(capacity);
91 template<
typename T,
typename F,
int capacity>
93 const int i =
static_cast<int>(format);
94 m_constructors[i] = std::move(
function);
96 template<
typename T,
typename F,
int capacity>
98 const int i =
static_cast<int>(format);
99 m_validators[i] = std::move(
function);
101 template<
typename T,
typename F,
int capacity>
103 const int i =
static_cast<int>(format);
104 m_discards[i] = std::move(
function);
106 template<
typename T,
typename F,
int capacity>
108 const int i =
static_cast<int>(format);
109 m_discards[i] = m_validators[i] = std::move(
function);
111 template<
typename T,
typename F,
int capacity>
113 const int i =
static_cast<int>(from);
114 const int j =
static_cast<int>(to);
115 const int id =
static_cast<int>(m_converters.size());
116 m_convert_rules[i].push_back({j,
id});
117 m_converters.push_back(std::move(
function));
120 template<
typename T,
typename F,
int capacity>
122 const int i =
static_cast<int>(format);
124 m_constructors[i](storage);
127 template<
typename T,
typename F,
int capacity>
133 const int i =
static_cast<int>(format);
135 if (!m_constructors[i]) {
140 m_constructors[i](storage);
142 if (m_validators[i]) {
143 m_validators[i](storage);
149 const int source = -1;
150 const int infinity = -2;
151 const int target =
static_cast<int>(format);
153 std::array<int, capacity> reached;
154 std::queue<int> queue;
155 reached.fill(infinity);
159 for (
int i = 0; i < capacity; ++i) {
166 while (reached[target] == infinity) {
173 int u = queue.front();
176 for (
const auto& target_format : m_convert_rules[u]) {
177 if (reached[target_format.first] == infinity) {
178 reached[target_format.first] = u;
179 queue.push(target_format.first);
184 std::vector<std::pair<int, int>> path;
185 int current = target;
187 while (reached[current] != source) {
188 path.push_back({reached[current], current});
189 current = reached[current];
192 for (
auto iter = path.rbegin(); iter != path.rend(); ++iter) {
193 std::pair<int, int> from_to = *iter;
194 auto search_predicate = [from_to](
const std::pair<int, int>& rule) {
return rule.first == from_to.second; };
195 auto rule = std::find_if(m_convert_rules[from_to.first].begin(), m_convert_rules[from_to.first].end(), search_predicate);
197 if (storage.
get_ref_i(from_to.second).is_null()) {
198 m_constructors[from_to.second](storage);
201 m_converters[rule->second](storage);
202 storage.
validate(
static_cast<F
>(from_to.second));
205 template<
typename T,
typename F,
int capacity>
207 validate_rw(format, storage);
211 template<
typename T,
typename F,
int capacity>
213 const int i =
static_cast<int>(format);
215 m_constructors[i](storage);
218 m_discards[i](storage);
General format converter for vector or matrix decoration storage.
Definition: storage_manager.hpp:57
std::function< void(Storage &storage)> Function
Definition: storage_manager.hpp:60
TDecorationStorage< T, F, capacity > Storage
Definition: storage_manager.hpp:59
Storage for decorators with data of a particular vector or matrix object.
Definition: tdecoration.hpp:70
void invalidate()
Definition: tdecoration.hpp:84
void validate(F format)
Definition: tdecoration.hpp:83
bool is_valid(F format) const
Definition: tdecoration.hpp:82
TDecoration< T > * get_ptr_i(int index)
Definition: tdecoration.hpp:73
bool is_valid_any() const
Definition: tdecoration.hpp:80
ref_ptr< TDecoration< T > > & get_ref_i(int index)
Definition: tdecoration.hpp:72
bool is_valid_i(int index) const
Definition: tdecoration.hpp:81
void register_converter(F from, F to, Function function)
Definition: storage_manager.hpp:112
StorageManager()
Definition: storage_manager.hpp:84
void register_discard(F format, Function function)
Definition: storage_manager.hpp:102
void validate_wd(F format, Storage &storage)
Definition: storage_manager.hpp:212
void validate_rw(F format, Storage &storage)
Definition: storage_manager.hpp:128
void validate_ctor(F format, Storage &storage)
Definition: storage_manager.hpp:121
void validate_rwd(F format, Storage &storage)
Definition: storage_manager.hpp:206
void register_validator(F format, Function function)
Definition: storage_manager.hpp:97
void register_validator_discard(F format, Function function)
Definition: storage_manager.hpp:107
void register_constructor(F format, Function function)
Definition: storage_manager.hpp:92
#define LOG_MSG(status, msg)
Definition: logger.hpp:66
Definition: algorithm.hpp:37