]> granicus.if.org Git - re2c/commitdiff
Continued adding "--skeleton" switch.
authorUlya Trofimovich <skvadrik@gmail.com>
Tue, 21 Apr 2015 14:49:15 +0000 (15:49 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Tue, 21 Apr 2015 14:49:15 +0000 (15:49 +0100)
Use RAII-style object to auto-decrement visit counter when
leaving local scope.

re2c/skeleton.cc
re2c/skeleton.h

index 7237215d77c0e7fe4b5ebe9b349b18e5565331da..569b6785547f45af78c4a0a3c89666b50a27e260 100644 (file)
@@ -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<Path> & 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<Path> zs;
@@ -111,7 +108,6 @@ void generate_paths_all (SkeletonState * s, const std::vector<Path> & prefixes,
                        }
                        generate_paths_all (i->first, zs, results);
                }
-               --s->visited;
        }
 }
 
@@ -126,7 +122,7 @@ void generate_paths_cover (SkeletonState * s, const std::vector<Path> & prefixes
        }
        else if (s->visited < 2)
        {
-               ++s->visited;
+               SkeletonState::visit _ (s->visited);
                if (s->path != NULL)
                {
                        std::vector<Path> zs (prefixes);
@@ -160,7 +156,6 @@ void generate_paths_cover (SkeletonState * s, const std::vector<Path> & prefixes
                                }
                        }
                }
-               --s->visited;
        }
 }
 
index 3cee73b1ca0a3d687e7d138fa5e2df84ae28715f..09317291730a1984338a0fdef929bd3aefd5ea4a 100644 (file)
@@ -47,9 +47,24 @@ struct Path
        }
 };
 
+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;