int find_if(P&& pred) const {
auto iter = std::find_if(m_data.begin(), m_data.end(), std::forward(pred));
if( iter == this->m_data.end() ) return -1;
return std::distance( m_data.begin() , iter );
}
/// Will return the index of the first value which is != @value, or -1
/// if all values are == @value
int find_not(const T& value) const {
auto iter = std::find_if_not( m_data.begin() , m_data.end() , [&value] (const T& elm) { return value == elm; });
if( iter == this->m_data.end() ) return -1;
return std::distance( m_data.begin() , iter );
}
iterator begin() {
return this->m_data.begin();
}
iterator end() {
return this->m_data.end();
}
std::size_t size() const {
return this->m_data.size();
}
const std::vector& data() const {
return m_data;
}
size_t initialRange() const {
return initial_range;
}
bool operator==(const DynamicState& data) const {
return m_data == data.m_data &&
initial_range == data.initial_range;
}
// complexType=true if contained type has a serializeOp
template
void serializeOp(Serializer& serializer)
{
std::vector unique;
auto indices = split(unique);
serializer.template vector(unique);
serializer(indices);
if (!serializer.isSerializing())
reconstruct(unique, indices);
}
private:
std::vector< T > m_data;
size_t initial_range;
std::vector split(std::vector& unique) const {
std::vector idxVec;
idxVec.reserve(m_data.size() + 1);
for (const auto& w : m_data) {
auto candidate = std::find(unique.begin(), unique.end(), w);
size_t idx = candidate - unique.begin();
if (candidate == unique.end()) {
unique.push_back(w);
idx = unique.size() - 1;
}
idxVec.push_back(idx);
}
idxVec.push_back(initial_range);
return idxVec;
}
void reconstruct(const std::vector& unique,
const std::vector& idxVec) {
m_data.clear();
m_data.reserve(idxVec.size() - 1);
for (size_t i = 0; i < idxVec.size() - 1; ++i)
m_data.push_back(unique[idxVec[i]]);
initial_range = idxVec.back();
}
};
}
#endif