24 #include "kernel_iterator.h"
41 template<
typename key_t_,
typename value_t_ >
44 using value_type = value_t_;
46 enum state_type { VALID, MARKED, EMPTY, EXCLUDED };
48 kernel_element() : value(
nullptr), state{kernel_element::EMPTY} { }
57 value = std::move(other.value);
79 template<
typename key_type,
typename value_type>
84 using kernel_key_type = key_type;
87 using const_iterator =
iterator const;
91 bool readonly =
false;
94 std::vector<kernel_element> m_data;
95 std::vector<key_type> m_data_freelist;
96 std::vector<key_type> m_data_marked_for_deletion;
108 assert(k >= 0 || !
"looked up with negative element");
109 assert((
int)k < m_data.size() || !
"k out of range");
120 if (m_data_freelist.size()==0){
121 key = (
unsigned int)m_data.size();
122 m_data.emplace_back();
123 return m_data.back();
125 key = (
unsigned int)m_data_freelist.back();
126 m_data_freelist.pop_back();
140 m_data.reserve(reservedSize);
153 size_t size()
const {
return m_data.size() - m_data_freelist.size(); }
174 template<
typename... Values>
181 assert(cur.state != kernel_element::VALID || !
"Cannot create new element, duplicate key.");
182 assert(cur.state != kernel_element::MARKED || !
"Attempted to overwrite a marked element.");
183 assert(cur.state != kernel_element::EXCLUDED || !
"Attempted to overwrite an excluded element.");
185 cur.value = value_type{isMesh, values...};
186 cur.state = kernel_element::VALID;
193 const_iterator
end()
const
195 return iterator(
this, key_type{(
unsigned int)m_data.size()});
205 for (;i<m_data.size();i++){
206 if (m_data[i].state == kernel_element::VALID){
223 assert (p.state == kernel_element::VALID || p.state == kernel_element::EXCLUDED || !
"Attempted to remove a non-valid element!");
224 if (p.state != kernel_element::VALID && p.state != kernel_element::EXCLUDED )
229 p.state = kernel_element::MARKED;
230 m_data_marked_for_deletion.push_back(k);
252 m_data_freelist.clear();
253 m_data_marked_for_deletion.clear();
276 if (k>=m_data.size()){
294 value_type &
get(key_type k)
297 assert(tmp.state == kernel_element::VALID || tmp.state == kernel_element::EXCLUDED);
308 const value_type &
get(key_type k)
const
310 return const_cast<kernel_type *
>(
this)->
get(k);
317 return (
char*)m_data.data();
329 if (tmp.state == kernel_element::VALID || tmp.state == kernel_element::EXCLUDED )
return true;
338 if (tmp.state == kernel_element::EXCLUDED )
return true;
348 std::vector<key_type> deletedKeys = m_data_marked_for_deletion;
349 for (
auto key : m_data_marked_for_deletion){
350 auto & p = m_data[key];
353 p.state = kernel_element::EMPTY;
354 m_data_freelist.push_back(key);
356 m_data_marked_for_deletion.clear();
360 void revert_excluded(){
362 for (
auto &e : m_data){
363 if (e.state == kernel_element::state_type::EXCLUDED){
364 e.state = kernel_element::state_type::VALID;
369 void exclude_using_include_set(std::set<key_type> include_set){
371 for (
unsigned int i=0;i<m_data.size();i++){
374 if (e.state == kernel_element::state_type::VALID){
375 if (include_set.find(k) == include_set.end()) {
376 e.state = kernel_element::state_type::EXCLUDED;
void erase(key_type const &k)
Definition: kernel.h:219
size_t size() const
Definition: kernel.h:153
Definition: kernel_iterator.h:22
bool is_excluded(key_type k)
Definition: kernel.h:336
char * data()
Definition: kernel.h:316
~kernel()
Definition: kernel.h:146
size_t capacity() const
Definition: kernel.h:159
key_type key() const
Definition: kernel_iterator.h:52
void erase(const iterator &it)
Definition: kernel.h:239
void clear()
Definition: kernel.h:248
std::vector< key_type > garbage_collect()
Definition: kernel.h:389
kernel(size_t reservedSize=64)
Definition: kernel.h:138
iterator find_iterator(key_type k)
Definition: kernel.h:261
bool is_valid(key_type k)
Definition: kernel.h:326
const_iterator create(ISMesh *isMesh, Values...values)
Definition: kernel.h:175
bool empty()
Definition: kernel.h:164
iterator find_valid_iterator(key_type k)
Definition: kernel.h:274
const_iterator end() const
Definition: kernel.h:193
std::vector< key_type > commit_all()
Definition: kernel.h:345
const_iterator begin() const
Definition: kernel.h:201