void print(const dynamic_bitset<>& items, ostream& out) { out << "{ "; for(dynamic_bitset<>::size_type i = items.find_first(); i != items.npos; i = items.find_next(i)){ out << i << " "; } out << "} -- " << items.count() << endl; }
static std::string dumpStates(const dynamic_bitset<> &s) { std::ostringstream oss; for (size_t i = s.find_first(); i != s.npos; i = s.find_next(i)) { oss << i << " "; } return oss.str(); }
static flat_set<NFAVertex> getVertices(const dynamic_bitset<> &in, const vector<StateInfo> &info) { flat_set<NFAVertex> out; for (size_t i = in.find_first(); i != in.npos; i = in.find_next(i)) { out.insert(info[i].vertex); } return out; }
static void step(const NGHolder &g, const vector<StateInfo> &info, const dynamic_bitset<> &in, dynamic_bitset<> *out) { out->reset(); for (size_t i = in.find_first(); i != in.npos; i = in.find_next(i)) { NFAVertex u = info[i].vertex; for (auto v : adjacent_vertices_range(u, g)) { out->set(g[v].index); } } }
typename allocator<T>::size_type allocator<T>::find_free_memory(const dynamic_bitset & memfree, dynamic_bitset & mask) { /* search mask in memfree */ const size_type needed_mem_size = mask.count(); if (memfree.count() < needed_mem_size) { # if DEBUG_SMA_TRACE_FIND_FREE_MEM std::cout << "not enough free memory found" << std::endl; # endif return memfree.size(); } assert(needed_mem_size <= memfree.size()); const size_type asize = memfree.size() - needed_mem_size; size_type pos = 0; while (pos <= asize) { # if DEBUG_SMA_TRACE_FIND_FREE_MEM std::cout << "pos: " << pos << "/" << asize << std::endl; std::cout << "mask: " << mask << std::endl; std::cout << "memfree: " << memfree << std::endl; # endif /* check if enough memory is free in interval [pos, pos+needed_mem_size) */ if ((memfree & mask) == mask) { /* free memory found */ # if DEBUG_SMA_TRACE_FIND_FREE_MEM std::cout << "free memory found at pos=" << pos << std::endl; # endif return pos; } else { /* increment pos for next iteration */ # if DEBUG_SMA_TRACE_FIND_FREE_MEM std::cout << "memfree: " << memfree << " " << memfree << std::endl; std::cout << "inc mask: " << mask << " -> "; # endif const size_type oldpos = pos; pos = memfree.find_next(oldpos); assert(pos >= oldpos); mask <<= pos - oldpos; # if DEBUG_SMA_TRACE_FIND_FREE_MEM std::cout << mask << std::endl; std::cout << "pos: " << oldpos << " -> " << pos << std::endl; # endif assert(mask.count() == needed_mem_size); } } /* no free memory found */ # if DEBUG_SMA_TRACE_FIND_FREE_MEM std::cout << "not enough free memory found" << std::endl; # endif return memfree.size(); }