From: Ulya Trofimovich Date: Tue, 21 Apr 2015 14:49:15 +0000 (+0100) Subject: Continued adding "--skeleton" switch. X-Git-Tag: 0.15~289 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=014b82d19f164b0474226aac7463cd79845aef6d;p=re2c Continued adding "--skeleton" switch. Use RAII-style object to auto-decrement visit counter when leaving local scope. --- diff --git a/re2c/skeleton.cc b/re2c/skeleton.cc index 7237215d..569b6785 100644 --- a/re2c/skeleton.cc +++ b/re2c/skeleton.cc @@ -59,24 +59,21 @@ uint32_t Skeleton::estimate_paths_count (SkeletonState * s, uint32_t count) } 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 @@ -97,7 +94,7 @@ void generate_paths_all (SkeletonState * s, const std::vector & prefixes, } 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 zs; @@ -111,7 +108,6 @@ void generate_paths_all (SkeletonState * s, const std::vector & prefixes, } generate_paths_all (i->first, zs, results); } - --s->visited; } } @@ -126,7 +122,7 @@ void generate_paths_cover (SkeletonState * s, const std::vector & prefixes } else if (s->visited < 2) { - ++s->visited; + SkeletonState::visit _ (s->visited); if (s->path != NULL) { std::vector zs (prefixes); @@ -160,7 +156,6 @@ void generate_paths_cover (SkeletonState * s, const std::vector & prefixes } } } - --s->visited; } } diff --git a/re2c/skeleton.h b/re2c/skeleton.h index 3cee73b1..09317291 100644 --- a/re2c/skeleton.h +++ b/re2c/skeleton.h @@ -47,9 +47,24 @@ struct Path } }; +template +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 > go_t; + typedef local_increment_t visit; + go_t go; uint32_t rule; uint8_t visited;