## include/boost/regex/v5/basic_regex_creator.hpp

98.4% Lines (793/806) 89.2% List of functions (331/372)
basic_regex_creator.hpp
f(x) Functions (372)
Function Calls Lines Blocks
boost::re_detail_600::digraph<char32_t>::digraph() :45 0 0.0% 0.0% boost::re_detail_600::digraph<char>::digraph() :45 732017x 100.0% 100.0% boost::re_detail_600::digraph<int>::digraph() :45 98908x 100.0% 100.0% boost::re_detail_600::digraph<wchar_t>::digraph() :45 88658x 100.0% 100.0% boost::re_detail_600::digraph<char32_t>::digraph(char32_t) :46 0 0.0% 0.0% boost::re_detail_600::digraph<char>::digraph(char) :46 726493x 100.0% 100.0% boost::re_detail_600::digraph<int>::digraph(int) :46 93094x 100.0% 100.0% boost::re_detail_600::digraph<wchar_t>::digraph(wchar_t) :46 83152x 100.0% 100.0% boost::re_detail_600::digraph<char32_t>::digraph(boost::re_detail_600::digraph<char32_t> const&) :49 0 0.0% 0.0% boost::re_detail_600::digraph<char>::digraph(boost::re_detail_600::digraph<char> const&) :49 871237x 100.0% 100.0% boost::re_detail_600::digraph<int>::digraph(boost::re_detail_600::digraph<int> const&) :49 132190x 100.0% 100.0% boost::re_detail_600::digraph<wchar_t>::digraph(boost::re_detail_600::digraph<wchar_t> const&) :49 118577x 100.0% 100.0% boost::re_detail_600::digraph<char32_t>::operator=(boost::re_detail_600::digraph<char32_t> const&) :50 0 0.0% 0.0% boost::re_detail_600::digraph<char>::operator=(boost::re_detail_600::digraph<char> const&) :50 724285x 100.0% 100.0% boost::re_detail_600::digraph<int>::operator=(boost::re_detail_600::digraph<int> const&) :50 90334x 100.0% 100.0% boost::re_detail_600::digraph<wchar_t>::operator=(boost::re_detail_600::digraph<wchar_t> const&) :50 80944x 100.0% 100.0% <unknown function 69> :69 – – – boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::basic_char_set() :69 92929x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::basic_char_set() :69 83640x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::basic_char_set() :69 188x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::basic_char_set() :69 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::basic_char_set() :69 83532x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::basic_char_set() :69 40608x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::basic_char_set() :69 31128x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::basic_char_set() :69 19x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::add_single(boost::re_detail_600::digraph<char> const&) :78 254700x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::add_single(boost::re_detail_600::digraph<char> const&) :78 246720x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::add_single(boost::re_detail_600::digraph<char> const&) :78 153x 83.3% 75.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::add_single(boost::re_detail_600::digraph<char32_t> const&) :78 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::add_single(boost::re_detail_600::digraph<int> const&) :78 81812x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::add_single(boost::re_detail_600::digraph<wchar_t> const&) :78 40812x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::add_single(boost::re_detail_600::digraph<wchar_t> const&) :78 32352x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::add_single(boost::re_detail_600::digraph<wchar_t> const&) :78 0 0.0% 0.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::add_range(boost::re_detail_600::digraph<char> const&, boost::re_detail_600::digraph<char> const&) :85 58681x 64.7% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::add_range(boost::re_detail_600::digraph<char> const&, boost::re_detail_600::digraph<char> const&) :85 57696x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::add_range(boost::re_detail_600::digraph<char> const&, boost::re_detail_600::digraph<char> const&) :85 3x 63.6% 71.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::add_range(boost::re_detail_600::digraph<char32_t> const&, boost::re_detail_600::digraph<char32_t> const&) :85 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::add_range(boost::re_detail_600::digraph<int> const&, boost::re_detail_600::digraph<int> const&) :85 9914x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::add_range(boost::re_detail_600::digraph<wchar_t> const&, boost::re_detail_600::digraph<wchar_t> const&) :85 4968x 64.7% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::add_range(boost::re_detail_600::digraph<wchar_t> const&, boost::re_detail_600::digraph<wchar_t> const&) :85 3936x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::add_range(boost::re_detail_600::digraph<wchar_t> const&, boost::re_detail_600::digraph<wchar_t> const&) :85 1x 63.6% 71.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::add_class(unsigned int) :101 16896x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::add_class(unsigned int) :101 12432x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::add_class(unsigned int) :101 136x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::add_class(unsigned int) :101 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::add_class(unsigned long) :101 36561x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::add_class(unsigned int) :101 17184x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::add_class(unsigned int) :101 12624x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::add_class(unsigned int) :101 18x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::add_negated_class(unsigned int) :106 360x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::add_negated_class(unsigned int) :106 240x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::add_negated_class(unsigned int) :106 0 0.0% 0.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::add_negated_class(unsigned int) :106 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::add_negated_class(unsigned long) :106 600x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::add_negated_class(unsigned int) :106 360x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::add_negated_class(unsigned int) :106 240x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::add_negated_class(unsigned int) :106 0 0.0% 0.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::add_equivalent(boost::re_detail_600::digraph<char> const&) :111 216x 28.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::add_equivalent(boost::re_detail_600::digraph<char> const&) :111 192x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::add_equivalent(boost::re_detail_600::digraph<char> const&) :111 0 0.0% 0.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::add_equivalent(boost::re_detail_600::digraph<char32_t> const&) :111 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::add_equivalent(boost::re_detail_600::digraph<int> const&) :111 496x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::add_equivalent(boost::re_detail_600::digraph<wchar_t> const&) :111 216x 28.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::add_equivalent(boost::re_detail_600::digraph<wchar_t> const&) :111 192x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::add_equivalent(boost::re_detail_600::digraph<wchar_t> const&) :111 0 0.0% 0.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::negate() :121 53772x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::negate() :121 52140x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::negate() :121 53x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::negate() :121 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::negate() :121 15910x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::negate() :121 7980x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::negate() :121 6348x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::negate() :121 7x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::has_digraphs() const :130 94105x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::has_digraphs() const :130 84456x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::has_digraphs() const :130 188x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::has_digraphs() const :130 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::has_digraphs() const :130 161208x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::has_digraphs() const :130 78624x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::has_digraphs() const :130 60240x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::has_digraphs() const :130 38x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::is_negated() const :134 91633x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::is_negated() const :134 82632x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::is_negated() const :134 188x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::is_negated() const :134 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::is_negated() const :134 80604x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::is_negated() const :134 39312x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::is_negated() const :134 30120x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::is_negated() const :134 19x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::singles_begin() const :140 94105x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::singles_begin() const :140 84456x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::singles_begin() const :140 188x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::singles_begin() const :140 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::singles_begin() const :140 161208x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::singles_begin() const :140 78624x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::singles_begin() const :140 60240x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::singles_begin() const :140 38x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::singles_end() const :144 94105x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::singles_end() const :144 84456x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::singles_end() const :144 188x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::singles_end() const :144 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::singles_end() const :144 161208x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::singles_end() const :144 78624x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::singles_end() const :144 60240x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::singles_end() const :144 38x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::ranges_begin() const :148 94105x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::ranges_begin() const :148 84456x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::ranges_begin() const :148 188x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::ranges_begin() const :148 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::ranges_begin() const :148 161208x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::ranges_begin() const :148 78624x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::ranges_begin() const :148 60240x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::ranges_begin() const :148 38x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::ranges_end() const :152 94105x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::ranges_end() const :152 84456x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::ranges_end() const :152 188x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::ranges_end() const :152 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::ranges_end() const :152 161208x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::ranges_end() const :152 78624x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::ranges_end() const :152 60240x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::ranges_end() const :152 38x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::equivalents_begin() const :156 94021x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::equivalents_begin() const :156 84384x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::equivalents_begin() const :156 188x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::equivalents_begin() const :156 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::equivalents_begin() const :156 160992x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::equivalents_begin() const :156 78540x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::equivalents_begin() const :156 60168x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::equivalents_begin() const :156 38x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::equivalents_end() const :160 94021x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::equivalents_end() const :160 84384x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::equivalents_end() const :160 188x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::equivalents_end() const :160 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::equivalents_end() const :160 160992x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::equivalents_end() const :160 78540x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::equivalents_end() const :160 60168x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::equivalents_end() const :160 38x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::classes() const :164 91585x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::classes() const :164 82584x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::classes() const :164 188x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::classes() const :164 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::classes() const :164 80604x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::classes() const :164 39312x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::classes() const :164 30120x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::classes() const :164 19x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::negated_classes() const :168 91585x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::negated_classes() const :168 82584x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::negated_classes() const :168 188x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::negated_classes() const :168 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::negated_classes() const :168 80604x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::negated_classes() const :168 39312x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::negated_classes() const :168 30120x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::negated_classes() const :168 19x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> >::empty() const :172 1080x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> >::empty() const :172 864x 100.0% 100.0% boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::empty() const :172 15x 100.0% 100.0% boost::re_detail_600::basic_char_set<char32_t, char32_traits>::empty() const :172 0 0.0% 0.0% boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits>::empty() const :172 2283x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> >::empty() const :172 1080x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> >::empty() const :172 864x 100.0% 100.0% boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::empty() const :172 0 0.0% 0.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::getoffset(void*) :192 1790800x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::getoffset(void*) :192 1487561x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::getoffset(void*) :192 16625x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::getoffset(void*) :192 9x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::getoffset(void*) :192 2439344x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::getoffset(void*) :192 1247419x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::getoffset(void*) :192 931265x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::getoffset(void*) :192 427x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::getoffset(void const*, void const*) :196 1790800x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::getoffset(void const*, void const*) :196 1487561x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::getoffset(void const*, void const*) :196 16625x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::getoffset(void const*, void const*) :196 9x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::getoffset(void const*, void const*) :196 2439344x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::getoffset(void const*, void const*) :196 1247419x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::getoffset(void const*, void const*) :196 931265x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::getoffset(void const*, void const*) :196 427x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::getaddress(long) :200 436679x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::getaddress(long) :200 363385x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::getaddress(long) :200 6342x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::getaddress(long) :200 7x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::getaddress(long) :200 644251x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::getaddress(long) :200 329881x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::getaddress(long) :200 247081x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::getaddress(long) :200 117x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::getaddress(long, void*) :204 1774931x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::getaddress(long, void*) :204 1483765x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::getaddress(long, void*) :204 18786x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::getaddress(long, void*) :204 9x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::getaddress(long, void*) :204 2341361x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::getaddress(long, void*) :204 1200363x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::getaddress(long, void*) :204 896437x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::getaddress(long, void*) :204 412x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::init(unsigned int) :208 71884x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::init(unsigned int) :208 55500x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::init(unsigned int) :208 78x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::init(unsigned int) :208 1x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::init(unsigned int) :208 152732x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::init(unsigned int) :208 72313x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::init(unsigned int) :208 55716x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::init(unsigned int) :208 11x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::flags() :213 2448160x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::flags() :213 2169384x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::flags() :213 5129x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::flags() :213 1x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::flags() :213 2141209x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::flags() :213 1087737x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::flags() :213 814104x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::flags() :213 370x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::flags(unsigned int) :217 193486x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::flags(unsigned int) :217 154191x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::flags(unsigned int) :217 243x 80.0% 67.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::flags(unsigned int) :217 1x 80.0% 67.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::flags(unsigned int) :217 321277x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::flags(unsigned int) :217 158632x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::flags(unsigned int) :217 118791x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::flags(unsigned int) :217 41x 80.0% 67.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::append_state(boost::re_detail_600::syntax_element_type) :226 87129x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::append_state(boost::re_detail_600::syntax_element_type) :226 66204x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::append_state(boost::re_detail_600::syntax_element_type) :226 131x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::append_state(boost::re_detail_600::syntax_element_type) :226 1x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::append_state(boost::re_detail_600::syntax_element_type) :226 178880x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::append_state(boost::re_detail_600::syntax_element_type) :226 87638x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::append_state(boost::re_detail_600::syntax_element_type) :226 66492x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::append_state(boost::re_detail_600::syntax_element_type) :226 22x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::basic_regex_creator(boost::re_detail_600::regex_data<char, boost::c_regex_traits<char> >*) :268 71884x 100.0% 74.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::basic_regex_creator(boost::re_detail_600::regex_data<char, boost::cpp_regex_traits<char> >*) :268 55500x 100.0% 74.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::basic_regex_creator(boost::re_detail_600::regex_data<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >*) :268 78x 100.0% 74.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::basic_regex_creator(boost::re_detail_600::regex_data<char32_t, char32_traits>*) :268 1x 100.0% 71.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::basic_regex_creator(boost::re_detail_600::regex_data<int, boost::icu_regex_traits>*) :268 152732x 100.0% 74.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::basic_regex_creator(boost::re_detail_600::regex_data<wchar_t, boost::c_regex_traits<wchar_t> >*) :268 72313x 100.0% 74.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::basic_regex_creator(boost::re_detail_600::regex_data<wchar_t, boost::cpp_regex_traits<wchar_t> >*) :268 55716x 100.0% 74.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::basic_regex_creator(boost::re_detail_600::regex_data<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >*) :268 11x 100.0% 71.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::append_state(boost::re_detail_600::syntax_element_type, unsigned long) :293 904665x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::append_state(boost::re_detail_600::syntax_element_type, unsigned long) :293 743201x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::append_state(boost::re_detail_600::syntax_element_type, unsigned long) :293 4795x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::append_state(boost::re_detail_600::syntax_element_type, unsigned long) :293 3x 90.0% 90.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::append_state(boost::re_detail_600::syntax_element_type, unsigned long) :293 1279702x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::append_state(boost::re_detail_600::syntax_element_type, unsigned long) :293 649712x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::append_state(boost::re_detail_600::syntax_element_type, unsigned long) :293 486041x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::append_state(boost::re_detail_600::syntax_element_type, unsigned long) :293 176x 90.0% 90.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::insert_state(long, boost::re_detail_600::syntax_element_type, unsigned long) :312 170488x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::insert_state(long, boost::re_detail_600::syntax_element_type, unsigned long) :312 145380x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::insert_state(long, boost::re_detail_600::syntax_element_type, unsigned long) :312 2587x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::insert_state(long, boost::re_detail_600::syntax_element_type, unsigned long) :312 0 0.0% 0.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::insert_state(long, boost::re_detail_600::syntax_element_type, unsigned long) :312 198399x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::insert_state(long, boost::re_detail_600::syntax_element_type, unsigned long) :312 100860x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::insert_state(long, boost::re_detail_600::syntax_element_type, unsigned long) :312 75348x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::insert_state(long, boost::re_detail_600::syntax_element_type, unsigned long) :312 42x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::append_literal(char) :331 269254x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::append_literal(char) :331 217433x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::append_literal(char) :331 2565x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::append_literal(char32_t) :331 8x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::append_literal(int) :331 400469x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::append_literal(wchar_t) :331 208349x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::append_literal(wchar_t) :331 156089x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::append_literal(wchar_t) :331 23x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::append_set(boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> > const&) :356 91633x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::append_set(boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> > const&) :356 82632x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::append_set(boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&) :356 188x 100.0% 75.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::append_set(boost::re_detail_600::basic_char_set<char32_t, char32_traits> const&) :356 0 0.0% 0.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::append_set(boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits> const&) :356 80604x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::append_set(boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> > const&) :356 39312x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::append_set(boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> > const&) :356 30120x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::append_set(boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > > const&) :356 19x 100.0% 75.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::append_set(boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> > const&, std::integral_constant<bool, false>*) :366 2472x 94.0% 92.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::append_set(boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> > const&, std::integral_constant<bool, false>*) :366 1824x 95.1% 92.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::append_set(boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, std::integral_constant<bool, false>*) :366 0 0.0% 0.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::append_set(boost::re_detail_600::basic_char_set<char32_t, char32_traits> const&, std::integral_constant<bool, false>*) :366 0 0.0% 0.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::append_set(boost::re_detail_600::basic_char_set<int, boost::icu_regex_traits> const&, std::integral_constant<bool, false>*) :366 80604x 95.1% 92.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::append_set(boost::re_detail_600::basic_char_set<wchar_t, boost::c_regex_traits<wchar_t> > const&, std::integral_constant<bool, false>*) :366 39312x 97.6% 99.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::append_set(boost::re_detail_600::basic_char_set<wchar_t, boost::cpp_regex_traits<wchar_t> > const&, std::integral_constant<bool, false>*) :366 30120x 97.6% 99.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::append_set(boost::re_detail_600::basic_char_set<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > > const&, std::integral_constant<bool, false>*) :366 19x 54.9% 42.0% boost::re_detail_600::char_less(char, char) :515 114088x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::append_set(boost::re_detail_600::basic_char_set<char, boost::c_regex_traits<char> > const&, std::integral_constant<bool, true>*) :525 89161x 97.2% 96.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::append_set(boost::re_detail_600::basic_char_set<char, boost::cpp_regex_traits<char> > const&, std::integral_constant<bool, true>*) :525 80808x 97.2% 96.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::append_set(boost::re_detail_600::basic_char_set<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, std::integral_constant<bool, true>*) :525 188x 58.3% 42.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::finalize(char const*, char const*) :666 63766x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::finalize(char const*, char const*) :666 49242x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::finalize(char const*, char const*) :666 68x 92.9% 86.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::finalize(char32_t const*, char32_t const*) :666 1x 78.6% 71.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::finalize(int const*, int const*) :666 134090x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::finalize(wchar_t const*, wchar_t const*) :666 64195x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::finalize(wchar_t const*, wchar_t const*) :666 49458x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::finalize(wchar_t const*, wchar_t const*) :666 11x 78.6% 71.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::fixup_pointers(boost::re_detail_600::re_syntax_base*) :713 63616x 95.5% 94.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::fixup_pointers(boost::re_detail_600::re_syntax_base*) :713 49164x 95.5% 94.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::fixup_pointers(boost::re_detail_600::re_syntax_base*) :713 68x 95.5% 94.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::fixup_pointers(boost::re_detail_600::re_syntax_base*) :713 1x 40.9% 50.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::fixup_pointers(boost::re_detail_600::re_syntax_base*) :713 133724x 95.5% 94.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::fixup_pointers(boost::re_detail_600::re_syntax_base*) :713 64045x 95.5% 94.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::fixup_pointers(boost::re_detail_600::re_syntax_base*) :713 49380x 95.5% 94.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::fixup_pointers(boost::re_detail_600::re_syntax_base*) :713 11x 72.7% 72.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::fixup_recursions(boost::re_detail_600::re_syntax_base*) :752 5964x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::fixup_recursions(boost::re_detail_600::re_syntax_base*) :752 4776x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::fixup_recursions(boost::re_detail_600::re_syntax_base*) :752 1x 57.4% 37.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::fixup_recursions(boost::re_detail_600::re_syntax_base*) :752 0 0.0% 0.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::fixup_recursions(boost::re_detail_600::re_syntax_base*) :752 12600x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::fixup_recursions(boost::re_detail_600::re_syntax_base*) :752 6216x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::fixup_recursions(boost::re_detail_600::re_syntax_base*) :752 4944x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::fixup_recursions(boost::re_detail_600::re_syntax_base*) :752 0 0.0% 0.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::create_startmaps(boost::re_detail_600::re_syntax_base*) :888 63124x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::create_startmaps(boost::re_detail_600::re_syntax_base*) :888 48732x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::create_startmaps(boost::re_detail_600::re_syntax_base*) :888 68x 79.5% 49.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::create_startmaps(boost::re_detail_600::re_syntax_base*) :888 1x 20.5% 20.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::create_startmaps(boost::re_detail_600::re_syntax_base*) :888 132428x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::create_startmaps(boost::re_detail_600::re_syntax_base*) :888 63553x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::create_startmaps(boost::re_detail_600::re_syntax_base*) :888 48948x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::create_startmaps(boost::re_detail_600::re_syntax_base*) :888 11x 54.5% 40.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::calculate_backstep(boost::re_detail_600::re_syntax_base*) :978 1656x 82.1% 82.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::calculate_backstep(boost::re_detail_600::re_syntax_base*) :978 1104x 83.1% 82.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::calculate_backstep(boost::re_detail_600::re_syntax_base*) :978 2x 48.1% 52.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::calculate_backstep(boost::re_detail_600::re_syntax_base*) :978 0 0.0% 0.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::calculate_backstep(boost::re_detail_600::re_syntax_base*) :978 2832x 89.6% 89.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::calculate_backstep(boost::re_detail_600::re_syntax_base*) :978 1656x 88.5% 89.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::calculate_backstep(boost::re_detail_600::re_syntax_base*) :978 1104x 89.6% 89.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::calculate_backstep(boost::re_detail_600::re_syntax_base*) :978 0 0.0% 0.0% boost::re_detail_600::recursion_saver::recursion_saver(std::vector<unsigned char, std::allocator<unsigned char> >*) :1102 2020488x 100.0% 100.0% boost::re_detail_600::recursion_saver::~recursion_saver() :1103 2020488x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::create_startmap(boost::re_detail_600::re_syntax_base*, unsigned char*, unsigned int*, unsigned char, unsigned int) :1110 460499x 89.6% 92.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::create_startmap(boost::re_detail_600::re_syntax_base*, unsigned char*, unsigned int*, unsigned char, unsigned int) :1110 376509x 95.6% 92.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::create_startmap(boost::re_detail_600::re_syntax_base*, unsigned char*, unsigned int*, unsigned char, unsigned int) :1110 6048x 75.7% 40.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::create_startmap(boost::re_detail_600::re_syntax_base*, unsigned char*, unsigned int*, unsigned char, unsigned int) :1110 1x 12.7% 11.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::create_startmap(boost::re_detail_600::re_syntax_base*, unsigned char*, unsigned int*, unsigned char, unsigned int) :1110 623161x 93.9% 91.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::create_startmap(boost::re_detail_600::re_syntax_base*, unsigned char*, unsigned int*, unsigned char, unsigned int) :1110 319618x 88.1% 91.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::create_startmap(boost::re_detail_600::re_syntax_base*, unsigned char*, unsigned int*, unsigned char, unsigned int) :1110 234525x 93.9% 91.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::create_startmap(boost::re_detail_600::re_syntax_base*, unsigned char*, unsigned int*, unsigned char, unsigned int) :1110 127x 46.4% 37.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::get_restart_type(boost::re_detail_600::re_syntax_base*) :1439 63025x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::get_restart_type(boost::re_detail_600::re_syntax_base*) :1439 48633x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::get_restart_type(boost::re_detail_600::re_syntax_base*) :1439 68x 77.8% 75.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::get_restart_type(boost::re_detail_600::re_syntax_base*) :1439 1x 55.6% 67.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::get_restart_type(boost::re_detail_600::re_syntax_base*) :1439 132329x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::get_restart_type(boost::re_detail_600::re_syntax_base*) :1439 63454x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::get_restart_type(boost::re_detail_600::re_syntax_base*) :1439 48849x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::get_restart_type(boost::re_detail_600::re_syntax_base*) :1439 11x 66.7% 75.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::set_all_masks(unsigned char*, unsigned char) :1469 80462x 44.4% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::set_all_masks(unsigned char*, unsigned char) :1469 58630x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::set_all_masks(unsigned char*, unsigned char) :1469 1326x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::set_all_masks(unsigned char*, unsigned char) :1469 0 0.0% 0.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::set_all_masks(unsigned char*, unsigned char) :1469 148428x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::set_all_masks(unsigned char*, unsigned char) :1469 77039x 44.4% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::set_all_masks(unsigned char*, unsigned char) :1469 55006x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::set_all_masks(unsigned char*, unsigned char) :1469 20x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::is_bad_repeat(boost::re_detail_600::re_syntax_base*) :1490 51156x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::is_bad_repeat(boost::re_detail_600::re_syntax_base*) :1490 34776x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::is_bad_repeat(boost::re_detail_600::re_syntax_base*) :1490 608x 88.9% 83.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::is_bad_repeat(boost::re_detail_600::re_syntax_base*) :1490 0 0.0% 0.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::is_bad_repeat(boost::re_detail_600::re_syntax_base*) :1490 84710x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::is_bad_repeat(boost::re_detail_600::re_syntax_base*) :1490 50004x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::is_bad_repeat(boost::re_detail_600::re_syntax_base*) :1490 33624x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::is_bad_repeat(boost::re_detail_600::re_syntax_base*) :1490 14x 88.9% 83.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::set_bad_repeat(boost::re_detail_600::re_syntax_base*) :1512 31140x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::set_bad_repeat(boost::re_detail_600::re_syntax_base*) :1512 21432x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::set_bad_repeat(boost::re_detail_600::re_syntax_base*) :1512 397x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::set_bad_repeat(boost::re_detail_600::re_syntax_base*) :1512 0 0.0% 0.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::set_bad_repeat(boost::re_detail_600::re_syntax_base*) :1512 51350x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::set_bad_repeat(boost::re_detail_600::re_syntax_base*) :1512 29988x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::set_bad_repeat(boost::re_detail_600::re_syntax_base*) :1512 20280x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::set_bad_repeat(boost::re_detail_600::re_syntax_base*) :1512 14x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::get_repeat_type(boost::re_detail_600::re_syntax_base*) :1534 164183x 94.1% 92.0% boost::re_detail_600::basic_regex_creator<char, boost::cpp_regex_traits<char> >::get_repeat_type(boost::re_detail_600::re_syntax_base*) :1534 140095x 94.1% 92.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::get_repeat_type(boost::re_detail_600::re_syntax_base*) :1534 2573x 76.5% 62.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::get_repeat_type(boost::re_detail_600::re_syntax_base*) :1534 0 0.0% 0.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::get_repeat_type(boost::re_detail_600::re_syntax_base*) :1534 187246x 88.2% 92.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::get_repeat_type(boost::re_detail_600::re_syntax_base*) :1534 94555x 88.2% 92.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::cpp_regex_traits<wchar_t> >::get_repeat_type(boost::re_detail_600::re_syntax_base*) :1534 70063x 88.2% 92.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::regex_traits<wchar_t, boost::cpp_regex_traits<wchar_t> > >::get_repeat_type(boost::re_detail_600::re_syntax_base*) :1534 42x 70.6% 69.0% boost::re_detail_600::basic_regex_creator<char, boost::c_regex_traits<char> >::probe_leading_repeat(boost::re_detail_600::re_syntax_base*) :1563 13193x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::probe_leading_repeat(boost::re_detail_600::re_syntax_base*) :1563 57x 95.5% 71.0% boost::re_detail_600::basic_regex_creator<char32_t, char32_traits>::probe_leading_repeat(boost::re_detail_600::re_syntax_base*) :1563 1x 36.4% 47.0% boost::re_detail_600::basic_regex_creator<int, boost::icu_regex_traits>::probe_leading_repeat(boost::re_detail_600::re_syntax_base*) :1563 132321x 100.0% 100.0% boost::re_detail_600::basic_regex_creator<wchar_t, boost::c_regex_traits<wchar_t> >::probe_leading_repeat(boost::re_detail_600::re_syntax_base*) :1563 13388x 100.0% 100.0%

