}
else if (s->visited < 2)
{
- ++s->visited;
+ SkeletonState::visit _ (s->visited);
uint64_t result = 0;
for (SkeletonState::go_t::iterator i = s->go.begin (); i != s->go.end (); ++i)
{
const uint64_t new_count = i->second.size () * count;
if (new_count >= MAX_PATHS)
{
- result = MAX_PATHS;
- break;
+ return MAX_PATHS;
}
result += estimate_paths_count (i->first, new_count);
if (result >= MAX_PATHS)
{
- result = MAX_PATHS;
- break;
+ return MAX_PATHS;
}
}
- --s->visited;
return result;
}
else
}
else if (s->visited < 2)
{
- ++s->visited;
+ SkeletonState::visit _ (s->visited);
for (SkeletonState::go_t::iterator i = s->go.begin (); i != s->go.end (); ++i)
{
std::vector<Path> zs;
}
generate_paths_all (i->first, zs, results);
}
- --s->visited;
}
}
}
else if (s->visited < 2)
{
- ++s->visited;
+ SkeletonState::visit _ (s->visited);
if (s->path != NULL)
{
std::vector<Path> zs (prefixes);
}
}
}
- --s->visited;
}
}
}
};
+template <typename counter_t>
+struct local_increment_t
+{
+ counter_t & counter;
+ inline explicit local_increment_t (counter_t & c)
+ : counter (++c)
+ {}
+ inline ~local_increment_t ()
+ {
+ --counter;
+ }
+};
+
struct SkeletonState
{
typedef std::map<SkeletonState *, std::vector<uint32_t> > go_t;
+ typedef local_increment_t<uint8_t> visit;
+
go_t go;
uint32_t rule;
uint8_t visited;