21#ifndef DYNAMICSTATE_HPP_
22#define DYNAMICSTATE_HPP_
61 typedef typename std::vector< T >::iterator
iterator;
66 m_data( timeMap.
size(), initial ),
67 initial_range( timeMap.
size() )
72 m_data(
data), initial_range(init_range)
76 this->m_data.assign( this->m_data.size(),
value );
84 return this->m_data.at(
index );
88 return this->
at( index );
92 return this->
at( index );
96 std::fill_n( this->m_data.begin(), this->initial_range, initial );
100 std::vector<std::pair<std::size_t, T>>
unique()
const {
101 if (this->m_data.empty())
104 const auto * current_value = std::addressof(this->m_data[0]);
105 std::size_t current_index = 0;
106 std::vector<std::pair<std::size_t, T>> result{{current_index, *current_value}};
108 if (this->m_data[current_index] != *current_value) {
109 current_value = std::addressof(this->m_data[current_index]);
110 result.emplace_back(current_index, *current_value);
114 if (current_index == this->m_data.size())
130 if( this->initial_range == this->m_data.size() )
131 this->initial_range =
index;
133 const bool change = (
value != this->m_data.at(
index ));
135 if( !change )
return false;
137 std::fill( this->m_data.begin() +
index,
145 if (this->m_data.size() <=
index)
146 throw std::out_of_range(
"Invalid index for update_elm()");
160 if (this->m_data.size() <=
index)
161 throw std::out_of_range(
"Invalid index for update_equal()");
163 const T prev_value = this->m_data[
index];
164 if (prev_value ==
value)
168 if (this->m_data[
index] != prev_value)
174 if (
index == this->m_data.size())
183 auto iter = std::find( m_data.begin() , m_data.end() ,
value);
184 if( iter == this->m_data.end() )
return -1;
186 return std::distance( m_data.begin() , iter );
191 auto iter = std::find_if(m_data.begin(), m_data.end(), std::forward<P>(pred));
192 if( iter == this->m_data.end() )
return -1;
194 return std::distance( m_data.begin() , iter );
200 auto iter = std::find_if_not( m_data.begin() , m_data.end() , [&
value] (
const T& elm) { return value == elm; });
201 if( iter == this->m_data.end() )
return -1;
203 return std::distance( m_data.begin() , iter );
207 return this->m_data.begin();
212 return this->m_data.end();
217 return this->m_data.size();
220 const std::vector<T>&
data()
const {
225 return initial_range;
229 return m_data ==
data.m_data &&
230 initial_range ==
data.initial_range;
234 template<
class Serializer,
bool complexType = true>
238 auto indices = split(
unique);
239 serializer.template vector<T,complexType>(
unique);
241 if (!serializer.isSerializing())
242 reconstruct(
unique, indices);
246 std::vector< T > m_data;
247 size_t initial_range;
249 std::vector<size_t> split(std::vector<T>&
unique)
const {
250 std::vector<size_t> idxVec;
251 idxVec.reserve(m_data.size() + 1);
252 for (
const auto& w : m_data) {
253 auto candidate = std::find(
unique.begin(),
unique.end(), w);
254 size_t idx = candidate -
unique.begin();
255 if (candidate ==
unique.end()) {
259 idxVec.push_back(idx);
261 idxVec.push_back(initial_range);
266 void reconstruct(
const std::vector<T>&
unique,
267 const std::vector<size_t>& idxVec) {
269 m_data.reserve(idxVec.size() - 1);
270 for (
size_t i = 0; i < idxVec.size() - 1; ++i)
271 m_data.push_back(
unique[idxVec[i]]);
273 initial_range = idxVec.back();
int index
Definition: cJSON.h:168
Definition: DynamicState.hpp:58
const T & get(size_t index) const
Definition: DynamicState.hpp:91
std::size_t size() const
Definition: DynamicState.hpp:216
const T & at(size_t index) const
Definition: DynamicState.hpp:83
iterator end()
Definition: DynamicState.hpp:211
const T & back() const
Definition: DynamicState.hpp:79
int find(const T &value) const
Definition: DynamicState.hpp:182
bool update(size_t index, T value)
Definition: DynamicState.hpp:129
iterator begin()
Definition: DynamicState.hpp:206
size_t initialRange() const
Definition: DynamicState.hpp:224
const std::vector< T > & data() const
Definition: DynamicState.hpp:220
int find_if(P &&pred) const
Definition: DynamicState.hpp:190
DynamicState(const TimeMap &timeMap, T initial)
Definition: DynamicState.hpp:65
void update_equal(size_t index, const T &value)
Definition: DynamicState.hpp:159
DynamicState(const std::vector< T > &data, size_t init_range)
Definition: DynamicState.hpp:70
void serializeOp(Serializer &serializer)
Definition: DynamicState.hpp:235
std::vector< std::pair< std::size_t, T > > unique() const
Definition: DynamicState.hpp:100
int find_not(const T &value) const
Definition: DynamicState.hpp:199
void update_elm(size_t index, const T &value)
Definition: DynamicState.hpp:144
bool operator==(const DynamicState< T > &data) const
Definition: DynamicState.hpp:228
bool is_new_data(size_t index) const
Definition: DynamicState.hpp:121
void updateInitial(T initial)
Definition: DynamicState.hpp:95
std::vector< T >::iterator iterator
Definition: DynamicState.hpp:61
void globalReset(T value)
Definition: DynamicState.hpp:75
const T & operator[](size_t index) const
Definition: DynamicState.hpp:87
Definition: Schedule.hpp:113
Definition: Serializer.hpp:38
Definition: TimeMap.hpp:40
T value(details::expression_node< T > *n)
Definition: exprtk.hpp:12955