annotate DEPENDENCIES/generic/include/boost/regex/v4/regex_split.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 /*
Chris@16 2 *
Chris@16 3 * Copyright (c) 1998-2002
Chris@16 4 * John Maddock
Chris@16 5 *
Chris@16 6 * Use, modification and distribution are subject to the
Chris@16 7 * Boost Software License, Version 1.0. (See accompanying file
Chris@16 8 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 9 *
Chris@16 10 */
Chris@16 11
Chris@16 12 /*
Chris@16 13 * LOCATION: see http://www.boost.org for most recent version.
Chris@16 14 * FILE regex_split.hpp
Chris@16 15 * VERSION see <boost/version.hpp>
Chris@16 16 * DESCRIPTION: Implements regex_split and associated functions.
Chris@16 17 * Note this is an internal header file included
Chris@16 18 * by regex.hpp, do not include on its own.
Chris@16 19 */
Chris@16 20
Chris@16 21 #ifndef BOOST_REGEX_SPLIT_HPP
Chris@16 22 #define BOOST_REGEX_SPLIT_HPP
Chris@16 23
Chris@16 24 namespace boost{
Chris@16 25
Chris@16 26 #ifdef BOOST_MSVC
Chris@16 27 #pragma warning(push)
Chris@16 28 #pragma warning(disable: 4103)
Chris@16 29 #endif
Chris@16 30 #ifdef BOOST_HAS_ABI_HEADERS
Chris@16 31 # include BOOST_ABI_PREFIX
Chris@16 32 #endif
Chris@16 33 #ifdef BOOST_MSVC
Chris@16 34 #pragma warning(pop)
Chris@16 35 #endif
Chris@16 36
Chris@16 37 #ifdef BOOST_MSVC
Chris@16 38 # pragma warning(push)
Chris@16 39 # pragma warning(disable: 4800)
Chris@16 40 #endif
Chris@16 41
Chris@16 42 namespace re_detail{
Chris@16 43
Chris@16 44 template <class charT>
Chris@16 45 const basic_regex<charT>& get_default_expression(charT)
Chris@16 46 {
Chris@16 47 static const charT expression_text[4] = { '\\', 's', '+', '\00', };
Chris@16 48 static const basic_regex<charT> e(expression_text);
Chris@16 49 return e;
Chris@16 50 }
Chris@16 51
Chris@16 52 template <class OutputIterator, class charT, class Traits1, class Alloc1>
Chris@16 53 class split_pred
Chris@16 54 {
Chris@16 55 typedef std::basic_string<charT, Traits1, Alloc1> string_type;
Chris@16 56 typedef typename string_type::const_iterator iterator_type;
Chris@16 57 iterator_type* p_last;
Chris@16 58 OutputIterator* p_out;
Chris@16 59 std::size_t* p_max;
Chris@16 60 std::size_t initial_max;
Chris@16 61 public:
Chris@16 62 split_pred(iterator_type* a, OutputIterator* b, std::size_t* c)
Chris@16 63 : p_last(a), p_out(b), p_max(c), initial_max(*c) {}
Chris@16 64
Chris@16 65 bool operator()(const match_results<iterator_type>& what);
Chris@16 66 };
Chris@16 67
Chris@16 68 template <class OutputIterator, class charT, class Traits1, class Alloc1>
Chris@16 69 bool split_pred<OutputIterator, charT, Traits1, Alloc1>::operator()
Chris@16 70 (const match_results<iterator_type>& what)
Chris@16 71 {
Chris@16 72 *p_last = what[0].second;
Chris@16 73 if(what.size() > 1)
Chris@16 74 {
Chris@16 75 // output sub-expressions only:
Chris@16 76 for(unsigned i = 1; i < what.size(); ++i)
Chris@16 77 {
Chris@16 78 *(*p_out) = what.str(i);
Chris@16 79 ++(*p_out);
Chris@16 80 if(0 == --*p_max) return false;
Chris@16 81 }
Chris@16 82 return *p_max != 0;
Chris@16 83 }
Chris@16 84 else
Chris@16 85 {
Chris@16 86 // output $` only if it's not-null or not at the start of the input:
Chris@16 87 const sub_match<iterator_type>& sub = what[-1];
Chris@16 88 if((sub.first != sub.second) || (*p_max != initial_max))
Chris@16 89 {
Chris@16 90 *(*p_out) = sub.str();
Chris@16 91 ++(*p_out);
Chris@16 92 return --*p_max;
Chris@16 93 }
Chris@16 94 }
Chris@16 95 //
Chris@16 96 // initial null, do nothing:
Chris@16 97 return true;
Chris@16 98 }
Chris@16 99
Chris@16 100 } // namespace re_detail
Chris@16 101
Chris@16 102 template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
Chris@16 103 std::size_t regex_split(OutputIterator out,
Chris@16 104 std::basic_string<charT, Traits1, Alloc1>& s,
Chris@16 105 const basic_regex<charT, Traits2>& e,
Chris@16 106 match_flag_type flags,
Chris@16 107 std::size_t max_split)
Chris@16 108 {
Chris@16 109 typedef typename std::basic_string<charT, Traits1, Alloc1>::const_iterator ci_t;
Chris@16 110 //typedef typename match_results<ci_t>::allocator_type match_allocator;
Chris@16 111 ci_t last = s.begin();
Chris@16 112 std::size_t init_size = max_split;
Chris@16 113 re_detail::split_pred<OutputIterator, charT, Traits1, Alloc1> pred(&last, &out, &max_split);
Chris@16 114 ci_t i, j;
Chris@16 115 i = s.begin();
Chris@16 116 j = s.end();
Chris@16 117 regex_grep(pred, i, j, e, flags);
Chris@16 118 //
Chris@16 119 // if there is still input left, do a final push as long as max_split
Chris@16 120 // is not exhausted, and we're not splitting sub-expressions rather
Chris@16 121 // than whitespace:
Chris@101 122 if(max_split && (last != s.end()) && (e.mark_count() == 0))
Chris@16 123 {
Chris@16 124 *out = std::basic_string<charT, Traits1, Alloc1>((ci_t)last, (ci_t)s.end());
Chris@16 125 ++out;
Chris@16 126 last = s.end();
Chris@16 127 --max_split;
Chris@16 128 }
Chris@16 129 //
Chris@16 130 // delete from the string everything that has been processed so far:
Chris@16 131 s.erase(0, last - s.begin());
Chris@16 132 //
Chris@16 133 // return the number of new records pushed:
Chris@16 134 return init_size - max_split;
Chris@16 135 }
Chris@16 136
Chris@16 137 template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
Chris@16 138 inline std::size_t regex_split(OutputIterator out,
Chris@16 139 std::basic_string<charT, Traits1, Alloc1>& s,
Chris@16 140 const basic_regex<charT, Traits2>& e,
Chris@16 141 match_flag_type flags = match_default)
Chris@16 142 {
Chris@16 143 return regex_split(out, s, e, flags, UINT_MAX);
Chris@16 144 }
Chris@16 145
Chris@16 146 template <class OutputIterator, class charT, class Traits1, class Alloc1>
Chris@16 147 inline std::size_t regex_split(OutputIterator out,
Chris@16 148 std::basic_string<charT, Traits1, Alloc1>& s)
Chris@16 149 {
Chris@16 150 return regex_split(out, s, re_detail::get_default_expression(charT(0)), match_default, UINT_MAX);
Chris@16 151 }
Chris@16 152
Chris@16 153 #ifdef BOOST_MSVC
Chris@16 154 # pragma warning(pop)
Chris@16 155 #endif
Chris@16 156
Chris@16 157 #ifdef BOOST_MSVC
Chris@16 158 #pragma warning(push)
Chris@16 159 #pragma warning(disable: 4103)
Chris@16 160 #endif
Chris@16 161 #ifdef BOOST_HAS_ABI_HEADERS
Chris@16 162 # include BOOST_ABI_SUFFIX
Chris@16 163 #endif
Chris@16 164 #ifdef BOOST_MSVC
Chris@16 165 #pragma warning(pop)
Chris@16 166 #endif
Chris@16 167
Chris@16 168 } // namespace boost
Chris@16 169
Chris@16 170 #endif
Chris@16 171
Chris@16 172