Line | TLA | Hits | Source Code
--- | --- | --- | ---
1 |  |  | /*
2 |  |  | *
3 |  |  | * Copyright (c) 2004
4 |  |  | * John Maddock
5 |  |  | *
6 |  |  | * Use, modification and distribution are subject to the
7 |  |  | * Boost Software License, Version 1.0. (See accompanying file
8 |  |  | * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 |  |  | *
10 |  |  | */
11 |  |  |
12 |  |  | /*
13 |  |  | * LOCATION: see http://www.boost.org for most recent version.
14 |  |  | * FILE basic_regex_creator.cpp
15 |  |  | * VERSION see <boost/version.hpp>
16 |  |  | * DESCRIPTION: Declares template class basic_regex_creator which fills in
17 |  |  | * the data members of a regex_data object.
18 |  |  | */
19 |  |  |
20 |  |  | #ifndef BOOST_REGEX_V5_BASIC_REGEX_CREATOR_HPP
21 |  |  | #define BOOST_REGEX_V5_BASIC_REGEX_CREATOR_HPP
22 |  |  |
23 |  |  | #ifdef BOOST_REGEX_MSVC
24 |  |  | # pragma warning(push)
25 |  |  | #pragma warning(disable:4459)
26 |  |  | #if BOOST_REGEX_MSVC < 1910
27 |  |  | #pragma warning(disable:4800)
28 |  |  | #endif
29 |  |  | #endif
30 |  |  |
31 |  |  | #include <boost/regex/v5/basic_regex.hpp>
32 |  |  |
33 |  |  | #ifndef BOOST_REGEX_AS_MODULE
34 |  |  | #include <vector>
35 |  |  | #include <set>
36 |  |  | #endif
37 |  |  |
38 |  |  | namespace boost{
39 |  |  |
40 |  |  | namespace BOOST_REGEX_DETAIL_NS{
41 |  |  |
42 |  |  | template <class charT>
43 |  |  | struct digraph : public std::pair<charT, charT>
44 |  |  | {
45 |  | 919583x | digraph() : std::pair<charT, charT>(charT(0), charT(0)){}
46 |  | 902739x | digraph(charT c1) : std::pair<charT, charT>(c1, charT(0)){}
47 |  |  | digraph(charT c1, charT c2) : std::pair<charT, charT>(c1, c2)
48 |  |  | {}
49 |  | 1122004x | digraph(const digraph<charT>& d) : std::pair<charT, charT>(d.first, d.second){}
50 |  | 895563x | digraph<charT>& operator=(const digraph<charT>&) = default;
51 |  |  | template <class Seq>
52 |  |  | digraph(const Seq& s) : std::pair<charT, charT>()
53 |  |  | {
54 |  |  | BOOST_REGEX_ASSERT(s.size() <= 2);
55 |  |  | BOOST_REGEX_ASSERT(s.size());
56 |  |  | this->first = s[0];
57 |  |  | this->second = (s.size() > 1) ? s[1] : 0;
58 |  |  | }
59 |  |  | };
60 |  |  |
61 |  |  | template <class charT, class traits>
62 |  |  | class basic_char_set
63 |  |  | {
64 |  |  | public:
65 |  |  | typedef digraph<charT> digraph_type;
66 |  |  | typedef typename traits::string_type string_type;
67 |  |  | typedef typename traits::char_class_type m_type;
68 |  |  |
69 |  | 332044x | basic_char_set()
70 |  | 332044x | {
71 |  | 332044x | m_negate = false;
72 |  | 332044x | m_has_digraphs = false;
73 |  | 332044x | m_classes = 0;
74 |  | 332044x | m_negated_classes = 0;
75 |  | 332044x | m_empty = true;
76 |  | 332044x | }
77 |  |  |
78 |  | 656549x | void add_single(const digraph_type& s)
79 |  |  | {
80 |  | 656549x | m_singles.insert(s);
81 |  | 656549x | if(s.second)
82 |  | 13368x | m_has_digraphs = true;
83 |  | 656549x | m_empty = false;
84 |  | 656549x | }
85 |  | 135199x | void add_range(const digraph_type& first, const digraph_type& end)
86 |  |  | {
87 |  | 135199x | m_ranges.push_back(first);
88 |  | 135199x | m_ranges.push_back(end);
89 |  | 135199x | if(first.second)
90 |  |  | {
91 |  | 2352x | m_has_digraphs = true;
92 |  | 2352x | add_single(first);
93 |  |  | }
94 |  | 135199x | if(end.second)
95 |  |  | {
96 |  | 1200x | m_has_digraphs = true;
97 |  | 1200x | add_single(end);
98 |  |  | }
99 |  | 135199x | m_empty = false;
100 |  | 135199x | }
101 |  | 95851x | void add_class(m_type m)
102 |  |  | {
103 |  | 95851x | m_classes |= m;
104 |  | 95851x | m_empty = false;
105 |  | 95851x | }
106 |  | 1800x | void add_negated_class(m_type m)
107 |  |  | {
108 |  | 1800x | m_negated_classes |= m;
109 |  | 1800x | m_empty = false;
110 |  | 1800x | }
111 |  | 1312x | void add_equivalent(const digraph_type& s)
112 |  |  | {
113 |  | 1312x | m_equivalents.insert(s);
114 |  | 1312x | if(s.second)
115 |  |  | {
116 |  | 348x | m_has_digraphs = true;
117 |  | 348x | add_single(s);
118 |  |  | }
119 |  | 1312x | m_empty = false;
120 |  | 1312x | }
121 |  | 136210x | void negate()
122 |  |  | {
123 |  | 136210x | m_negate = true;
124 |  |  | //m_empty = false;
125 |  | 136210x | }
126 |  |  |
127 |  |  | //
128 |  |  | // accessor functions:
129 |  |  | //
130 |  | 478859x | bool has_digraphs()const
131 |  |  | {
132 |  | 478859x | return m_has_digraphs;
133 |  |  | }
134 |  | 324508x | bool is_negated()const
135 |  |  | {
136 |  | 324508x | return m_negate;
137 |  |  | }
138 |  |  | typedef typename std::vector<digraph_type>::const_iterator list_iterator;
139 |  |  | typedef typename std::set<digraph_type>::const_iterator set_iterator;
140 |  | 478859x | set_iterator singles_begin()const
141 |  |  | {
142 |  | 478859x | return m_singles.begin();
143 |  |  | }
144 |  | 478859x | set_iterator singles_end()const
145 |  |  | {
146 |  | 478859x | return m_singles.end();
147 |  |  | }
148 |  | 478859x | list_iterator ranges_begin()const
149 |  |  | {
150 |  | 478859x | return m_ranges.begin();
151 |  |  | }
152 |  | 478859x | list_iterator ranges_end()const
153 |  |  | {
154 |  | 478859x | return m_ranges.end();
155 |  |  | }
156 |  | 478331x | set_iterator equivalents_begin()const
157 |  |  | {
158 |  | 478331x | return m_equivalents.begin();
159 |  |  | }
160 |  | 478331x | set_iterator equivalents_end()const
161 |  |  | {
162 |  | 478331x | return m_equivalents.end();
163 |  |  | }
164 |  | 324412x | m_type classes()const
165 |  |  | {
166 |  | 324412x | return m_classes;
167 |  |  | }
168 |  | 324412x | m_type negated_classes()const
169 |  |  | {
170 |  | 324412x | return m_negated_classes;
171 |  |  | }
172 |  | 6186x | bool empty()const
173 |  |  | {
174 |  | 6186x | return m_empty;
175 |  |  | }
176 |  |  | private:
177 |  |  | std::set<digraph_type> m_singles; // a list of single characters to match
178 |  |  | std::vector<digraph_type> m_ranges; // a list of end points of our ranges
179 |  |  | bool m_negate; // true if the set is to be negated
180 |  |  | bool m_has_digraphs; // true if we have digraphs present
181 |  |  | m_type m_classes; // character classes to match
182 |  |  | m_type m_negated_classes; // negated character classes to match
183 |  |  | bool m_empty; // whether we've added anything yet
184 |  |  | std::set<digraph_type> m_equivalents; // a list of equivalence classes
185 |  |  | };
186 |  |  |
187 |  |  | template <class charT, class traits>
188 |  |  | class basic_regex_creator
189 |  |  | {
190 |  |  | public:
191 |  |  | basic_regex_creator(regex_data<charT, traits>* data);
192 |  | 7913450x | std::ptrdiff_t getoffset(void* addr)
193 |  |  | {
194 |  | 7913450x | return getoffset(addr, m_pdata->m_data.data());
195 |  |  | }
196 |  | 7913450x | std::ptrdiff_t getoffset(const void* addr, const void* base)
197 |  |  | {
198 |  | 7913450x | return static_cast<const char*>(addr) - static_cast<const char*>(base);
199 |  |  | }
200 |  | 2027743x | re_syntax_base* getaddress(std::ptrdiff_t off)
201 |  |  | {
202 |  | 2027743x | return getaddress(off, m_pdata->m_data.data());
203 |  |  | }
204 |  | 7716064x | re_syntax_base* getaddress(std::ptrdiff_t off, void* base)
205 |  |  | {
206 |  | 7716064x | return static_cast<re_syntax_base*>(static_cast<void*>(static_cast<char*>(base) + off));
207 |  |  | }
208 |  | 408235x | void init(unsigned l_flags)
209 |  |  | {
210 |  | 408235x | m_pdata->m_flags = l_flags;
211 |  | 408235x | m_icase = l_flags & regex_constants::icase;
212 |  | 408235x | }
213 |  | 8666094x | regbase::flag_type flags()
214 |  |  | {
215 |  | 8666094x | return m_pdata->m_flags;
216 |  |  | }
217 |  | 946662x | void flags(regbase::flag_type f)
218 |  |  | {
219 |  | 946662x | m_pdata->m_flags = f;
220 |  | 946662x | if(m_icase != static_cast<bool>(f & regbase::icase))
221 |  |  | {
222 |  | 42037x | m_icase = static_cast<bool>(f & regbase::icase);
223 |  |  | }
224 |  | 946662x | }
225 |  |  | re_syntax_base* append_state(syntax_element_type t, std::size_t s);
226 |  | 486497x | re_syntax_base* append_state(syntax_element_type t) { return append_state(t, sizeof(re_syntax_base)); }
227 |  |  | re_syntax_base* insert_state(std::ptrdiff_t pos, syntax_element_type t, std::size_t s);
228 |  |  | re_syntax_base* insert_state(std::ptrdiff_t pos, syntax_element_type t) { return insert_state(pos, t, sizeof(re_syntax_base)); }
229 |  |  | re_literal* append_literal(charT c);
230 |  |  | re_syntax_base* append_set(const basic_char_set<charT, traits>& char_set);
231 |  |  | re_syntax_base* append_set(const basic_char_set<charT, traits>& char_set, std::integral_constant<bool, false>*);
232 |  |  | re_syntax_base* append_set(const basic_char_set<charT, traits>& char_set, std::integral_constant<bool, true>*);
233 |  |  | void finalize(const charT* p1, const charT* p2);
234 |  |  | protected:
235 |  |  | regex_data<charT, traits>* m_pdata; // pointer to the basic_regex_data struct we are filling in
236 |  |  | const ::boost::regex_traits_wrapper<traits>&
237 |  |  | m_traits; // convenience reference to traits class
238 |  |  | re_syntax_base* m_last_state; // the last state we added
239 |  |  | bool m_icase; // true for case insensitive matches
240 |  |  | unsigned m_repeater_id; // the state_id of the next repeater
241 |  |  | bool m_has_backrefs; // true if there are actually any backrefs
242 |  |  | std::uintmax_t m_bad_repeats; // bitmask of repeats we can't deduce a startmap for;
243 |  |  | bool m_has_recursions; // set when we have recursive expressions to fixup
244 |  |  | std::vector<unsigned char> m_recursion_checks; // notes which recursions we've followed while analysing this expression
245 |  |  | typename traits::char_class_type m_word_mask; // mask used to determine if a character is a word character
246 |  |  | typename traits::char_class_type m_mask_space; // mask used to determine if a character is a word character
247 |  |  | typename traits::char_class_type m_lower_mask; // mask used to determine if a character is a lowercase character
248 |  |  | typename traits::char_class_type m_upper_mask; // mask used to determine if a character is an uppercase character
249 |  |  | typename traits::char_class_type m_alpha_mask; // mask used to determine if a character is an alphabetic character
250 |  |  | private:
251 |  |  | basic_regex_creator& operator=(const basic_regex_creator&);
252 |  |  | basic_regex_creator(const basic_regex_creator&);
253 |  |  |
254 |  |  | void fixup_pointers(re_syntax_base* state);
255 |  |  | void fixup_recursions(re_syntax_base* state);
256 |  |  | void create_startmaps(re_syntax_base* state);
257 |  |  | int calculate_backstep(re_syntax_base* state);
258 |  |  | void create_startmap(re_syntax_base* state, unsigned char* l_map, unsigned int* pnull, unsigned char mask, unsigned recursion_count = 0);
259 |  |  | unsigned get_restart_type(re_syntax_base* state);
260 |  |  | void set_all_masks(unsigned char* bits, unsigned char);
261 |  |  | bool is_bad_repeat(re_syntax_base* pt);
262 |  |  | void set_bad_repeat(re_syntax_base* pt);
263 |  |  | syntax_element_type get_repeat_type(re_syntax_base* state);
264 |  |  | void probe_leading_repeat(re_syntax_base* state);
265 |  |  | };
266 |  |  |
267 |  |  | template <class charT, class traits>
268 |  | 408235x | basic_regex_creator<charT, traits>::basic_regex_creator(regex_data<charT, traits>* data)
269 |  | 408235x | : m_pdata(data), m_traits(*(data->m_ptraits)), m_last_state(0), m_icase(false), m_repeater_id(0),
270 |  | 408235x | m_has_backrefs(false), m_bad_repeats(0), m_has_recursions(false), m_word_mask(0), m_mask_space(0), m_lower_mask(0), m_upper_mask(0), m_alpha_mask(0)
271 |  |  | {
272 |  | 408235x | m_pdata->m_data.clear();
273 |  | 408235x | m_pdata->m_status = ::boost::regex_constants::error_ok;
274 |  |  | static const charT w = 'w';
275 |  |  | static const charT s = 's';
276 |  |  | static const charT l[5] = { 'l', 'o', 'w', 'e', 'r', };
277 |  |  | static const charT u[5] = { 'u', 'p', 'p', 'e', 'r', };
278 |  |  | static const charT a[5] = { 'a', 'l', 'p', 'h', 'a', };
279 |  | 408235x | m_word_mask = m_traits.lookup_classname(&w, &w +1);
280 |  | 408235x | m_mask_space = m_traits.lookup_classname(&s, &s +1);
281 |  | 408235x | m_lower_mask = m_traits.lookup_classname(l, l + 5);
282 |  | 408235x | m_upper_mask = m_traits.lookup_classname(u, u + 5);
283 |  | 408235x | m_alpha_mask = m_traits.lookup_classname(a, a + 5);
284 |  | 408235x | m_pdata->m_word_mask = m_word_mask;
285 |  | 408235x | BOOST_REGEX_ASSERT(m_word_mask != 0);
286 |  | 408235x | BOOST_REGEX_ASSERT(m_mask_space != 0);
287 |  | 408235x | BOOST_REGEX_ASSERT(m_lower_mask != 0);
288 |  | 408235x | BOOST_REGEX_ASSERT(m_upper_mask != 0);
289 |  | 408235x | BOOST_REGEX_ASSERT(m_alpha_mask != 0);
290 |  | 408235x | }
291 |  |  |
292 |  |  | template <class charT, class traits>
293 |  | 4068295x | re_syntax_base* basic_regex_creator<charT, traits>::append_state(syntax_element_type t, std::size_t s)
294 |  |  | {
295 |  |  | // if the state is a backref then make a note of it:
296 |  | 4068295x | if(t == syntax_element_backref)
297 |  | 16417x | this->m_has_backrefs = true;
298 |  |  | // append a new state, start by aligning our last one:
299 |  | 4068295x | m_pdata->m_data.align();
300 |  |  | // set the offset to the next state in our last one:
301 |  | 4068295x | if(m_last_state)
302 |  | 3661404x | m_last_state->next.i = m_pdata->m_data.size() - getoffset(m_last_state);
303 |  |  | // now actually extend our data:
304 |  | 4068295x | m_last_state = static_cast<re_syntax_base*>(m_pdata->m_data.extend(s));
305 |  |  | // fill in boilerplate options in the new state:
306 |  | 4068295x | m_last_state->next.i = 0;
307 |  | 4068295x | m_last_state->type = t;
308 |  | 4068295x | return m_last_state;
309 |  |  | }
310 |  |  |
311 |  |  | template <class charT, class traits>
312 |  | 693104x | re_syntax_base* basic_regex_creator<charT, traits>::insert_state(std::ptrdiff_t pos, syntax_element_type t, std::size_t s)
313 |  |  | {
314 |  |  | // append a new state, start by aligning our last one:
315 |  | 693104x | m_pdata->m_data.align();
316 |  |  | // set the offset to the next state in our last one:
317 |  | 693104x | if(m_last_state)
318 |  | 693104x | m_last_state->next.i = m_pdata->m_data.size() - getoffset(m_last_state);
319 |  |  | // remember the last state position:
320 |  | 693104x | std::ptrdiff_t off = getoffset(m_last_state) + s;
321 |  |  | // now actually insert our data:
322 |  | 693104x | re_syntax_base* new_state = static_cast<re_syntax_base*>(m_pdata->m_data.insert(pos, s));
323 |  |  | // fill in boilerplate options in the new state:
324 |  | 693104x | new_state->next.i = s;
325 |  | 693104x | new_state->type = t;
326 |  | 693104x | m_last_state = getaddress(off);
327 |  | 693104x | return new_state;
328 |  |  | }
329 |  |  |
330 |  |  | template <class charT, class traits>
331 |  | 1254190x | re_literal* basic_regex_creator<charT, traits>::append_literal(charT c)
332 |  |  | {
333 |  |  | re_literal* result;
334 |  |  | // start by seeing if we have an existing re_literal we can extend:
335 |  | 1254190x | if((0 == m_last_state) || (m_last_state->type != syntax_element_literal))
336 |  |  | {
337 |  |  | // no existing re_literal, create a new one:
338 |  | 830910x | result = static_cast<re_literal*>(append_state(syntax_element_literal, sizeof(re_literal) + sizeof(charT)));
339 |  | 830910x | result->length = 1;
340 |  | 830910x | *static_cast<charT*>(static_cast<void*>(result+1)) = m_traits.translate(c, m_icase);
341 |  |  | }
342 |  |  | else
343 |  |  | {
344 |  |  | // we have an existing re_literal, extend it:
345 |  | 423280x | std::ptrdiff_t off = getoffset(m_last_state);
346 |  | 423280x | m_pdata->m_data.extend(sizeof(charT));
347 |  | 423280x | m_last_state = result = static_cast<re_literal*>(getaddress(off));
348 |  | 423280x | charT* characters = static_cast<charT*>(static_cast<void*>(result+1));
349 |  | 423280x | characters[result->length] = m_traits.translate(c, m_icase);
350 |  | 423280x | result->length += 1;
351 |  |  | }
352 |  | 1254190x | return result;
353 |  |  | }
354 |  |  |
355 |  |  | template <class charT, class traits>
356 |  | 324508x | inline re_syntax_base* basic_regex_creator<charT, traits>::append_set(
357 |  |  | const basic_char_set<charT, traits>& char_set)
358 |  |  | {
359 |  |  | typedef std::integral_constant<bool, (sizeof(charT) == 1) > truth_type;
360 |  | 324508x | return char_set.has_digraphs()
361 |  | 324508x | ? append_set(char_set, static_cast<std::integral_constant<bool, false>*>(0))
362 |  | 324508x | : append_set(char_set, static_cast<truth_type*>(0));
363 |  |  | }
364 |  |  |
365 |  |  | template <class charT, class traits>
366 |  | 154351x | re_syntax_base* basic_regex_creator<charT, traits>::append_set(
367 |  |  | const basic_char_set<charT, traits>& char_set, std::integral_constant<bool, false>*)
368 |  |  | {
369 |  |  | typedef typename traits::string_type string_type;
370 |  |  | typedef typename basic_char_set<charT, traits>::list_iterator item_iterator;
371 |  |  | typedef typename basic_char_set<charT, traits>::set_iterator set_iterator;
372 |  |  | typedef typename traits::char_class_type m_type;
373 |  |  |
374 |  | 154351x | re_set_long<m_type>* result = static_cast<re_set_long<m_type>*>(append_state(syntax_element_long_set, sizeof(re_set_long<m_type>)));
375 |  |  | //
376 |  |  | // fill in the basics:
377 |  |  | //
378 |  | 154351x | result->csingles = static_cast<unsigned int>(std::distance(char_set.singles_begin(), char_set.singles_end()));
379 |  | 154351x | result->cranges = static_cast<unsigned int>(std::distance(char_set.ranges_begin(), char_set.ranges_end())) / 2;
380 |  | 154351x | result->cequivalents = static_cast<unsigned int>(std::distance(char_set.equivalents_begin(), char_set.equivalents_end()));
381 |  | 154351x | result->cclasses = char_set.classes();
382 |  | 154351x | result->cnclasses = char_set.negated_classes();
383 |  | 154351x | if(flags() & regbase::icase)
384 |  |  | {
385 |  |  | // adjust classes as needed:
386 |  | 9912x | if(((result->cclasses & m_lower_mask) == m_lower_mask) || ((result->cclasses & m_upper_mask) == m_upper_mask))
387 |  | 3180x | result->cclasses |= m_alpha_mask;
388 |  | 9912x | if(((result->cnclasses & m_lower_mask) == m_lower_mask) || ((result->cnclasses & m_upper_mask) == m_upper_mask))
389 |  | ✗ | result->cnclasses |= m_alpha_mask;
390 |  |  | }
391 |  |  |
392 |  | 154351x | result->isnot = char_set.is_negated();
393 |  | 154351x | result->singleton = !char_set.has_digraphs();
394 |  |  | //
395 |  |  | // remember where the state is for later:
396 |  |  | //
397 |  | 154351x | std::ptrdiff_t offset = getoffset(result);
398 |  |  | //
399 |  |  | // now extend with all the singles:
400 |  |  | //
401 |  | 154351x | item_iterator first, last;
402 |  | 154351x | set_iterator sfirst, slast;
403 |  | 154351x | sfirst = char_set.singles_begin();
404 |  | 154351x | slast = char_set.singles_end();
405 |  | 314667x | while(sfirst != slast)
406 |  |  | {
407 |  | 160316x | charT* p = static_cast<charT*>(this->m_pdata->m_data.extend(sizeof(charT) * (sfirst->first == static_cast<charT>(0) ? 1 : sfirst->second ? 3 : 2)));
408 |  | 160316x | p[0] = m_traits.translate(sfirst->first, m_icase);
409 |  | 160316x | if(sfirst->first == static_cast<charT>(0))
410 |  |  | {
411 |  | 264x | p[0] = 0;
412 |  |  | }
413 |  | 160052x | else if(sfirst->second)
414 |  |  | {
415 |  | 13176x | p[1] = m_traits.translate(sfirst->second, m_icase);
416 |  | 13176x | p[2] = 0;
417 |  |  | }
418 |  |  | else
419 |  | 146876x | p[1] = 0;
420 |  | 160316x | ++sfirst;
421 |  |  | }
422 |  |  | //
423 |  |  | // now extend with all the ranges:
424 |  |  | //
425 |  | 154351x | first = char_set.ranges_begin();
426 |  | 154351x | last = char_set.ranges_end();
427 |  | 194029x | while(first != last)
428 |  |  | {
429 |  |  | // first grab the endpoints of the range:
430 |  | 19839x | digraph<charT> c1 = *first;
431 |  | 19839x | c1.first = this->m_traits.translate(c1.first, this->m_icase);
432 |  | 19839x | c1.second = this->m_traits.translate(c1.second, this->m_icase);
433 |  | 19839x | ++first;
434 |  | 19839x | digraph<charT> c2 = *first;
435 |  | 19839x | c2.first = this->m_traits.translate(c2.first, this->m_icase);
436 |  | 19839x | c2.second = this->m_traits.translate(c2.second, this->m_icase);
437 |  | 19839x | ++first;
438 |  | 19839x | string_type s1, s2;
439 |  |  | // different actions now depending upon whether collation is turned on:
440 |  | 19839x | if(flags() & regex_constants::collate)
441 |  |  | {
442 |  |  | // we need to transform our range into sort keys:
443 |  | 4080x | charT a1[3] = { c1.first, c1.second, charT(0), };
444 |  | 4080x | charT a2[3] = { c2.first, c2.second, charT(0), };
445 |  | 4080x | s1 = this->m_traits.transform(a1, (a1[1] ? a1+2 : a1+1));
446 |  | 4080x | s2 = this->m_traits.transform(a2, (a2[1] ? a2+2 : a2+1));
447 |  | 4080x | if(s1.empty())
448 |  | 288x | s1 = string_type(1, charT(0));
449 |  | 4080x | if(s2.empty())
450 |  | 96x | s2 = string_type(1, charT(0));
451 |  |  | }
452 |  |  | else
453 |  |  | {
454 |  | 15759x | if(c1.second)
455 |  |  | {
456 |  | 1260x | s1.insert(s1.end(), c1.first);
457 |  | 1260x | s1.insert(s1.end(), c1.second);
458 |  |  | }
459 |  |  | else
460 |  | 28998x | s1 = string_type(1, c1.first);
461 |  | 15759x | if(c2.second)
462 |  |  | {
463 |  | 732x | s2.insert(s2.end(), c2.first);
464 |  | 732x | s2.insert(s2.end(), c2.second);
465 |  |  | }
466 |  |  | else
467 |  | 15027x | s2.insert(s2.end(), c2.first);
468 |  |  | }
469 |  | 19839x | if(s1 > s2)
470 |  |  | {
471 |  |  | // Oops error:
472 |  | 432x | return 0;
473 |  |  | }
474 |  | 19407x | charT* p = static_cast<charT*>(this->m_pdata->m_data.extend(sizeof(charT) * (s1.size() + s2.size() + 2) ) );
475 |  | 19407x | BOOST_REGEX_DETAIL_NS::copy(s1.begin(), s1.end(), p);
476 |  | 19407x | p[s1.size()] = charT(0);
477 |  | 19407x | p += s1.size() + 1;
478 |  | 19407x | BOOST_REGEX_DETAIL_NS::copy(s2.begin(), s2.end(), p);
479 |  | 19407x | p[s2.size()] = charT(0);
480 |  |  | }
481 |  |  | //
482 |  |  | // now process the equivalence classes:
483 |  |  | //
484 |  | 153919x | sfirst = char_set.equivalents_begin();
485 |  | 153919x | slast = char_set.equivalents_end();
486 |  | 155679x | while(sfirst != slast)
487 |  |  | {
488 |  | 880x | string_type s;
489 |  | 880x | if(sfirst->second)
490 |  |  | {
491 |  | 156x | charT cs[3] = { sfirst->first, sfirst->second, charT(0), };
492 |  | 156x | s = m_traits.transform_primary(cs, cs+2);
493 |  |  | }
494 |  |  | else
495 |  | 724x | s = m_traits.transform_primary(&sfirst->first, &sfirst->first+1);
496 |  | 880x | if(s.empty())
497 |  | ✗ | return 0; // invalid or unsupported equivalence class
498 |  | 880x | charT* p = static_cast<charT*>(this->m_pdata->m_data.extend(sizeof(charT) * (s.size()+1) ) );
499 |  | 880x | BOOST_REGEX_DETAIL_NS::copy(s.begin(), s.end(), p);
500 |  | 880x | p[s.size()] = charT(0);
501 |  | 880x | ++sfirst;
502 |  |  | }
503 |  |  | //
504 |  |  | // finally reset the address of our last state:
505 |  |  | //
506 |  | 153919x | m_last_state = result = static_cast<re_set_long<m_type>*>(getaddress(offset));
507 |  | 153919x | return result;
508 |  |  | }
509 |  |  |
510 |  |  | template<class T>
511 |  |  | inline bool char_less(T t1, T t2)
512 |  |  | {
513 |  |  | return t1 < t2;
514 |  |  | }
515 |  | 114088x | inline bool char_less(char t1, char t2)
516 |  |  | {
517 |  | 114088x | return static_cast<unsigned char>(t1) < static_cast<unsigned char>(t2);
518 |  |  | }
519 |  |  | inline bool char_less(signed char t1, signed char t2)
520 |  |  | {
521 |  |  | return static_cast<unsigned char>(t1) < static_cast<unsigned char>(t2);
522 |  |  | }
523 |  |  |
524 |  |  | template <class charT, class traits>
525 |  | 170157x | re_syntax_base* basic_regex_creator<charT, traits>::append_set(
526 |  |  | const basic_char_set<charT, traits>& char_set, std::integral_constant<bool, true>*)
527 |  |  | {
528 |  |  | typedef typename traits::string_type string_type;
529 |  |  | typedef typename basic_char_set<charT, traits>::list_iterator item_iterator;
530 |  |  | typedef typename basic_char_set<charT, traits>::set_iterator set_iterator;
531 |  |  |
532 |  | 170157x | re_set* result = static_cast<re_set*>(append_state(syntax_element_set, sizeof(re_set)));
533 |  | 170157x | bool negate = char_set.is_negated();
534 |  | 170157x | std::memset(result->_map, 0, sizeof(result->_map));
535 |  |  | //
536 |  |  | // handle singles first:
537 |  |  | //
538 |  | 170157x | item_iterator first, last;
539 |  | 170157x | set_iterator sfirst, slast;
540 |  | 170157x | sfirst = char_set.singles_begin();
541 |  | 170157x | slast = char_set.singles_end();
542 |  | 664714x | while(sfirst != slast)
543 |  |  | {
544 |  | 127101149x | for(unsigned int i = 0; i < (1 << CHAR_BIT); ++i)
545 |  |  | {
546 |  | 126606592x | if(this->m_traits.translate(static_cast<charT>(i), this->m_icase)
547 |  | 126606592x | == this->m_traits.translate(sfirst->first, this->m_icase))
548 |  | 495493x | result->_map[i] = true;
549 |  |  | }
550 |  | 494557x | ++sfirst;
551 |  |  | }
552 |  |  | //
553 |  |  | // OK now handle ranges:
554 |  |  | //
555 |  | 170157x | first = char_set.ranges_begin();
556 |  | 170157x | last = char_set.ranges_end();
557 |  | 285253x | while(first != last)
558 |  |  | {
559 |  |  | // first grab the endpoints of the range:
560 |  | 115192x | charT c1 = this->m_traits.translate(first->first, this->m_icase);
561 |  | 115192x | ++first;
562 |  | 115192x | charT c2 = this->m_traits.translate(first->first, this->m_icase);
563 |  | 115192x | ++first;
564 |  |  | // different actions now depending upon whether collation is turned on:
565 |  | 115192x | if(flags() & regex_constants::collate)
566 |  |  | {
567 |  |  | // we need to transform our range into sort keys:
568 |  | 1104x | charT c3[2] = { c1, charT(0), };
569 |  | 1104x | string_type s1 = this->m_traits.transform(c3, c3+1);
570 |  | 1104x | c3[0] = c2;
571 |  | 1104x | string_type s2 = this->m_traits.transform(c3, c3+1);
572 |  | 1104x | if(s1 > s2)
573 |  |  | {
574 |  |  | // Oops error:
575 |  | 48x | return 0;
576 |  |  | }
577 |  | 1056x | BOOST_REGEX_ASSERT(c3[1] == charT(0));
578 |  | 271392x | for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
579 |  |  | {
580 |  | 270336x | c3[0] = static_cast<charT>(i);
581 |  | 270336x | string_type s3 = this->m_traits.transform(c3, c3 +1);
582 |  | 270336x | if((s1 <= s3) && (s3 <= s2))
583 |  | 14592x | result->_map[i] = true;
584 |  |  | }
585 |  | 1152x | }
586 |  |  | else
587 |  |  | {
588 |  | 114088x | if(char_less(c2, c1))
589 |  |  | {
590 |  |  | // Oops error:
591 |  | 48x | return 0;
592 |  |  | }
593 |  |  | // everything in range matches:
594 |  | 114040x | std::memset(result->_map + static_cast<unsigned char>(c1), true, static_cast<unsigned char>(1u) + static_cast<unsigned char>(static_cast<unsigned char>(c2) - static_cast<unsigned char>(c1)));
595 |  |  | }
596 |  |  | }
597 |  |  | //
598 |  |  | // and now the classes:
599 |  |  | //
600 |  |  | typedef typename traits::char_class_type m_type;
601 |  | 170061x | m_type m = char_set.classes();
602 |  | 170061x | if(flags() & regbase::icase)
603 |  |  | {
604 |  |  | // adjust m as needed:
605 |  | 3384x | if(((m & m_lower_mask) == m_lower_mask) || ((m & m_upper_mask) == m_upper_mask))
606 |  | 720x | m |= m_alpha_mask;
607 |  |  | }
608 |  | 170061x | if(m != 0)
609 |  |  | {
610 |  | 7438608x | for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
611 |  |  | {
612 |  | 7409664x | if(this->m_traits.isctype(static_cast<charT>(i), m))
613 |  | 1013845x | result->_map[i] = true;
614 |  |  | }
615 |  |  | }
616 |  |  | //
617 |  |  | // and now the negated classes:
618 |  |  | //
619 |  | 170061x | m = char_set.negated_classes();
620 |  | 170061x | if(flags() & regbase::icase)
621 |  |  | {
622 |  |  | // adjust m as needed:
623 |  | 3384x | if(((m & m_lower_mask) == m_lower_mask) || ((m & m_upper_mask) == m_upper_mask))
624 |  | ✗ | m |= m_alpha_mask;
625 |  |  | }
626 |  | 170061x | if(m != 0)
627 |  |  | {
628 |  | 154200x | for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
629 |  |  | {
630 |  | 153600x | if(0 == this->m_traits.isctype(static_cast<charT>(i), m))
631 |  | 137880x | result->_map[i] = true;
632 |  |  | }
633 |  |  | }
634 |  |  | //
635 |  |  | // now process the equivalence classes:
636 |  |  | //
637 |  | 170061x | sfirst = char_set.equivalents_begin();
638 |  | 170061x | slast = char_set.equivalents_end();
639 |  | 170541x | while(sfirst != slast)
640 |  |  | {
641 |  | 240x | string_type s;
642 |  | 240x | BOOST_REGEX_ASSERT(static_cast<charT>(0) == sfirst->second);
643 |  | 240x | s = m_traits.transform_primary(&sfirst->first, &sfirst->first+1);
644 |  | 240x | if(s.empty())
645 |  | ✗ | return 0; // invalid or unsupported equivalence class
646 |  | 61680x | for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
647 |  |  | {
648 |  | 61440x | charT c[2] = { (static_cast<charT>(i)), charT(0), };
649 |  | 61440x | string_type s2 = this->m_traits.transform_primary(c, c+1);
650 |  | 61440x | if(s == s2)
651 |  | 336x | result->_map[i] = true;
652 |  |  | }
653 |  | 240x | ++sfirst;
654 |  |  | }
655 |  | 170061x | if(negate)
656 |  |  | {
657 |  | 27233005x | for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
658 |  |  | {
659 |  | 27127040x | result->_map[i] = !(result->_map[i]);
660 |  |  | }
661 |  |  | }
662 |  | 170061x | return result;
663 |  |  | }
664 |  |  |
665 |  |  | template <class charT, class traits>
666 |  | 360831x | void basic_regex_creator<charT, traits>::finalize(const charT* p1, const charT* p2)
667 |  |  | {
668 |  | 360831x | if(this->m_pdata->m_status)
669 |  | 822x | return;
670 |  |  | // we've added all the states we need, now finish things off.
671 |  |  | // start by adding a terminating state:
672 |  | 360009x | append_state(syntax_element_match);
673 |  |  | // extend storage to store original expression:
674 |  | 360009x | std::ptrdiff_t len = p2 - p1;
675 |  | 360009x | m_pdata->m_expression_len = len;
676 |  | 360009x | charT* ps = static_cast<charT*>(m_pdata->m_data.extend(sizeof(charT) * (1 + (p2 - p1))));
677 |  | 360009x | m_pdata->m_expression = ps;
678 |  | 360009x | BOOST_REGEX_DETAIL_NS::copy(p1, p2, ps);
679 |  | 360009x | ps[p2 - p1] = 0;
680 |  |  | // fill in our other data...
681 |  |  | // successful parsing implies a zero status:
682 |  | 360009x | m_pdata->m_status = 0;
683 |  |  | // get the first state of the machine:
684 |  | 360009x | m_pdata->m_first_state = static_cast<re_syntax_base*>(m_pdata->m_data.data());
685 |  |  | // fixup pointers in the machine:
686 |  | 360009x | fixup_pointers(m_pdata->m_first_state);
687 |  | 360009x | if(m_has_recursions)
688 |  |  | {
689 |  | 34501x | m_pdata->m_has_recursions = true;
690 |  | 34501x | fixup_recursions(m_pdata->m_first_state);
691 |  | 33511x | if(this->m_pdata->m_status)
692 |  | 2154x | return;
693 |  |  | }
694 |  |  | else
695 |  | 325508x | m_pdata->m_has_recursions = false;
696 |  |  | // create nested startmaps:
697 |  | 356865x | create_startmaps(m_pdata->m_first_state);
698 |  |  | // create main startmap:
699 |  | 356425x | std::memset(m_pdata->m_startmap, 0, sizeof(m_pdata->m_startmap));
700 |  | 356425x | m_pdata->m_can_be_null = 0;
701 |  |  |
702 |  | 356425x | m_bad_repeats = 0;
703 |  | 356425x | if(m_has_recursions)
704 |  | 31247x | m_recursion_checks.assign(1 + m_pdata->m_mark_count, 0u);
705 |  | 356425x | create_startmap(m_pdata->m_first_state, m_pdata->m_startmap, &(m_pdata->m_can_be_null), mask_all);
706 |  |  | // get the restart type:
707 |  | 356370x | m_pdata->m_restart_type = get_restart_type(m_pdata->m_first_state);
708 |  |  | // optimise a leading repeat if there is one:
709 |  | 356370x | probe_leading_repeat(m_pdata->m_first_state);
710 |  |  | }
711 |  |  |
712 |  |  | template <class charT, class traits>
713 |  | 360009x | void basic_regex_creator<charT, traits>::fixup_pointers(re_syntax_base* state)
714 |  |  | {
715 |  | 4983012x | while(state)
716 |  |  | {
717 |  | 4623003x | switch(state->type)
718 |  |  | {
719 |  | 39626x | case syntax_element_recurse:
720 |  | 39626x | m_has_recursions = true;
721 |  | 39626x | if(state->next.i)
722 |  | 39626x | state->next.p = getaddress(state->next.i, state);
723 |  |  | else
724 |  | ✗ | state->next.p = 0;
725 |  | 39626x | break;
726 |  | 411233x | case syntax_element_rep:
727 |  |  | case syntax_element_dot_rep:
728 |  |  | case syntax_element_char_rep:
729 |  |  | case syntax_element_short_set_rep:
730 |  |  | case syntax_element_long_set_rep:
731 |  |  | // set the state_id of this repeat:
732 |  | 411233x | static_cast<re_repeat*>(state)->state_id = m_repeater_id++;
733 |  |  | BOOST_REGEX_FALLTHROUGH;
734 |  | 667434x | case syntax_element_alt:
735 |  | 667434x | std::memset(static_cast<re_alt*>(state)->_map, 0, sizeof(static_cast<re_alt*>(state)->_map));
736 |  | 667434x | static_cast<re_alt*>(state)->can_be_null = 0;
737 |  |  | BOOST_REGEX_FALLTHROUGH;
738 |  | 1388632x | case syntax_element_jump:
739 |  | 1388632x | static_cast<re_jump*>(state)->alt.p = getaddress(static_cast<re_jump*>(state)->alt.i, state);
740 |  |  | BOOST_REGEX_FALLTHROUGH;
741 |  | 4583377x | default:
742 |  | 4583377x | if(state->next.i)
743 |  | 4223368x | state->next.p = getaddress(state->next.i, state);
744 |  |  | else
745 |  | 360009x | state->next.p = 0;
746 |  |  | }
747 |  | 4623003x | state = state->next.p;
748 |  |  | }
749 |  | 360009x | }
750 |  |  |
751 |  |  | template <class charT, class traits>
752 |  | 34501x | void basic_regex_creator<charT, traits>::fixup_recursions(re_syntax_base* state)
753 |  |  | {
754 |  | 34501x | re_syntax_base* base = state;
755 |  | 837127x | while(state)
756 |  |  | {
757 |  | 803616x | switch(state->type)
758 |  |  | {
759 |  | 4997x | case syntax_element_assert_backref:
760 |  |  | {
761 |  |  | // just check that the index is valid:
762 |  | 4997x | int idx = static_cast<const re_brace*>(state)->index;
763 |  | 4997x | if(idx < 0)
764 |  |  | {
765 |  | 1217x | idx = -idx-1;
766 |  | 1217x | if(idx >= hash_value_mask)
767 |  |  | {
768 |  | 905x | idx = m_pdata->get_id(idx);
769 |  | 905x | if(idx <= 0)
770 |  |  | {
771 |  |  | // check of sub-expression that doesn't exist:
772 |  | 168x | if(0 == this->m_pdata->m_status) // update the error code if not already set
773 |  | 168x | this->m_pdata->m_status = boost::regex_constants::error_bad_pattern;
774 |  |  | //
775 |  |  | // clear the expression, we should be empty:
776 |  |  | //
777 |  | 168x | this->m_pdata->m_expression = 0;
778 |  | 168x | this->m_pdata->m_expression_len = 0;
779 |  |  | //
780 |  |  | // and throw if required:
781 |  |  | //
782 |  | 168x | if(0 == (this->flags() & regex_constants::no_except))
783 |  |  | {
784 |  | 60x | std::string message = "Encountered a forward reference to a marked sub-expression that does not exist.";
785 |  | 60x | boost::regex_error e(message, boost::regex_constants::error_bad_pattern, 0);
786 |  | 60x | e.raise();
787 |  | 115x | }
788 |  |  | }
789 |  |  | }
790 |  |  | }
791 |  |  | }
792 |  | 4942x | break;
793 |  | 39461x | case syntax_element_recurse:
794 |  |  | {
795 |  | 39461x | bool ok = false;
796 |  | 39461x | re_syntax_base* p = base;
797 |  | 39461x | std::ptrdiff_t idx = static_cast<re_jump*>(state)->alt.i;
798 |  | 39461x | if(idx >= hash_value_mask)
799 |  |  | {
800 |  |  | //
801 |  |  | // There may be more than one capture group with this hash, just do what Perl
802 |  |  | // does and recurse to the leftmost:
803 |  |  | //
804 |  | 9828x | idx = m_pdata->get_id(static_cast<int>(idx));
805 |  |  | }
806 |  | 39461x | if(idx < 0)
807 |  |  | {
808 |  | 2016x | ok = false;
809 |  |  | }
810 |  |  | else
811 |  |  | {
812 |  | 243706x | while(p)
813 |  |  | {
814 |  | 242746x | if((p->type == syntax_element_startmark) && (static_cast<re_brace*>(p)->index == idx))
815 |  |  | {
816 |  |  | //
817 |  |  | // We've found the target of the recursion, set the jump target:
818 |  |  | //
819 |  | 36485x | static_cast<re_jump*>(state)->alt.p = p;
820 |  | 36485x | ok = true;
821 |  |  | //
822 |  |  | // Now scan the target for nested repeats:
823 |  |  | //
824 |  | 36485x | p = p->next.p;
825 |  | 36485x | int next_rep_id = 0;
826 |  | 396782x | while(p)
827 |  |  | {
828 |  | 396782x | switch(p->type)
829 |  |  | {
830 |  | 31192x | case syntax_element_rep:
831 |  |  | case syntax_element_dot_rep:
832 |  |  | case syntax_element_char_rep:
833 |  |  | case syntax_element_short_set_rep:
834 |  |  | case syntax_element_long_set_rep:
835 |  | 31192x | next_rep_id = static_cast<re_repeat*>(p)->state_id;
836 |  | 31192x | break;
837 |  | 42626x | case syntax_element_endmark:
838 |  | 42626x | if(static_cast<const re_brace*>(p)->index == idx)
839 |  | 21543x | next_rep_id = -1;
840 |  | 42626x | break;
841 |  | 322964x | default:
842 |  | 322964x | break;
843 |  |  | }
844 |  | 396782x | if(next_rep_id)
845 |  | 36485x | break;
846 |  | 360297x | p = p->next.p;
847 |  |  | }
848 |  | 36485x | if(next_rep_id > 0)
849 |  |  | {
850 |  | 14942x | static_cast<re_recurse*>(state)->state_id = next_rep_id - 1;
851 |  |  | }
852 |  |  |
853 |  | 36485x | break;
854 |  |  | }
855 |  | 206261x | p = p->next.p;
856 |  |  | }
857 |  |  | }
858 |  | 39461x | if(!ok)
859 |  |  | {
860 |  |  | // recursion to sub-expression that doesn't exist:
861 |  | 2976x | if(0 == this->m_pdata->m_status) // update the error code if not already set
862 |  | 2976x | this->m_pdata->m_status = boost::regex_constants::error_bad_pattern;
863 |  |  | //
864 |  |  | // clear the expression, we should be empty:
865 |  |  | //
866 |  | 2976x | this->m_pdata->m_expression = 0;
867 |  | 2976x | this->m_pdata->m_expression_len = 0;
868 |  |  | //
869 |  |  | // and throw if required:
870 |  |  | //
871 |  | 2976x | if(0 == (this->flags() & regex_constants::no_except))
872 |  |  | {
873 |  | 1020x | std::string message = "Encountered a forward reference to a recursive sub-expression that does not exist.";
874 |  | 1020x | boost::regex_error e(message, boost::regex_constants::error_bad_pattern, 0);
875 |  | 1020x | e.raise();
876 |  | 1955x | }
877 |  |  | }
878 |  |  | }
879 |  | 38526x | break;
880 |  | 759158x | default:
881 |  | 759158x | break;
882 |  |  | }
883 |  | 802626x | state = state->next.p;
884 |  |  | }
885 |  | 33511x | }
886 |  |  |
887 |  |  | template <class charT, class traits>
888 |  | 356865x | void basic_regex_creator<charT, traits>::create_startmaps(re_syntax_base* state)
889 |  |  | {
890 |  |  | // non-recursive implementation:
891 |  |  | // create the last map in the machine first, so that earlier maps
892 |  |  | // can make use of the result...
893 |  |  | //
894 |  |  | // This was originally a recursive implementation, but that caused stack
895 |  |  | // overflows with complex expressions on small stacks (think COM+).
896 |  |  |
897 |  |  | // start by saving the case setting:
898 |  | 356865x | bool l_icase = m_icase;
899 |  | 356865x | std::vector<std::pair<bool, re_syntax_base*> > v;
900 |  |  |
901 |  | 4938394x | while(state)
902 |  |  | {
903 |  | 4581859x | switch(state->type)
904 |  |  | {
905 |  | 78170x | case syntax_element_toggle_case:
906 |  |  | // we need to track case changes here:
907 |  | 78170x | m_icase = static_cast<re_case*>(state)->icase;
908 |  | 78170x | state = state->next.p;
909 |  | 78170x | continue;
910 |  | 666381x | case syntax_element_alt:
911 |  |  | case syntax_element_rep:
912 |  |  | case syntax_element_dot_rep:
913 |  |  | case syntax_element_char_rep:
914 |  |  | case syntax_element_short_set_rep:
915 |  |  | case syntax_element_long_set_rep:
916 |  |  | // just push the state onto our stack for now:
917 |  | 666381x | v.push_back(std::pair<bool, re_syntax_base*>(m_icase, state));
918 |  | 666381x | state = state->next.p;
919 |  | 666381x | break;
920 |  | 8354x | case syntax_element_backstep:
921 |  |  | // we need to calculate how big the backstep is:
922 |  | 8354x | static_cast<re_brace*>(state)->index
923 |  | 8354x | = this->calculate_backstep(state->next.p);
924 |  | 8354x | if(static_cast<re_brace*>(state)->index < 0)
925 |  |  | {
926 |  |  | // Oops error:
927 |  | 1152x | if(0 == this->m_pdata->m_status) // update the error code if not already set
928 |  | 1152x | this->m_pdata->m_status = boost::regex_constants::error_bad_pattern;
929 |  |  | //
930 |  |  | // clear the expression, we should be empty:
931 |  |  | //
932 |  | 1152x | this->m_pdata->m_expression = 0;
933 |  | 1152x | this->m_pdata->m_expression_len = 0;
934 |  |  | //
935 |  |  | // and throw if required:
936 |  |  | //
937 |  | 1152x | if(0 == (this->flags() & regex_constants::no_except))
938 |  |  | {
939 |  | 360x | std::string message = "Invalid lookbehind assertion encountered in the regular expression.";
940 |  | 360x | boost::regex_error e(message, boost::regex_constants::error_bad_pattern, 0);
941 |  | 360x | e.raise();
942 |  | 690x | }
943 |  |  | }
944 |  |  | BOOST_REGEX_FALLTHROUGH;
945 |  |  | default:
946 |  | 3836978x | state = state->next.p;
947 |  | 78170x | }
948 |  |  | }
949 |  |  |
950 |  |  | // now work through our list, building all the maps as we go:
951 |  | 1013456x | while(!v.empty())
952 |  |  | {
953 |  |  | // Initialize m_recursion_checks if we need it:
954 |  | 657031x | if(m_has_recursions)
955 |  | 107493x | m_recursion_checks.assign(1 + m_pdata->m_mark_count, 0u);
956 |  |  |
957 |  | 657031x | const std::pair<bool, re_syntax_base*>& p = v.back();
958 |  | 657031x | m_icase = p.first;
959 |  | 657031x | state = p.second;
960 |  | 657031x | v.pop_back();
961 |  |  |
962 |  |  | // Build maps:
963 |  | 657031x | m_bad_repeats = 0;
964 |  | 657031x | create_startmap(state->next.p, static_cast<re_alt*>(state)->_map, &static_cast<re_alt*>(state)->can_be_null, mask_take);
965 |  | 656976x | m_bad_repeats = 0;
966 |  |  |
967 |  | 656976x | if(m_has_recursions)
968 |  | 107438x | m_recursion_checks.assign(1 + m_pdata->m_mark_count, 0u);
969 |  | 656976x | create_startmap(static_cast<re_alt*>(state)->alt.p, static_cast<re_alt*>(state)->_map, &static_cast<re_alt*>(state)->can_be_null, mask_skip);
970 |  |  | // adjust the type of the state to allow for faster matching:
971 |  | 656921x | state->type = this->get_repeat_type(state);
972 |  |  | }
973 |  |  | // restore case sensitivity:
974 |  | 356425x | m_icase = l_icase;
975 |  | 356865x | }
976 |  |  |
977 |  |  | template <class charT, class traits>
978 |  | 8354x | int basic_regex_creator<charT, traits>::calculate_backstep(re_syntax_base* state)
979 |  |  | {
980 |  |  | typedef typename traits::char_class_type m_type;
981 |  |  |
982 |  | 8354x | int result = 0;
983 |  | 8354x | int last_alternative_result = -1;
984 |  |  |
985 |  | 8354x | std::vector<std::tuple<int, re_syntax_base*>> stack;
986 |  |  |
987 |  | 34399x | while(state)
988 |  |  | {
989 |  | 34399x | switch(state->type)
990 |  |  | {
991 |  | 1802x | case syntax_element_startmark:
992 |  | 1802x | if((static_cast<re_brace*>(state)->index == -1)
993 |  | 1622x | || (static_cast<re_brace*>(state)->index == -2))
994 |  |  | {
995 |  | 360x | state = static_cast<re_jump*>(state->next.p)->alt.p->next.p;
996 |  | 360x | continue;
997 |  |  | }
998 |  | 1442x | else if(static_cast<re_brace*>(state)->index == -3)
999 |  |  | {
1000 |  | 180x | state = state->next.p->next.p;
1001 |  | 180x | continue;
1002 |  |  | }
1003 |  | 1262x | break;
1004 |  | 13412x | case syntax_element_endmark:
1005 |  | 13412x | if ((static_cast<re_brace*>(state)->index == -1)
1006 |  | 5086x | || (static_cast<re_brace*>(state)->index == -2))
1007 |  |  | {
1008 |  |  | // We've finished the calculation, check against any previous alternatives:
1009 |  | 9970x | if (last_alternative_result >= 0)
1010 |  |  | {
1011 |  | 2384x | if (last_alternative_result != result)
1012 |  | 384x | return -1;
1013 |  |  | }
1014 |  |  | else
1015 |  | 7586x | last_alternative_result = result;
1016 |  |  |
1017 |  | 9586x | if (stack.size())
1018 |  |  | {
1019 |  |  | // Skip to next alternative and calculate that as well:
1020 |  | 2384x | std::tie(result, state) = stack.back();
1021 |  | 2384x | stack.pop_back();
1022 |  | 2384x | continue;
1023 |  |  | }
1024 |  |  | else
1025 |  | 7202x | return result;
1026 |  |  | }
1027 |  | 3442x | break;
1028 |  | 7709x | case syntax_element_literal:
1029 |  | 7709x | result += static_cast<re_literal*>(state)->length;
1030 |  | 7709x | break;
1031 |  | 240x | case syntax_element_wild:
1032 |  |  | case syntax_element_set:
1033 |  | 240x | result += 1;
1034 |  | 240x | break;
1035 |  | 1836x | case syntax_element_dot_rep:
1036 |  |  | case syntax_element_char_rep:
1037 |  |  | case syntax_element_short_set_rep:
1038 |  |  | case syntax_element_backref:
1039 |  |  | case syntax_element_rep:
1040 |  |  | case syntax_element_combining:
1041 |  |  | case syntax_element_long_set_rep:
1042 |  |  | case syntax_element_backstep:
1043 |  |  | {
1044 |  | 1836x | re_repeat* rep = static_cast<re_repeat *>(state);
1045 |  |  | // adjust the type of the state to allow for faster matching:
1046 |  | 1836x | state->type = this->get_repeat_type(state);
1047 |  | 1836x | if((state->type == syntax_element_dot_rep)
1048 |  | 1296x | || (state->type == syntax_element_char_rep)
1049 |  | 744x | || (state->type == syntax_element_short_set_rep))
1050 |  |  | {
1051 |  | 1212x | if(rep->max != rep->min)
1052 |  | 192x | return -1;
1053 |  | 1020x | if (static_cast<std::size_t>((std::numeric_limits<int>::max)() - result) < rep->min)
1054 |  | ✗ | return -1; // protection against overflow, we can't calculate a backstep in this case and the expression is probably ill-formed.
1055 |  | 1020x | result += static_cast<int>(rep->min);
1056 |  | 1020x | state = rep->alt.p;
1057 |  | 1020x | continue;
1058 |  |  | }
1059 |  | 624x | else if(state->type == syntax_element_long_set_rep)
1060 |  |  | {
1061 |  | 240x | BOOST_REGEX_ASSERT(rep->next.p->type == syntax_element_long_set);
1062 |  | 240x | if(static_cast<re_set_long<m_type>*>(rep->next.p)->singleton == 0)
1063 |  | ✗ | return -1;
1064 |  | 240x | if(rep->max != rep->min)
1065 |  | ✗ | return -1;
1066 |  | 240x | result += static_cast<int>(rep->min);
1067 |  | 240x | state = rep->alt.p;
1068 |  | 240x | continue;
1069 |  |  | }
1070 |  |  | }
1071 |  | 384x | return -1;
1072 |  | 672x | case syntax_element_long_set:
1073 |  | 672x | if(static_cast<re_set_long<m_type>*>(state)->singleton == 0)
1074 |  | 192x | return -1;
1075 |  | 480x | result += 1;
1076 |  | 480x | break;
1077 |  | 2384x | case syntax_element_jump:
1078 |  | 2384x | state = static_cast<re_jump*>(state)->alt.p;
1079 |  | 2384x | continue;
1080 |  | 2384x | case syntax_element_alt:
1081 |  |  | {
1082 |  |  | // Push the alternative if we haven't pushed too many already:
1083 |  | 2384x | if(stack.size() > BOOST_REGEX_MAX_BLOCKS)
1084 |  | ✗ | return -1;
1085 |  | 2384x | stack.push_back(std::make_tuple(result, static_cast<re_alt*>(state)->alt.p));
1086 |  |  | // and take the first one:
1087 |  | 2384x | state = state->next.p;
1088 |  | 2384x | continue;
1089 |  |  | }
1090 |  | 3960x | default:
1091 |  | 3960x | break;
1092 |  | 4768x | }
1093 |  | 17093x | state = state->next.p;
1094 |  |  | }
1095 |  | ✗ | return -1;
1096 |  | 8354x | }
1097 |  |  |
1098 |  |  | struct recursion_saver
1099 |  |  | {
1100 |  |  | std::vector<unsigned char> saved_state;
1101 |  |  | std::vector<unsigned char>* state;
1102 |  | 2020488x | recursion_saver(std::vector<unsigned char>* p) : saved_state(*p), state(p) {}
1103 |  | 2020488x | ~recursion_saver()
1104 |  |  | {
1105 |  | 2020488x | state->swap(saved_state);
1106 |  | 2020488x | }
1107 |  |  | };
1108 |  |  |
1109 |  |  | template <class charT, class traits>
1110 |  | 2020488x | void basic_regex_creator<charT, traits>::create_startmap(re_syntax_base* state, unsigned char* l_map, unsigned int* pnull, unsigned char mask, unsigned recursion_count)
1111 |  |  | {
1112 |  | 2020488x | recursion_saver saved_recursions(&m_recursion_checks);
1113 |  | 2020488x | int not_last_jump = 1;
1114 |  | 2020488x | re_syntax_base* recursion_start = 0;
1115 |  | 2020488x | int recursion_sub = 0;
1116 |  | 2020488x | re_syntax_base* recursion_restart = 0;
1117 |  |  |
1118 |  |  | // track case sensitivity:
1119 |  | 2020488x | bool l_icase = m_icase;
1120 |  |  |
1121 |  | 2020488x | if (recursion_count > BOOST_REGEX_MAX_RECURSION_DEPTH)
1122 |  |  | {
1123 |  |  | // Oops error:
1124 |  | 521x | if (0 == this->m_pdata->m_status) // update the error code if not already set
1125 |  | 384x | this->m_pdata->m_status = boost::regex_constants::error_complexity;
1126 |  |  | //
1127 |  |  | // clear the expression, we should be empty:
1128 |  |  | //
1129 |  | 521x | this->m_pdata->m_expression = 0;
1130 |  | 521x | this->m_pdata->m_expression_len = 0;
1131 |  |  | //
1132 |  |  | // and throw if required:
1133 |  |  | //
1134 |  | 521x | if (0 == (this->flags() & regex_constants::no_except))
1135 |  |  | {
1136 |  | 125x | std::string message = "Expression complexity exceeded.";
1137 |  | 125x | boost::regex_error e(message, boost::regex_constants::error_complexity, 0);
1138 |  | 125x | e.raise();
1139 |  | 235x | }
1140 |  | 411x | return;
1141 |  |  | }
1142 |  |  |
1143 |  | 3514946x | while(state)
1144 |  |  | {
1145 |  | 3514946x | switch(state->type)
1146 |  |  | {
1147 |  | 17485x | case syntax_element_toggle_case:
1148 |  | 17485x | l_icase = static_cast<re_case*>(state)->icase;
1149 |  | 17485x | state = state->next.p;
1150 |  | 17485x | break;
1151 |  | 726782x | case syntax_element_literal:
1152 |  |  | {
1153 |  |  | // don't set anything in *pnull, set each element in l_map
1154 |  |  | // that could match the first character in the literal:
1155 |  | 726782x | if(l_map)
1156 |  |  | {
1157 |  | 726782x | l_map[0] |= mask_init;
1158 |  | 726782x | charT first_char = *static_cast<charT*>(static_cast<void*>(static_cast<re_literal*>(state) + 1));
1159 |  | 186782974x | for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
1160 |  |  | {
1161 |  | 186056192x | if(m_traits.translate(static_cast<charT>(i), l_icase) == first_char)
1162 |  | 746544x | l_map[i] |= mask;
1163 |  |  | }
1164 |  |  | }
1165 |  | 726782x | return;
1166 |  |  | }
1167 |  | 31324x | case syntax_element_end_line:
1168 |  |  | {
1169 |  |  | // next character must be a line separator (if there is one):
1170 |  | 31324x | if(l_map)
1171 |  |  | {
1172 |  | 12124x | l_map[0] |= mask_init;
1173 |  | 12124x | l_map[static_cast<unsigned>('\n')] |= mask;
1174 |  | 12124x | l_map[static_cast<unsigned>('\r')] |= mask;
1175 |  | 12124x | l_map[static_cast<unsigned>('\f')] |= mask;
1176 |  | 12124x | l_map[0x85] |= mask;
1177 |  |  | }
1178 |  |  | // now figure out if we can match a NULL string at this point:
1179 |  | 31324x | if(pnull)
1180 |  | 31324x | create_startmap(state->next.p, 0, pnull, mask, ++recursion_count);
1181 |  | 25769x | return;
1182 |  |  | }
1183 |  | 24121x | case syntax_element_recurse:
1184 |  |  | {
1185 |  | 24121x | BOOST_REGEX_ASSERT(static_cast<const re_jump*>(state)->alt.p->type == syntax_element_startmark);
1186 |  | 24121x | recursion_sub = static_cast<re_brace*>(static_cast<const re_jump*>(state)->alt.p)->index;
1187 |  | 24121x | if(m_recursion_checks[recursion_sub] & 1u)
1188 |  |  | {
1189 |  |  | // Infinite recursion!!
1190 |  | 192x | if(0 == this->m_pdata->m_status) // update the error code if not already set
1191 |  | 192x | this->m_pdata->m_status = boost::regex_constants::error_bad_pattern;
1192 |  |  | //
1193 |  |  | // clear the expression, we should be empty:
1194 |  |  | //
1195 |  | 192x | this->m_pdata->m_expression = 0;
1196 |  | 192x | this->m_pdata->m_expression_len = 0;
1197 |  |  | //
1198 |  |  | // and throw if required:
1199 |  |  | //
1200 |  | 192x | if(0 == (this->flags() & regex_constants::no_except))
1201 |  |  | {
1202 |  | 60x | std::string message = "Encountered an infinite recursion.";
1203 |  | 60x | boost::regex_error e(message, boost::regex_constants::error_bad_pattern, 0);
1204 |  | 60x | e.raise();
1205 |  | 115x | }
1206 |  |  | }
1207 |  | 23929x | else if(recursion_start == 0)
1208 |  |  | {
1209 |  | 23929x | recursion_start = state;
1210 |  | 23929x | recursion_restart = state->next.p;
1211 |  | 23929x | state = static_cast<re_jump*>(state)->alt.p;
1212 |  | 23929x | m_recursion_checks[recursion_sub] |= 1u;
1213 |  | 23929x | break;
1214 |  |  | }
1215 |  | 137x | m_recursion_checks[recursion_sub] |= 1u;
1216 |  |  | // can't handle nested recursion here...
1217 |  |  | BOOST_REGEX_FALLTHROUGH;
1218 |  |  | }
1219 |  | 2969x | case syntax_element_backref:
1220 |  |  | // can be null, and any character can match:
1221 |  | 2969x | if(pnull)
1222 |  | 2969x | *pnull |= mask;
1223 |  |  | BOOST_REGEX_FALLTHROUGH;
1224 |  |  | case syntax_element_wild:
1225 |  |  | {
1226 |  |  | // can't be null, any character can match:
1227 |  | 48825x | set_all_masks(l_map, mask);
1228 |  | 48825x | return;
1229 |  |  | }
1230 |  | 192697x | case syntax_element_accept:
1231 |  |  | case syntax_element_match:
1232 |  |  | {
1233 |  |  | // must be null, any character can match:
1234 |  | 192697x | set_all_masks(l_map, mask);
1235 |  | 192697x | if(pnull)
1236 |  | 192697x | *pnull |= mask;
1237 |  | 192697x | return;
1238 |  |  | }
1239 |  | 5400x | case syntax_element_word_start:
1240 |  |  | {
1241 |  |  | // recurse, then AND with all the word characters:
1242 |  | 5400x | create_startmap(state->next.p, l_map, pnull, mask, ++recursion_count);
1243 |  | 5400x | if(l_map)
1244 |  |  | {
1245 |  | 5400x | l_map[0] |= mask_init;
1246 |  | 1387800x | for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
1247 |  |  | {
1248 |  | 1382400x | if(!m_traits.isctype(static_cast<charT>(i), m_word_mask))
1249 |  | 917400x | l_map[i] &= static_cast<unsigned char>(~mask);
1250 |  |  | }
1251 |  |  | }
1252 |  | 5400x | return;
1253 |  |  | }
1254 |  | 2292x | case syntax_element_word_end:
1255 |  |  | {
1256 |  |  | // recurse, then AND with all the word characters:
1257 |  | 2292x | create_startmap(state->next.p, l_map, pnull, mask, ++recursion_count);
1258 |  | 2292x | if(l_map)
1259 |  |  | {
1260 |  | 2292x | l_map[0] |= mask_init;
1261 |  | 589044x | for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
1262 |  |  | {
1263 |  | 586752x | if(m_traits.isctype(static_cast<charT>(i), m_word_mask))
1264 |  | 198996x | l_map[i] &= static_cast<unsigned char>(~mask);
1265 |  |  | }
1266 |  |  | }
1267 |  | 2292x | return;
1268 |  |  | }
1269 |  | 1059x | case syntax_element_buffer_end:
1270 |  |  | {
1271 |  |  | // we *must be null* :
1272 |  | 1059x | if(pnull)
1273 |  | 1059x | *pnull |= mask;
1274 |  | 1059x | return;
1275 |  |  | }
1276 |  | 116597x | case syntax_element_long_set:
1277 |  | 116597x | if(l_map)
1278 |  |  | {
1279 |  |  | typedef typename traits::char_class_type m_type;
1280 |  | 116597x | if(static_cast<re_set_long<m_type>*>(state)->singleton)
1281 |  |  | {
1282 |  | 103805x | l_map[0] |= mask_init;
1283 |  | 26677885x | for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
1284 |  |  | {
1285 |  | 26574080x | charT c = static_cast<charT>(i);
1286 |  | 26574080x | if(&c != re_is_set_member(&c, &c + 1, static_cast<re_set_long<m_type>*>(state), *m_pdata, l_icase))
1287 |  | 10062246x | l_map[i] |= mask;
1288 |  |  | }
1289 |  |  | }
1290 |  |  | else
1291 |  | 12792x | set_all_masks(l_map, mask);
1292 |  |  | }
1293 |  | 116597x | return;
1294 |  | 107567x | case syntax_element_set:
1295 |  | 107567x | if(l_map)
1296 |  |  | {
1297 |  | 107567x | l_map[0] |= mask_init;
1298 |  | 27644719x | for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
1299 |  |  | {
1300 |  | 27537152x | if(static_cast<re_set*>(state)->_map[
1301 |  | 27537152x | static_cast<unsigned char>(m_traits.translate(static_cast<charT>(i), l_icase))])
1302 |  | 9898680x | l_map[i] |= mask;
1303 |  |  | }
1304 |  |  | }
1305 |  | 107567x | return;
1306 |  | 266514x | case syntax_element_jump:
1307 |  |  | // take the jump:
1308 |  | 266514x | state = static_cast<re_alt*>(state)->alt.p;
1309 |  | 266514x | not_last_jump = -1;
1310 |  | 266514x | break;
1311 |  | 723044x | case syntax_element_alt:
1312 |  |  | case syntax_element_rep:
1313 |  |  | case syntax_element_dot_rep:
1314 |  |  | case syntax_element_char_rep:
1315 |  |  | case syntax_element_short_set_rep:
1316 |  |  | case syntax_element_long_set_rep:
1317 |  |  | {
1318 |  | 723044x | re_alt* rep = static_cast<re_alt*>(state);
1319 |  | 723044x | if(rep->_map[0] & mask_init)
1320 |  |  | {
1321 |  | 468152x | if(l_map)
1322 |  |  | {
1323 |  |  | // copy previous results:
1324 |  | 468148x | l_map[0] |= mask_init;
1325 |  | 120314036x | for(unsigned int i = 0; i <= UCHAR_MAX; ++i)
1326 |  |  | {
1327 |  | 119845888x | if(rep->_map[i] & mask_any)
1328 |  | 79330963x | l_map[i] |= mask;
1329 |  |  | }
1330 |  |  | }
1331 |  | 468152x | if(pnull)
1332 |  |  | {
1333 |  | 468152x | if(rep->can_be_null & mask_any)
1334 |  | 282011x | *pnull |= mask;
1335 |  |  | }
1336 |  |  | }
1337 |  |  | else
1338 |  |  | {
1339 |  |  | // we haven't created a startmap for this alternative yet
1340 |  |  | // so take the union of the two options:
1341 |  | 254892x | if(is_bad_repeat(state))
1342 |  |  | {
1343 |  | 100291x | set_all_masks(l_map, mask);
1344 |  | 100291x | if(pnull)
1345 |  | 100291x | *pnull |= mask;
1346 |  | 100291x | return;
1347 |  |  | }
1348 |  | 154601x | set_bad_repeat(state);
1349 |  | 154601x | create_startmap(state->next.p, l_map, pnull, mask, ++recursion_count);
1350 |  | 154491x | if((state->type == syntax_element_alt)
1351 |  | 135050x | || (static_cast<re_repeat*>(state)->min == 0)
1352 |  | 127050x | || (not_last_jump == 0))
1353 |  | 152946x | create_startmap(rep->alt.p, l_map, pnull, mask, ++recursion_count);
1354 |  |  | }
1355 |  |  | }
1356 |  | 619893x | return;
1357 |  | 180x | case syntax_element_soft_buffer_end:
1358 |  |  | // match newline or null:
1359 |  | 180x | if(l_map)
1360 |  |  | {
1361 |  | 180x | l_map[0] |= mask_init;
1362 |  | 180x | l_map[static_cast<unsigned>('\n')] |= mask;
1363 |  | 180x | l_map[static_cast<unsigned>('\r')] |= mask;
1364 |  |  | }
1365 |  | 180x | if(pnull)
1366 |  | 180x | *pnull |= mask;
1367 |  | 180x | return;
1368 |  | 338427x | case syntax_element_endmark:
1369 |  |  | // need to handle independent subs as a special case:
1370 |  | 338427x | if(static_cast<re_brace*>(state)->index < 0)
1371 |  |  | {
1372 |  |  | // can be null, any character can match:
1373 |  | 64145x | set_all_masks(l_map, mask);
1374 |  | 64145x | if(pnull)
1375 |  | 64145x | *pnull |= mask;
1376 |  | 64145x | return;
1377 |  |  | }
1378 |  | 274282x | else if(recursion_start && (recursion_sub != 0) && (recursion_sub == static_cast<re_brace*>(state)->index))
1379 |  |  | {
1380 |  |  | // recursion termination:
1381 |  | ✗ | recursion_start = 0;
1382 |  | ✗ | state = recursion_restart;
1383 |  | ✗ | break;
1384 |  |  | }
1385 |  |  |
1386 |  |  | //
1387 |  |  | // Normally we just go to the next state... but if this sub-expression is
1388 |  |  | // the target of a recursion, then we might be ending a recursion, in which
1389 |  |  | // case we should check whatever follows that recursion, as well as whatever
1390 |  |  | // follows this state:
1391 |  |  | //
1392 |  | 274282x | if(m_pdata->m_has_recursions && static_cast<re_brace*>(state)->index)
1393 |  |  | {
1394 |  | 43755x | bool ok = false;
1395 |  | 43755x | re_syntax_base* p = m_pdata->m_first_state;
1396 |  | 11466864x | while(p)
1397 |  |  | {
1398 |  | 11426602x | if(p->type == syntax_element_recurse)
1399 |  |  | {
1400 |  | 44943x | re_brace* p2 = static_cast<re_brace*>(static_cast<re_jump*>(p)->alt.p);
1401 |  | 44943x | if((p2->type == syntax_element_startmark) && (p2->index == static_cast<re_brace*>(state)->index))
1402 |  |  | {
1403 |  | 3493x | ok = true;
1404 |  | 3493x | break;
1405 |  |  | }
1406 |  |  | }
1407 |  | 11423109x | p = p->next.p;
1408 |  |  | }
1409 |  | 43755x | if(ok && ((m_recursion_checks[static_cast<re_brace*>(state)->index] & 2u) == 0))
1410 |  |  | {
1411 |  | 3493x | m_recursion_checks[static_cast<re_brace*>(state)->index] |= 2u;
1412 |  | 3493x | create_startmap(p->next.p, l_map, pnull, mask, ++recursion_count);
1413 |  |  | }
1414 |  |  | }
1415 |  | 274282x | state = state->next.p;
1416 |  | 274282x | break;
1417 |  |  |
1418 |  | 2161x | case syntax_element_commit:
1419 |  | 2161x | set_all_masks(l_map, mask);
1420 |  |  | // Continue scanning so we can figure out whether we can be null:
1421 |  | 2161x | state = state->next.p;
1422 |  | 2161x | break;
1423 |  | 859448x | case syntax_element_startmark:
1424 |  |  | // need to handle independent subs as a special case:
1425 |  | 859448x | if(static_cast<re_brace*>(state)->index == -3)
1426 |  |  | {
1427 |  | 25968x | state = state->next.p->next.p;
1428 |  | 25968x | break;
1429 |  |  | }
1430 |  |  | BOOST_REGEX_FALLTHROUGH;
1431 |  |  | default:
1432 |  | 884640x | state = state->next.p;
1433 |  |  | }
1434 |  | 1494979x | ++not_last_jump;
1435 |  |  | }
1436 |  | 2020488x | }
1437 |  |  |
1438 |  |  | template <class charT, class traits>
1439 |  | 356370x | unsigned basic_regex_creator<charT, traits>::get_restart_type(re_syntax_base* state)
1440 |  |  | {
1441 |  |  | //
1442 |  |  | // find out how the machine starts, so we can optimise the search:
1443 |  |  | //
1444 |  | 1073446x | while(state)
1445 |  |  | {
1446 |  | 754187x | switch(state->type)
1447 |  |  | {
1448 |  | 397817x | case syntax_element_startmark:
1449 |  |  | case syntax_element_endmark:
1450 |  | 397817x | state = state->next.p;
1451 |  | 397817x | continue;
1452 |  | 28924x | case syntax_element_start_line:
1453 |  | 28924x | return regbase::restart_line;
1454 |  | 5196x | case syntax_element_word_start:
1455 |  | 5196x | return regbase::restart_word;
1456 |  | 2271x | case syntax_element_buffer_start:
1457 |  | 2271x | return regbase::restart_buf;
1458 |  | 720x | case syntax_element_restart_continue:
1459 |  | 720x | return regbase::restart_continue;
1460 |  | 319259x | default:
1461 |  | 319259x | state = 0;
1462 |  | 319259x | continue;
1463 |  |  | }
1464 |  |  | }
1465 |  | 319259x | return regbase::restart_any;
1466 |  |  | }
1467 |  |  |
1468 |  |  | template <class charT, class traits>
1469 |  | 420911x | void basic_regex_creator<charT, traits>::set_all_masks(unsigned char* bits, unsigned char mask)
1470 |  |  | {
1471 |  |  | //
1472 |  |  | // set mask in all of bits elements,
1473 |  |  | // if bits[0] has mask_init not set then we can
1474 |  |  | // optimise this to a call to memset:
1475 |  |  | //
1476 |  | 420911x | if(bits)
1477 |  |  | {
1478 |  | 408983x | if(bits[0] == 0)
1479 |  | 105610x | (std::memset)(bits, mask, 1u << CHAR_BIT);
1480 |  |  | else
1481 |  |  | {
1482 |  | 77966861x | for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
1483 |  | 77663488x | bits[i] |= mask;
1484 |  |  | }
1485 |  | 408983x | bits[0] |= mask_init;
1486 |  |  | }
1487 |  | 420911x | }
1488 |  |  |
1489 |  |  | template <class charT, class traits>
1490 |  | 254892x | bool basic_regex_creator<charT, traits>::is_bad_repeat(re_syntax_base* pt)
1491 |  |  | {
1492 |  | 254892x | switch(pt->type)
1493 |  |  | {
1494 |  | 235341x | case syntax_element_rep:
1495 |  |  | case syntax_element_dot_rep:
1496 |  |  | case syntax_element_char_rep:
1497 |  |  | case syntax_element_short_set_rep:
1498 |  |  | case syntax_element_long_set_rep:
1499 |  |  | {
1500 |  | 235341x | unsigned state_id = static_cast<re_repeat*>(pt)->state_id;
1501 |  | 235341x | if(state_id >= sizeof(m_bad_repeats) * CHAR_BIT)
1502 |  | 8100x | return true; // run out of bits, assume we can't traverse this one.
1503 |  |  | static const std::uintmax_t one = 1uL;
1504 |  | 227241x | return m_bad_repeats & (one << state_id);
1505 |  |  | }
1506 |  | 19551x | default:
1507 |  | 19551x | return false;
1508 |  |  | }
1509 |  |  | }
1510 |  |  |
1511 |  |  | template <class charT, class traits>
1512 |  | 154601x | void basic_regex_creator<charT, traits>::set_bad_repeat(re_syntax_base* pt)
1513 |  |  | {
1514 |  | 154601x | switch(pt->type)
1515 |  |  | {
1516 |  | 135050x | case syntax_element_rep:
1517 |  |  | case syntax_element_dot_rep:
1518 |  |  | case syntax_element_char_rep:
1519 |  |  | case syntax_element_short_set_rep:
1520 |  |  | case syntax_element_long_set_rep:
1521 |  |  | {
1522 |  | 135050x | unsigned state_id = static_cast<re_repeat*>(pt)->state_id;
1523 |  |  | static const std::uintmax_t one = 1uL;
1524 |  | 135050x | if(state_id <= sizeof(m_bad_repeats) * CHAR_BIT)
1525 |  | 135050x | m_bad_repeats |= (one << state_id);
1526 |  |  | }
1527 |  | 135050x | break;
1528 |  | 19551x | default:
1529 |  | 19551x | break;
1530 |  |  | }
1531 |  | 154601x | }
1532 |  |  |
1533 |  |  | template <class charT, class traits>
1534 |  | 658757x | syntax_element_type basic_regex_creator<charT, traits>::get_repeat_type(re_syntax_base* state)
1535 |  |  | {
1536 |  |  | typedef typename traits::char_class_type m_type;
1537 |  | 658757x | if(state->type == syntax_element_rep)
1538 |  |  | {
1539 |  |  | // check to see if we are repeating a single state:
1540 |  | 411013x | if(state->next.p->next.p->next.p == static_cast<re_alt*>(state)->alt.p)
1541 |  |  | {
1542 |  | 256193x | switch(state->next.p->type)
1543 |  |  | {
1544 |  | 33179x | case BOOST_REGEX_DETAIL_NS::syntax_element_wild:
1545 |  | 33179x | return BOOST_REGEX_DETAIL_NS::syntax_element_dot_rep;
1546 |  | 102127x | case BOOST_REGEX_DETAIL_NS::syntax_element_literal:
1547 |  | 102127x | return BOOST_REGEX_DETAIL_NS::syntax_element_char_rep;
1548 |  | 41861x | case BOOST_REGEX_DETAIL_NS::syntax_element_set:
1549 |  | 41861x | return BOOST_REGEX_DETAIL_NS::syntax_element_short_set_rep;
1550 |  | 78844x | case BOOST_REGEX_DETAIL_NS::syntax_element_long_set:
1551 |  | 78844x | if(static_cast<BOOST_REGEX_DETAIL_NS::re_set_long<m_type>*>(state->next.p)->singleton)
1552 |  | 72772x | return BOOST_REGEX_DETAIL_NS::syntax_element_long_set_rep;
1553 |  | 6072x | break;
1554 |  | 182x | default:
1555 |  | 182x | break;
1556 |  |  | }
1557 |  |  | }
1558 |  |  | }
1559 |  | 408818x | return state->type;
1560 |  |  | }
1561 |  |  |
1562 |  |  | template <class charT, class traits>
1563 |  | 356370x | void basic_regex_creator<charT, traits>::probe_leading_repeat(re_syntax_base* state)
1564 |  |  | {
1565 |  |  | // enumerate our states, and see if we have a leading repeat
1566 |  |  | // for which failed search restarts can be optimized;
1567 |  |  | do
1568 |  |  | {
1569 |  | 829945x | switch(state->type)
1570 |  |  | {
1571 |  | 408300x | case syntax_element_startmark:
1572 |  | 408300x | if(static_cast<re_brace*>(state)->index >= 0)
1573 |  |  | {
1574 |  | 388409x | state = state->next.p;
1575 |  | 388409x | continue;
1576 |  |  | }
1577 |  |  | #ifdef BOOST_REGEX_MSVC
1578 |  |  | # pragma warning(push)
1579 |  |  | #pragma warning(disable:6011)
1580 |  |  | #endif
1581 |  | 19891x | if((static_cast<re_brace*>(state)->index == -1)
1582 |  | 12906x | || (static_cast<re_brace*>(state)->index == -2))
1583 |  |  | {
1584 |  |  | // skip past the zero width assertion:
1585 |  | 8562x | state = static_cast<const re_jump*>(state->next.p)->alt.p->next.p;
1586 |  | 8562x | continue;
1587 |  |  | }
1588 |  |  | #ifdef BOOST_REGEX_MSVC
1589 |  |  | # pragma warning(pop)
1590 |  |  | #endif
1591 |  | 11329x | if(static_cast<re_brace*>(state)->index == -3)
1592 |  |  | {
1593 |  |  | // Have to skip the leading jump state:
1594 |  | 6505x | state = state->next.p->next.p;
1595 |  | 6505x | continue;
1596 |  |  | }
1597 |  | 4824x | return;
1598 |  | 70099x | case syntax_element_endmark:
1599 |  |  | case syntax_element_start_line:
1600 |  |  | case syntax_element_end_line:
1601 |  |  | case syntax_element_word_boundary:
1602 |  |  | case syntax_element_within_word:
1603 |  |  | case syntax_element_word_start:
1604 |  |  | case syntax_element_word_end:
1605 |  |  | case syntax_element_buffer_start:
1606 |  |  | case syntax_element_buffer_end:
1607 |  |  | case syntax_element_restart_continue:
1608 |  | 70099x | state = state->next.p;
1609 |  | 70099x | break;
1610 |  | 71125x | case syntax_element_dot_rep:
1611 |  |  | case syntax_element_char_rep:
1612 |  |  | case syntax_element_short_set_rep:
1613 |  |  | case syntax_element_long_set_rep:
1614 |  | 71125x | if(this->m_has_backrefs == 0)
1615 |  | 70405x | static_cast<re_repeat*>(state)->leading = true;
1616 |  |  | BOOST_REGEX_FALLTHROUGH;
1617 |  |  | default:
1618 |  | 351546x | return;
1619 |  |  | }
1620 |  | 473575x | }while(state);
1621 |  |  | }
1622 |  |  |
1623 |  |  | } // namespace BOOST_REGEX_DETAIL_NS
1624 |  |  |
1625 |  |  | } // namespace boost
1626 |  |  |
1627 |  |  | #ifdef BOOST_REGEX_MSVC
1628 |  |  | # pragma warning(pop)
1629 |  |  | #endif
1630 |  |  |
1631 |  |  | #endif
1632 |  |  |