diff --git a/src/nfa/accel_dfa_build_strat.cpp b/src/nfa/accel_dfa_build_strat.cpp index 4bd83a52..2320c756 100644 --- a/src/nfa/accel_dfa_build_strat.cpp +++ b/src/nfa/accel_dfa_build_strat.cpp @@ -33,9 +33,11 @@ #include "nfagraph/ng_limex_accel.h" #include "shufticompile.h" #include "trufflecompile.h" +#include "util/accel_scheme.h" #include "util/charreach.h" #include "util/container.h" #include "util/dump_charclass.h" +#include "util/small_vector.h" #include "util/verify_types.h" #include @@ -49,16 +51,15 @@ namespace ue2 { namespace { struct path { - vector reach; + small_vector reach; dstate_id_t dest = DEAD_STATE; - explicit path(dstate_id_t base) : dest(base) { - } + explicit path(dstate_id_t base) : dest(base) {} }; }; -static -void dump_paths(const vector &paths) { - for (UNUSED const auto &p : paths) { +template +void dump_paths(const Container &paths) { + for (UNUSED const path &p : paths) { DEBUG_PRINTF("[%s] -> %u\n", describeClasses(p.reach).c_str(), p.dest); } DEBUG_PRINTF("%zu paths\n", paths.size()); @@ -113,14 +114,14 @@ void extend(const raw_dfa &rdfa, const path &p, } else { path pp = append(p, CharReach(), p.dest); all[p.dest].push_back(pp); - out.push_back(pp); + out.push_back(move(pp)); } } if (!s.reports_eod.empty()) { path pp = append(p, CharReach(), p.dest); all[p.dest].push_back(pp); - out.push_back(pp); + out.push_back(move(pp)); } map dest; @@ -140,7 +141,7 @@ void extend(const raw_dfa &rdfa, const path &p, DEBUG_PRINTF("----good: [%s] -> %u\n", describeClasses(pp.reach).c_str(), pp.dest); all[e.first].push_back(pp); - out.push_back(pp); + out.push_back(move(pp)); } } @@ -162,8 +163,10 @@ vector> generate_paths(const raw_dfa &rdfa, dump_paths(paths); vector> rv; + rv.reserve(paths.size()); for (auto &p : paths) { - rv.push_back(move(p.reach)); + rv.push_back(vector(std::make_move_iterator(p.reach.begin()), + std::make_move_iterator(p.reach.end()))); } return rv; } diff --git a/src/util/dump_charclass.cpp b/src/util/dump_charclass.cpp index 4c159ec2..4535777d 100644 --- a/src/util/dump_charclass.cpp +++ b/src/util/dump_charclass.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, Intel Corporation + * Copyright (c) 2015-2017, Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -249,15 +249,6 @@ string describeClass(const CharReach &cr, size_t maxLength, return oss.str(); } -string describeClasses(const std::vector &v, size_t maxClassLength, - enum cc_output_t out_type) { - std::ostringstream oss; - for (const auto &cr : v) { - describeClass(oss, cr, maxClassLength, out_type); - } - return oss.str(); -} - // C stdio wrapper void describeClass(FILE *f, const CharReach &cr, size_t maxLength, enum cc_output_t out_type) { diff --git a/src/util/dump_charclass.h b/src/util/dump_charclass.h index 45b707f1..99964134 100644 --- a/src/util/dump_charclass.h +++ b/src/util/dump_charclass.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, Intel Corporation + * Copyright (c) 2015-2017, Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -37,6 +37,7 @@ #include #include +#include #include #include @@ -55,9 +56,16 @@ void describeClass(std::ostream &os, const CharReach &cr, size_t maxLength = 16, std::string describeClass(const CharReach &cr, size_t maxLength = 16, enum cc_output_t out_type = CC_OUT_TEXT); -std::string describeClasses(const std::vector &v, +template +std::string describeClasses(const Container &container, size_t maxClassLength = 16, - enum cc_output_t out_type = CC_OUT_TEXT); + enum cc_output_t out_type = CC_OUT_TEXT) { + std::ostringstream oss; + for (const CharReach &cr : container) { + describeClass(oss, cr, maxClassLength, out_type); + } + return oss.str(); +} void describeClass(FILE *f, const CharReach &cr, size_t maxLength, enum cc_output_t out_type);