]> granicus.if.org Git - re2c/commitdiff
Moved path-combining magic closer to path definition.
authorUlya Trofimovich <skvadrik@gmail.com>
Sun, 4 Oct 2015 18:46:34 +0000 (19:46 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Sun, 4 Oct 2015 18:46:34 +0000 (19:46 +0100)
re2c/src/codegen/skeleton/generate_data.cc
re2c/src/codegen/skeleton/path.h

index a2b716cd8d219957a95116be2d53153e8c1ce687..6e039f924a354e5d9a621b10c04ddad1095b55cf 100644 (file)
@@ -336,14 +336,7 @@ template <typename cunit_t, typename key_t>
                delete [] buffer;
 
                // keys
-               const bool none = suffix.match ().is_none ();
-               const size_t len_match = none
-                       ? prefix.len_matching ()
-                       : prefix_len + suffix.len_matching ();
-               const rule_rank_t match = none
-                       ? prefix.match ()
-                       : suffix.match ();
-               keygen<key_t> (keys, count, len, len_match, match);
+               keygen<key_t> (keys, count, len, len_matching (prefix, suffix), match (prefix, suffix));
        }
 
        return size;
index c3476989fa08c984f2a3a81f25a54711223d28e5..c30471d4da83a67fd48580456067f11cd4d9fef5 100644 (file)
@@ -57,8 +57,29 @@ public:
                }
                arcs.insert (arcs.end (), p->arcs.begin (), p->arcs.end ());
        }
+
+       template <typename arc1_t, typename arc2_t>
+               friend size_t len_matching (const generic_path_t<arc1_t> & prefix, const generic_path_t<arc2_t> & suffix);
+       template <typename arc1_t, typename arc2_t>
+               friend rule_rank_t match (const generic_path_t<arc1_t> & prefix, const generic_path_t<arc2_t> & suffix);
 };
 
+template <typename arc1_t, typename arc2_t>
+       size_t len_matching (const generic_path_t<arc1_t> & prefix, const generic_path_t<arc2_t> & suffix)
+{
+       return suffix.rule.is_none ()
+               ? prefix.rule_pos
+               : prefix.arcs.size () + suffix.rule_pos;
+}
+
+template <typename arc1_t, typename arc2_t>
+       rule_rank_t match (const generic_path_t<arc1_t> & prefix, const generic_path_t<arc2_t> & suffix)
+{
+       return suffix.match ().is_none ()
+               ? prefix.match ()
+               : suffix.match ();
+}
+
 typedef generic_path_t<uint32_t> path_t;
 
 typedef std::vector<uint32_t> multiarc_t;