/* * * Copyright (c) 2002 * John Maddock * * Use, modification and distribution are subject to the * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ #include #include #include "regex_comparison.hpp" #ifdef BOOST_HAS_POSIX #include #include "regex.h" namespace posix{ double time_match(const std::string& re, const std::string& text, bool icase) { regex_t e; regmatch_t what[20]; boost::timer tim; int iter = 1; int counter, repeats; double result = 0; double run; if(0 != ::regcomp(&e, re.c_str(), (icase ? REG_ICASE | REG_EXTENDED : REG_EXTENDED))) return -1; do { tim.restart(); for(counter = 0; counter < iter; ++counter) { regexec(&e, text.c_str(), e.re_nsub, what, 0); } result = tim.elapsed(); iter *= 2; }while(result < 0.5); iter /= 2; // repeat test and report least value for consistency: for(repeats = 0; repeats < REPEAT_COUNT; ++repeats) { tim.restart(); for(counter = 0; counter < iter; ++counter) { regexec(&e, text.c_str(), e.re_nsub, what, 0); } run = tim.elapsed(); result = (std::min)(run, result); } regfree(&e); return result / iter; } double time_find_all(const std::string& re, const std::string& text, bool icase) { regex_t e; regmatch_t what[20]; memset(what, 0, sizeof(what)); boost::timer tim; int iter = 1; int counter, repeats; double result = 0; double run; int exec_result; int matches; if(0 != regcomp(&e, re.c_str(), (icase ? REG_ICASE | REG_EXTENDED : REG_EXTENDED))) return -1; do { tim.restart(); for(counter = 0; counter < iter; ++counter) { what[0].rm_so = 0; what[0].rm_eo = text.size(); matches = 0; exec_result = regexec(&e, text.c_str(), 20, what, REG_STARTEND); while(exec_result == 0) { ++matches; what[0].rm_so = what[0].rm_eo; what[0].rm_eo = text.size(); exec_result = regexec(&e, text.c_str(), 20, what, REG_STARTEND); } } result = tim.elapsed(); iter *= 2; }while(result < 0.5); iter /= 2; if(result >10) return result / iter; result = DBL_MAX; // repeat test and report least value for consistency: for(repeats = 0; repeats < REPEAT_COUNT; ++repeats) { tim.restart(); for(counter = 0; counter < iter; ++counter) { what[0].rm_so = 0; what[0].rm_eo = text.size(); matches = 0; exec_result = regexec(&e, text.c_str(), 20, what, REG_STARTEND); while(exec_result == 0) { ++matches; what[0].rm_so = what[0].rm_eo; what[0].rm_eo = text.size(); exec_result = regexec(&e, text.c_str(), 20, what, REG_STARTEND); } } run = tim.elapsed(); result = (std::min)(run, result); } return result / iter; } } #else namespace posix{ double time_match(const std::string& re, const std::string& text, bool icase) { return -1; } double time_find_all(const std::string& re, const std::string& text, bool icase) { return -1; } } #endif