struct powerset_iterator : public boost::iterator_facade<powerset_iterator<Iterator>, const std::vector<Iterator>,
boost::forward_traversal_tag> {
powerset_iterator() = default;
- powerset_iterator(powerset_iterator<Iterator>&) noexcept = default;
- powerset_iterator(powerset_iterator<Iterator>&&) noexcept = default;
- powerset_iterator<Iterator>& operator=(powerset_iterator<Iterator>&&) noexcept = default;
- powerset_iterator<Iterator>& operator=(const powerset_iterator<Iterator>&) noexcept = default;
explicit powerset_iterator(Iterator begin, Iterator end = Iterator());
private:
std::optional<subsets_iterator<Iterator>> current_subset_iter = std::nullopt;
std::optional<subsets_iterator<Iterator>> current_subset_iter_end = std::nullopt;
- const std::vector<Iterator> empty_subset = std::vector<Iterator>();
-
// boost::iterator_facade<...> interface to implement
void increment();
bool equal(const powerset_iterator<Iterator>& other) const;
if (current_subset_iter.has_value()) {
return *current_subset_iter.value();
}
+ static const std::vector<Iterator> empty_subset;
return empty_subset;
}
template <typename Iterator> void powerset_iterator<Iterator>::increment()
{
- if (!current_subset_iter.has_value() || !current_subset_iter_end.has_value() || !current_subset_iter.has_value() ||
- !iterator_end.has_value()) {
+ if (not current_subset_iter.has_value() || not current_subset_iter_end.has_value() ||
+ not current_subset_iter.has_value() || not iterator_end.has_value()) {
return; // We've traversed all subsets at this point, or we're the "last" iterator
}