include/boost/regex/v5/regex_split.hpp
97.4% Lines (37/38)
100.0% List of functions (9/9)
Functions (9)
Function
Calls
Lines
Blocks
boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const& boost::re_detail_600::get_default_expression<char>(char)
:39
1x
100.0%
82.0%
boost::re_detail_600::split_pred<std::back_insert_iterator<std::__cxx11::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, std::char_traits<char>, std::allocator<char> >::split_pred(__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >*, std::back_insert_iterator<std::__cxx11::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, unsigned long*)
:56
2x
100.0%
100.0%
boost::re_detail_600::split_pred<std::ostream_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char> >, char, std::char_traits<char>, std::allocator<char> >::split_pred(__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >*, std::ostream_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char> >*, unsigned long*)
:56
99x
100.0%
100.0%
boost::re_detail_600::split_pred<std::back_insert_iterator<std::__cxx11::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, std::char_traits<char>, std::allocator<char> >::operator()(boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > const&)
:63
103x
92.9%
44.0%
boost::re_detail_600::split_pred<std::ostream_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char> >, char, std::char_traits<char>, std::allocator<char> >::operator()(boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > const&)
:63
98x
50.0%
42.0%
unsigned long boost::regex_split<std::back_insert_iterator<std::__cxx11::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, std::char_traits<char>, std::allocator<char>, boost::regex_traits<char, boost::cpp_regex_traits<char> > >(std::back_insert_iterator<std::__cxx11::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags, unsigned long)
:97
2x
100.0%
76.0%
unsigned long boost::regex_split<std::ostream_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char> >, char, std::char_traits<char>, std::allocator<char>, boost::regex_traits<char, boost::cpp_regex_traits<char> > >(std::ostream_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags, unsigned long)
:97
99x
73.3%
48.0%
unsigned long boost::regex_split<std::back_insert_iterator<std::__cxx11::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, std::char_traits<char>, std::allocator<char>, boost::regex_traits<char, boost::cpp_regex_traits<char> > >(std::back_insert_iterator<std::__cxx11::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)
:132
1x
100.0%
100.0%
unsigned long boost::regex_split<std::back_insert_iterator<std::__cxx11::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, std::char_traits<char>, std::allocator<char> >(std::back_insert_iterator<std::__cxx11::list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)
:141
1x
100.0%
100.0%
| Line | TLA | Hits | Source Code |
|---|---|---|---|
| 1 | /* | ||
| 2 | * | ||
| 3 | * Copyright (c) 1998-2002 | ||
| 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 regex_split.hpp | ||
| 15 | * VERSION see <boost/version.hpp> | ||
| 16 | * DESCRIPTION: Implements regex_split and associated functions. | ||
| 17 | * Note this is an internal header file included | ||
| 18 | * by regex.hpp, do not include on its own. | ||
| 19 | */ | ||
| 20 | |||
| 21 | #ifndef BOOST_REGEX_SPLIT_HPP | ||
| 22 | #define BOOST_REGEX_SPLIT_HPP | ||
| 23 | |||
| 24 | #include <boost/regex/v5/basic_regex.hpp> | ||
| 25 | #include <boost/regex/v5/match_results.hpp> | ||
| 26 | |||
| 27 | namespace boost{ | ||
| 28 | |||
| 29 | #ifdef BOOST_REGEX_MSVC | ||
| 30 | # pragma warning(push) | ||
| 31 | #if BOOST_REGEX_MSVC < 1910 | ||
| 32 | #pragma warning(disable:4800) | ||
| 33 | #endif | ||
| 34 | #endif | ||
| 35 | |||
| 36 | namespace BOOST_REGEX_DETAIL_NS{ | ||
| 37 | |||
| 38 | template <class charT> | ||
| 39 | 1x | const basic_regex<charT>& get_default_expression(charT) | |
| 40 | { | ||
| 41 | static const charT expression_text[4] = { '\\', 's', '+', '\00', }; | ||
| 42 | 1x | static const basic_regex<charT> e(expression_text); | |
| 43 | 1x | return e; | |
| 44 | } | ||
| 45 | |||
| 46 | template <class OutputIterator, class charT, class Traits1, class Alloc1> | ||
| 47 | class split_pred | ||
| 48 | { | ||
| 49 | typedef std::basic_string<charT, Traits1, Alloc1> string_type; | ||
| 50 | typedef typename string_type::const_iterator iterator_type; | ||
| 51 | iterator_type* p_last; | ||
| 52 | OutputIterator* p_out; | ||
| 53 | std::size_t* p_max; | ||
| 54 | std::size_t initial_max; | ||
| 55 | public: | ||
| 56 | 101x | split_pred(iterator_type* a, OutputIterator* b, std::size_t* c) | |
| 57 | 101x | : p_last(a), p_out(b), p_max(c), initial_max(*c) {} | |
| 58 | |||
| 59 | bool operator()(const match_results<iterator_type>& what); | ||
| 60 | }; | ||
| 61 | |||
| 62 | template <class OutputIterator, class charT, class Traits1, class Alloc1> | ||
| 63 | 201x | bool split_pred<OutputIterator, charT, Traits1, Alloc1>::operator() | |
| 64 | (const match_results<iterator_type>& what) | ||
| 65 | { | ||
| 66 | 201x | *p_last = what[0].second; | |
| 67 | 201x | if(what.size() > 1) | |
| 68 | { | ||
| 69 | // output sub-expressions only: | ||
| 70 | 294x | for(unsigned i = 1; i < what.size(); ++i) | |
| 71 | { | ||
| 72 | 196x | *(*p_out) = what.str(i); | |
| 73 | 196x | ++(*p_out); | |
| 74 | 196x | if(0 == --*p_max) return false; | |
| 75 | } | ||
| 76 | 98x | return *p_max != 0; | |
| 77 | } | ||
| 78 | else | ||
| 79 | { | ||
| 80 | // output $` only if it's not-null or not at the start of the input: | ||
| 81 | 5x | const sub_match<iterator_type>& sub = what[-1]; | |
| 82 | 5x | if((sub.first != sub.second) || (*p_max != initial_max)) | |
| 83 | { | ||
| 84 | 5x | *(*p_out) = sub.str(); | |
| 85 | 5x | ++(*p_out); | |
| 86 | 5x | return --*p_max; | |
| 87 | } | ||
| 88 | } | ||
| 89 | // | ||
| 90 | // initial null, do nothing: | ||
| 91 | ✗ | return true; | |
| 92 | } | ||
| 93 | |||
| 94 | } // namespace BOOST_REGEX_DETAIL_NS | ||
| 95 | |||
| 96 | BOOST_REGEX_MODULE_EXPORT template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2> | ||
| 97 | 101x | std::size_t regex_split(OutputIterator out, | |
| 98 | std::basic_string<charT, Traits1, Alloc1>& s, | ||
| 99 | const basic_regex<charT, Traits2>& e, | ||
| 100 | match_flag_type flags, | ||
| 101 | std::size_t max_split) | ||
| 102 | { | ||
| 103 | typedef typename std::basic_string<charT, Traits1, Alloc1>::const_iterator ci_t; | ||
| 104 | //typedef typename match_results<ci_t>::allocator_type match_allocator; | ||
| 105 | 101x | ci_t last = s.begin(); | |
| 106 | 101x | std::size_t init_size = max_split; | |
| 107 | 101x | BOOST_REGEX_DETAIL_NS::split_pred<OutputIterator, charT, Traits1, Alloc1> pred(&last, &out, &max_split); | |
| 108 | 101x | ci_t i, j; | |
| 109 | 101x | i = s.begin(); | |
| 110 | 101x | j = s.end(); | |
| 111 | 101x | regex_grep(pred, i, j, e, flags); | |
| 112 | // | ||
| 113 | // if there is still input left, do a final push as long as max_split | ||
| 114 | // is not exhausted, and we're not splitting sub-expressions rather | ||
| 115 | // than whitespace: | ||
| 116 | 101x | if(max_split && (last != s.end()) && (e.mark_count() == 0)) | |
| 117 | { | ||
| 118 | 1x | *out = std::basic_string<charT, Traits1, Alloc1>((ci_t)last, (ci_t)s.end()); | |
| 119 | 1x | ++out; | |
| 120 | 1x | last = s.end(); | |
| 121 | 1x | --max_split; | |
| 122 | } | ||
| 123 | // | ||
| 124 | // delete from the string everything that has been processed so far: | ||
| 125 | 101x | s.erase(0, last - s.begin()); | |
| 126 | // | ||
| 127 | // return the number of new records pushed: | ||
| 128 | 101x | return init_size - max_split; | |
| 129 | } | ||
| 130 | |||
| 131 | BOOST_REGEX_MODULE_EXPORT template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2> | ||
| 132 | 1x | inline std::size_t regex_split(OutputIterator out, | |
| 133 | std::basic_string<charT, Traits1, Alloc1>& s, | ||
| 134 | const basic_regex<charT, Traits2>& e, | ||
| 135 | match_flag_type flags = match_default) | ||
| 136 | { | ||
| 137 | 1x | return regex_split(out, s, e, flags, UINT_MAX); | |
| 138 | } | ||
| 139 | |||
| 140 | BOOST_REGEX_MODULE_EXPORT template <class OutputIterator, class charT, class Traits1, class Alloc1> | ||
| 141 | 1x | inline std::size_t regex_split(OutputIterator out, | |
| 142 | std::basic_string<charT, Traits1, Alloc1>& s) | ||
| 143 | { | ||
| 144 | 1x | return regex_split(out, s, BOOST_REGEX_DETAIL_NS::get_default_expression(charT(0)), match_default, UINT_MAX); | |
| 145 | } | ||
| 146 | |||
| 147 | #ifdef BOOST_REGEX_MSVC | ||
| 148 | # pragma warning(pop) | ||
| 149 | #endif | ||
| 150 | |||
| 151 | } // namespace boost | ||
| 152 | |||
| 153 | #endif | ||
| 154 | |||
| 155 | |||
| 156 |