12#ifndef MCRL2_ATERMPP_SHARED_SUBSET_H
13#define MCRL2_ATERMPP_SHARED_SUBSET_H
15#include <boost/iterator/iterator_facade.hpp>
95 return down_cast<aterm_int>((*
this)[0]).value();
100 return bdd_node(down_cast<aterm>((*
this)[1]));
105 return bdd_node(down_cast<aterm>((*
this)[2]));
116 class iterator:
public boost::iterator_facade<iterator, T, boost::forward_traversal_tag>
142 operator bool()
const
144 return m_index != (std::size_t)(-1);
168 std::vector<bdd_node> path_stack;
182 path_stack.push_back(node);
196 if (path_stack.empty())
204 bit = path_stack.back().
bit();
211 for (std::size_t i = start.
bit() + 1; i < bit; i++)
213 if (!(
m_index & ((std::size_t)1 << i)))
215 m_index |= ((std::size_t)1 << i);
216 m_index &= ~(((std::size_t)1 << i) - 1);
227 if (path_stack.empty())
234 node = path_stack.back();
235 path_stack.pop_back();
238 m_index |= ((std::size_t)1 << bit);
239 m_index &= ~(((std::size_t)1 << bit) - 1);
266 std::size_t index = 0;
269 assert(i.index() == index++);
271 assert(index ==
m_set->size());
275 template <
class Predicate>
280 std::vector<bdd_node> trees;
282 std::size_t completed = 0;
287 std::size_t target = i.index();
289 for (
int bit =
highest_bit(target); bit >= 0; bit--)
291 if ((target & ((std::size_t)1 << bit)) && !(completed & ((std::size_t)1 << bit)))
294 for (
int j = 0; j < bit; j++)
298 if (completed & ((std::size_t)1 << j))
301 false_node = trees[j];
308 if (true_node == false_node)
314 tree =
bdd_node(j, true_node, false_node);
318 completed |= ((std::size_t)1 << bit);
319 completed &= ~(((std::size_t)1 << bit) - 1);
325 for (bit = 0; target & ((std::size_t)1 << bit); bit++)
327 if (tree != trees[bit])
329 tree =
bdd_node(bit, tree, trees[bit]);
333 completed = target + 1;
337 if (completed != ((std::size_t)1 <<
m_bits))
340 for (std::size_t j = 0; j <
m_bits; j++)
344 if (completed & ((std::size_t)1 << j))
347 false_node = trees[j];
354 if (true_node == false_node)
360 tree =
bdd_node(j, true_node, false_node);
371 while (i != set.
end() && !p(*i))
375 while (i != set.
end() && j !=
end())
380 while (i != set.
end() && !p(*i))
385 assert (i == set.
end() && j ==
end());
Term containing an integer.
An integer term stores a single std::size_t value. It carries no arguments.
Term containing a string.
const function_symbol & function() const
Returns the function symbol belonging to an aterm.
bdd_node(std::size_t bit, const bdd_node &true_node, const bdd_node &false_node)
bdd_node(const atermpp::aterm &t)
bool equal(iterator const &other) const
iterator(const shared_subset &subset)
std::size_t index() const
const shared_subset< T > * m_subset
friend class boost::iterator_core_access
Stores a subset of a given base set using maximum sharing.
shared_subset(std::vector< T > &set)
Constructor.
shared_subset(const shared_subset< T > &set, Predicate p)
static atermpp::function_symbol & get_node()
static atermpp::aterm_string & get_true()
static atermpp::aterm_string & get_false()
The main namespace for the aterm++ library.
static int highest_bit(std::size_t x)