annotate DEPENDENCIES/generic/include/boost/regex/v4/sub_match.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +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 sub_match.cpp
Chris@16 15 * VERSION see <boost/version.hpp>
Chris@16 16 * DESCRIPTION: Declares template class sub_match.
Chris@16 17 */
Chris@16 18
Chris@16 19 #ifndef BOOST_REGEX_V4_SUB_MATCH_HPP
Chris@16 20 #define BOOST_REGEX_V4_SUB_MATCH_HPP
Chris@16 21
Chris@16 22 #ifdef BOOST_MSVC
Chris@16 23 #pragma warning(push)
Chris@16 24 #pragma warning(disable: 4103)
Chris@16 25 #endif
Chris@16 26 #ifdef BOOST_HAS_ABI_HEADERS
Chris@16 27 # include BOOST_ABI_PREFIX
Chris@16 28 #endif
Chris@16 29 #ifdef BOOST_MSVC
Chris@16 30 #pragma warning(pop)
Chris@16 31 #endif
Chris@16 32
Chris@16 33 namespace boost{
Chris@16 34
Chris@16 35 template <class BidiIterator>
Chris@16 36 struct sub_match : public std::pair<BidiIterator, BidiIterator>
Chris@16 37 {
Chris@16 38 typedef typename re_detail::regex_iterator_traits<BidiIterator>::value_type value_type;
Chris@101 39 #if defined(BOOST_NO_STD_ITERATOR_TRAITS)
Chris@16 40 typedef std::ptrdiff_t difference_type;
Chris@16 41 #else
Chris@16 42 typedef typename re_detail::regex_iterator_traits<BidiIterator>::difference_type difference_type;
Chris@16 43 #endif
Chris@16 44 typedef BidiIterator iterator_type;
Chris@16 45 typedef BidiIterator iterator;
Chris@16 46 typedef BidiIterator const_iterator;
Chris@16 47
Chris@16 48 bool matched;
Chris@16 49
Chris@16 50 sub_match() : std::pair<BidiIterator, BidiIterator>(), matched(false) {}
Chris@16 51 sub_match(BidiIterator i) : std::pair<BidiIterator, BidiIterator>(i, i), matched(false) {}
Chris@16 52 #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
Chris@16 53 && !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)\
Chris@16 54 && !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042))
Chris@16 55 template <class T, class A>
Chris@16 56 operator std::basic_string<value_type, T, A> ()const
Chris@16 57 {
Chris@16 58 return matched ? std::basic_string<value_type, T, A>(this->first, this->second) : std::basic_string<value_type, T, A>();
Chris@16 59 }
Chris@16 60 #else
Chris@16 61 operator std::basic_string<value_type> ()const
Chris@16 62 {
Chris@16 63 return str();
Chris@16 64 }
Chris@16 65 #endif
Chris@16 66 difference_type BOOST_REGEX_CALL length()const
Chris@16 67 {
Chris@16 68 difference_type n = matched ? ::boost::re_detail::distance((BidiIterator)this->first, (BidiIterator)this->second) : 0;
Chris@16 69 return n;
Chris@16 70 }
Chris@16 71 std::basic_string<value_type> str()const
Chris@16 72 {
Chris@16 73 std::basic_string<value_type> result;
Chris@16 74 if(matched)
Chris@16 75 {
Chris@16 76 std::size_t len = ::boost::re_detail::distance((BidiIterator)this->first, (BidiIterator)this->second);
Chris@16 77 result.reserve(len);
Chris@16 78 BidiIterator i = this->first;
Chris@16 79 while(i != this->second)
Chris@16 80 {
Chris@16 81 result.append(1, *i);
Chris@16 82 ++i;
Chris@16 83 }
Chris@16 84 }
Chris@16 85 return result;
Chris@16 86 }
Chris@16 87 int compare(const sub_match& s)const
Chris@16 88 {
Chris@16 89 if(matched != s.matched)
Chris@16 90 return static_cast<int>(matched) - static_cast<int>(s.matched);
Chris@16 91 return str().compare(s.str());
Chris@16 92 }
Chris@16 93 int compare(const std::basic_string<value_type>& s)const
Chris@16 94 {
Chris@16 95 return str().compare(s);
Chris@16 96 }
Chris@16 97 int compare(const value_type* p)const
Chris@16 98 {
Chris@16 99 return str().compare(p);
Chris@16 100 }
Chris@16 101
Chris@16 102 bool operator==(const sub_match& that)const
Chris@16 103 { return compare(that) == 0; }
Chris@16 104 bool BOOST_REGEX_CALL operator !=(const sub_match& that)const
Chris@16 105 { return compare(that) != 0; }
Chris@16 106 bool operator<(const sub_match& that)const
Chris@16 107 { return compare(that) < 0; }
Chris@16 108 bool operator>(const sub_match& that)const
Chris@16 109 { return compare(that) > 0; }
Chris@16 110 bool operator<=(const sub_match& that)const
Chris@16 111 { return compare(that) <= 0; }
Chris@16 112 bool operator>=(const sub_match& that)const
Chris@16 113 { return compare(that) >= 0; }
Chris@16 114
Chris@16 115 #ifdef BOOST_REGEX_MATCH_EXTRA
Chris@16 116 typedef std::vector<sub_match<BidiIterator> > capture_sequence_type;
Chris@16 117
Chris@16 118 const capture_sequence_type& captures()const
Chris@16 119 {
Chris@16 120 if(!m_captures)
Chris@16 121 m_captures.reset(new capture_sequence_type());
Chris@16 122 return *m_captures;
Chris@16 123 }
Chris@16 124 //
Chris@16 125 // Private implementation API: DO NOT USE!
Chris@16 126 //
Chris@16 127 capture_sequence_type& get_captures()const
Chris@16 128 {
Chris@16 129 if(!m_captures)
Chris@16 130 m_captures.reset(new capture_sequence_type());
Chris@16 131 return *m_captures;
Chris@16 132 }
Chris@16 133
Chris@16 134 private:
Chris@16 135 mutable boost::scoped_ptr<capture_sequence_type> m_captures;
Chris@16 136 public:
Chris@16 137
Chris@16 138 #endif
Chris@16 139 sub_match(const sub_match& that, bool
Chris@16 140 #ifdef BOOST_REGEX_MATCH_EXTRA
Chris@16 141 deep_copy
Chris@16 142 #endif
Chris@16 143 = true
Chris@16 144 )
Chris@16 145 : std::pair<BidiIterator, BidiIterator>(that),
Chris@16 146 matched(that.matched)
Chris@16 147 {
Chris@16 148 #ifdef BOOST_REGEX_MATCH_EXTRA
Chris@16 149 if(that.m_captures)
Chris@16 150 if(deep_copy)
Chris@16 151 m_captures.reset(new capture_sequence_type(*(that.m_captures)));
Chris@16 152 #endif
Chris@16 153 }
Chris@16 154 sub_match& operator=(const sub_match& that)
Chris@16 155 {
Chris@16 156 this->first = that.first;
Chris@16 157 this->second = that.second;
Chris@16 158 matched = that.matched;
Chris@16 159 #ifdef BOOST_REGEX_MATCH_EXTRA
Chris@16 160 if(that.m_captures)
Chris@16 161 get_captures() = *(that.m_captures);
Chris@16 162 #endif
Chris@16 163 return *this;
Chris@16 164 }
Chris@16 165
Chris@16 166
Chris@16 167 #ifdef BOOST_OLD_REGEX_H
Chris@16 168 //
Chris@16 169 // the following are deprecated, do not use!!
Chris@16 170 //
Chris@16 171 operator int()const;
Chris@16 172 operator unsigned int()const;
Chris@16 173 operator short()const
Chris@16 174 {
Chris@16 175 return (short)(int)(*this);
Chris@16 176 }
Chris@16 177 operator unsigned short()const
Chris@16 178 {
Chris@16 179 return (unsigned short)(unsigned int)(*this);
Chris@16 180 }
Chris@16 181 #endif
Chris@16 182 };
Chris@16 183
Chris@16 184 typedef sub_match<const char*> csub_match;
Chris@16 185 typedef sub_match<std::string::const_iterator> ssub_match;
Chris@16 186 #ifndef BOOST_NO_WREGEX
Chris@16 187 typedef sub_match<const wchar_t*> wcsub_match;
Chris@16 188 typedef sub_match<std::wstring::const_iterator> wssub_match;
Chris@16 189 #endif
Chris@16 190
Chris@16 191 // comparison to std::basic_string<> part 1:
Chris@16 192 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 193 inline bool operator == (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
Chris@16 194 const sub_match<RandomAccessIterator>& m)
Chris@16 195 { return s.compare(m.str()) == 0; }
Chris@16 196 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 197 inline bool operator != (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
Chris@16 198 const sub_match<RandomAccessIterator>& m)
Chris@16 199 { return s.compare(m.str()) != 0; }
Chris@16 200 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 201 inline bool operator < (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
Chris@16 202 const sub_match<RandomAccessIterator>& m)
Chris@16 203 { return s.compare(m.str()) < 0; }
Chris@16 204 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 205 inline bool operator <= (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
Chris@16 206 const sub_match<RandomAccessIterator>& m)
Chris@16 207 { return s.compare(m.str()) <= 0; }
Chris@16 208 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 209 inline bool operator >= (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
Chris@16 210 const sub_match<RandomAccessIterator>& m)
Chris@16 211 { return s.compare(m.str()) >= 0; }
Chris@16 212 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 213 inline bool operator > (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
Chris@16 214 const sub_match<RandomAccessIterator>& m)
Chris@16 215 { return s.compare(m.str()) > 0; }
Chris@16 216 // comparison to std::basic_string<> part 2:
Chris@16 217 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 218 inline bool operator == (const sub_match<RandomAccessIterator>& m,
Chris@16 219 const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
Chris@16 220 { return m.str().compare(s) == 0; }
Chris@16 221 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 222 inline bool operator != (const sub_match<RandomAccessIterator>& m,
Chris@16 223 const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
Chris@16 224 { return m.str().compare(s) != 0; }
Chris@16 225 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 226 inline bool operator < (const sub_match<RandomAccessIterator>& m,
Chris@16 227 const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
Chris@16 228 { return m.str().compare(s) < 0; }
Chris@16 229 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 230 inline bool operator > (const sub_match<RandomAccessIterator>& m,
Chris@16 231 const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
Chris@16 232 { return m.str().compare(s) > 0; }
Chris@16 233 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 234 inline bool operator <= (const sub_match<RandomAccessIterator>& m,
Chris@16 235 const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
Chris@16 236 { return m.str().compare(s) <= 0; }
Chris@16 237 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 238 inline bool operator >= (const sub_match<RandomAccessIterator>& m,
Chris@16 239 const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
Chris@16 240 { return m.str().compare(s) >= 0; }
Chris@16 241 // comparison to const charT* part 1:
Chris@16 242 template <class RandomAccessIterator>
Chris@16 243 inline bool operator == (const sub_match<RandomAccessIterator>& m,
Chris@16 244 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
Chris@16 245 { return m.str().compare(s) == 0; }
Chris@16 246 template <class RandomAccessIterator>
Chris@16 247 inline bool operator != (const sub_match<RandomAccessIterator>& m,
Chris@16 248 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
Chris@16 249 { return m.str().compare(s) != 0; }
Chris@16 250 template <class RandomAccessIterator>
Chris@16 251 inline bool operator > (const sub_match<RandomAccessIterator>& m,
Chris@16 252 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
Chris@16 253 { return m.str().compare(s) > 0; }
Chris@16 254 template <class RandomAccessIterator>
Chris@16 255 inline bool operator < (const sub_match<RandomAccessIterator>& m,
Chris@16 256 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
Chris@16 257 { return m.str().compare(s) < 0; }
Chris@16 258 template <class RandomAccessIterator>
Chris@16 259 inline bool operator >= (const sub_match<RandomAccessIterator>& m,
Chris@16 260 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
Chris@16 261 { return m.str().compare(s) >= 0; }
Chris@16 262 template <class RandomAccessIterator>
Chris@16 263 inline bool operator <= (const sub_match<RandomAccessIterator>& m,
Chris@16 264 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
Chris@16 265 { return m.str().compare(s) <= 0; }
Chris@16 266 // comparison to const charT* part 2:
Chris@16 267 template <class RandomAccessIterator>
Chris@16 268 inline bool operator == (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
Chris@16 269 const sub_match<RandomAccessIterator>& m)
Chris@16 270 { return m.str().compare(s) == 0; }
Chris@16 271 template <class RandomAccessIterator>
Chris@16 272 inline bool operator != (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
Chris@16 273 const sub_match<RandomAccessIterator>& m)
Chris@16 274 { return m.str().compare(s) != 0; }
Chris@16 275 template <class RandomAccessIterator>
Chris@16 276 inline bool operator < (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
Chris@16 277 const sub_match<RandomAccessIterator>& m)
Chris@16 278 { return m.str().compare(s) > 0; }
Chris@16 279 template <class RandomAccessIterator>
Chris@16 280 inline bool operator > (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
Chris@16 281 const sub_match<RandomAccessIterator>& m)
Chris@16 282 { return m.str().compare(s) < 0; }
Chris@16 283 template <class RandomAccessIterator>
Chris@16 284 inline bool operator <= (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
Chris@16 285 const sub_match<RandomAccessIterator>& m)
Chris@16 286 { return m.str().compare(s) >= 0; }
Chris@16 287 template <class RandomAccessIterator>
Chris@16 288 inline bool operator >= (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
Chris@16 289 const sub_match<RandomAccessIterator>& m)
Chris@16 290 { return m.str().compare(s) <= 0; }
Chris@16 291
Chris@16 292 // comparison to const charT& part 1:
Chris@16 293 template <class RandomAccessIterator>
Chris@16 294 inline bool operator == (const sub_match<RandomAccessIterator>& m,
Chris@16 295 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
Chris@16 296 { return m.str().compare(0, m.length(), &s, 1) == 0; }
Chris@16 297 template <class RandomAccessIterator>
Chris@16 298 inline bool operator != (const sub_match<RandomAccessIterator>& m,
Chris@16 299 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
Chris@16 300 { return m.str().compare(0, m.length(), &s, 1) != 0; }
Chris@16 301 template <class RandomAccessIterator>
Chris@16 302 inline bool operator > (const sub_match<RandomAccessIterator>& m,
Chris@16 303 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
Chris@16 304 { return m.str().compare(0, m.length(), &s, 1) > 0; }
Chris@16 305 template <class RandomAccessIterator>
Chris@16 306 inline bool operator < (const sub_match<RandomAccessIterator>& m,
Chris@16 307 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
Chris@16 308 { return m.str().compare(0, m.length(), &s, 1) < 0; }
Chris@16 309 template <class RandomAccessIterator>
Chris@16 310 inline bool operator >= (const sub_match<RandomAccessIterator>& m,
Chris@16 311 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
Chris@16 312 { return m.str().compare(0, m.length(), &s, 1) >= 0; }
Chris@16 313 template <class RandomAccessIterator>
Chris@16 314 inline bool operator <= (const sub_match<RandomAccessIterator>& m,
Chris@16 315 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
Chris@16 316 { return m.str().compare(0, m.length(), &s, 1) <= 0; }
Chris@16 317 // comparison to const charT* part 2:
Chris@16 318 template <class RandomAccessIterator>
Chris@16 319 inline bool operator == (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
Chris@16 320 const sub_match<RandomAccessIterator>& m)
Chris@16 321 { return m.str().compare(0, m.length(), &s, 1) == 0; }
Chris@16 322 template <class RandomAccessIterator>
Chris@16 323 inline bool operator != (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
Chris@16 324 const sub_match<RandomAccessIterator>& m)
Chris@16 325 { return m.str().compare(0, m.length(), &s, 1) != 0; }
Chris@16 326 template <class RandomAccessIterator>
Chris@16 327 inline bool operator < (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
Chris@16 328 const sub_match<RandomAccessIterator>& m)
Chris@16 329 { return m.str().compare(0, m.length(), &s, 1) > 0; }
Chris@16 330 template <class RandomAccessIterator>
Chris@16 331 inline bool operator > (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
Chris@16 332 const sub_match<RandomAccessIterator>& m)
Chris@16 333 { return m.str().compare(0, m.length(), &s, 1) < 0; }
Chris@16 334 template <class RandomAccessIterator>
Chris@16 335 inline bool operator <= (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
Chris@16 336 const sub_match<RandomAccessIterator>& m)
Chris@16 337 { return m.str().compare(0, m.length(), &s, 1) >= 0; }
Chris@16 338 template <class RandomAccessIterator>
Chris@16 339 inline bool operator >= (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
Chris@16 340 const sub_match<RandomAccessIterator>& m)
Chris@16 341 { return m.str().compare(0, m.length(), &s, 1) <= 0; }
Chris@16 342
Chris@16 343 // addition operators:
Chris@16 344 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 345 inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>
Chris@16 346 operator + (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
Chris@16 347 const sub_match<RandomAccessIterator>& m)
Chris@16 348 {
Chris@16 349 std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator> result;
Chris@16 350 result.reserve(s.size() + m.length() + 1);
Chris@16 351 return result.append(s).append(m.first, m.second);
Chris@16 352 }
Chris@16 353 template <class RandomAccessIterator, class traits, class Allocator>
Chris@16 354 inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>
Chris@16 355 operator + (const sub_match<RandomAccessIterator>& m,
Chris@16 356 const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
Chris@16 357 {
Chris@16 358 std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator> result;
Chris@16 359 result.reserve(s.size() + m.length() + 1);
Chris@16 360 return result.append(m.first, m.second).append(s);
Chris@16 361 }
Chris@16 362 #if !(defined(__GNUC__) && defined(BOOST_NO_STD_LOCALE))
Chris@16 363 template <class RandomAccessIterator>
Chris@16 364 inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
Chris@16 365 operator + (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
Chris@16 366 const sub_match<RandomAccessIterator>& m)
Chris@16 367 {
Chris@16 368 std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
Chris@16 369 result.reserve(std::char_traits<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>::length(s) + m.length() + 1);
Chris@16 370 return result.append(s).append(m.first, m.second);
Chris@16 371 }
Chris@16 372 template <class RandomAccessIterator>
Chris@16 373 inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
Chris@16 374 operator + (const sub_match<RandomAccessIterator>& m,
Chris@16 375 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const * s)
Chris@16 376 {
Chris@16 377 std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
Chris@16 378 result.reserve(std::char_traits<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>::length(s) + m.length() + 1);
Chris@16 379 return result.append(m.first, m.second).append(s);
Chris@16 380 }
Chris@16 381 #else
Chris@16 382 // worwaround versions:
Chris@16 383 template <class RandomAccessIterator>
Chris@16 384 inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
Chris@16 385 operator + (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
Chris@16 386 const sub_match<RandomAccessIterator>& m)
Chris@16 387 {
Chris@16 388 return s + m.str();
Chris@16 389 }
Chris@16 390 template <class RandomAccessIterator>
Chris@16 391 inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
Chris@16 392 operator + (const sub_match<RandomAccessIterator>& m,
Chris@16 393 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const * s)
Chris@16 394 {
Chris@16 395 return m.str() + s;
Chris@16 396 }
Chris@16 397 #endif
Chris@16 398 template <class RandomAccessIterator>
Chris@16 399 inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
Chris@16 400 operator + (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
Chris@16 401 const sub_match<RandomAccessIterator>& m)
Chris@16 402 {
Chris@16 403 std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
Chris@16 404 result.reserve(m.length() + 2);
Chris@16 405 return result.append(1, s).append(m.first, m.second);
Chris@16 406 }
Chris@16 407 template <class RandomAccessIterator>
Chris@16 408 inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
Chris@16 409 operator + (const sub_match<RandomAccessIterator>& m,
Chris@16 410 typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
Chris@16 411 {
Chris@16 412 std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
Chris@16 413 result.reserve(m.length() + 2);
Chris@16 414 return result.append(m.first, m.second).append(1, s);
Chris@16 415 }
Chris@16 416 template <class RandomAccessIterator>
Chris@16 417 inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
Chris@16 418 operator + (const sub_match<RandomAccessIterator>& m1,
Chris@16 419 const sub_match<RandomAccessIterator>& m2)
Chris@16 420 {
Chris@16 421 std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
Chris@16 422 result.reserve(m1.length() + m2.length() + 1);
Chris@16 423 return result.append(m1.first, m1.second).append(m2.first, m2.second);
Chris@16 424 }
Chris@16 425 #ifndef BOOST_NO_STD_LOCALE
Chris@16 426 template <class charT, class traits, class RandomAccessIterator>
Chris@16 427 std::basic_ostream<charT, traits>&
Chris@16 428 operator << (std::basic_ostream<charT, traits>& os,
Chris@16 429 const sub_match<RandomAccessIterator>& s)
Chris@16 430 {
Chris@16 431 return (os << s.str());
Chris@16 432 }
Chris@16 433 #else
Chris@16 434 template <class RandomAccessIterator>
Chris@16 435 std::ostream& operator << (std::ostream& os,
Chris@16 436 const sub_match<RandomAccessIterator>& s)
Chris@16 437 {
Chris@16 438 return (os << s.str());
Chris@16 439 }
Chris@16 440 #endif
Chris@16 441
Chris@16 442 #ifdef BOOST_OLD_REGEX_H
Chris@16 443 namespace re_detail{
Chris@16 444 template <class BidiIterator, class charT>
Chris@16 445 int do_toi(BidiIterator i, BidiIterator j, char c, int radix)
Chris@16 446 {
Chris@16 447 std::string s(i, j);
Chris@16 448 char* p;
Chris@16 449 int result = std::strtol(s.c_str(), &p, radix);
Chris@16 450 if(*p)raise_regex_exception("Bad sub-expression");
Chris@16 451 return result;
Chris@16 452 }
Chris@16 453
Chris@16 454 //
Chris@16 455 // helper:
Chris@16 456 template <class I, class charT>
Chris@16 457 int do_toi(I& i, I j, charT c)
Chris@16 458 {
Chris@16 459 int result = 0;
Chris@16 460 while((i != j) && (isdigit(*i)))
Chris@16 461 {
Chris@16 462 result = result*10 + (*i - '0');
Chris@16 463 ++i;
Chris@16 464 }
Chris@16 465 return result;
Chris@16 466 }
Chris@16 467 }
Chris@16 468
Chris@16 469
Chris@16 470 template <class BidiIterator>
Chris@16 471 sub_match<BidiIterator>::operator int()const
Chris@16 472 {
Chris@16 473 BidiIterator i = first;
Chris@16 474 BidiIterator j = second;
Chris@16 475 if(i == j)raise_regex_exception("Bad sub-expression");
Chris@16 476 int neg = 1;
Chris@16 477 if((i != j) && (*i == '-'))
Chris@16 478 {
Chris@16 479 neg = -1;
Chris@16 480 ++i;
Chris@16 481 }
Chris@16 482 neg *= re_detail::do_toi(i, j, *i);
Chris@16 483 if(i != j)raise_regex_exception("Bad sub-expression");
Chris@16 484 return neg;
Chris@16 485 }
Chris@16 486 template <class BidiIterator>
Chris@16 487 sub_match<BidiIterator>::operator unsigned int()const
Chris@16 488 {
Chris@16 489 BidiIterator i = first;
Chris@16 490 BidiIterator j = second;
Chris@16 491 if(i == j)
Chris@16 492 raise_regex_exception("Bad sub-expression");
Chris@16 493 return re_detail::do_toi(i, j, *first);
Chris@16 494 }
Chris@16 495 #endif
Chris@16 496
Chris@16 497 } // namespace boost
Chris@16 498
Chris@16 499 #ifdef BOOST_MSVC
Chris@16 500 #pragma warning(push)
Chris@16 501 #pragma warning(disable: 4103)
Chris@16 502 #endif
Chris@16 503 #ifdef BOOST_HAS_ABI_HEADERS
Chris@16 504 # include BOOST_ABI_SUFFIX
Chris@16 505 #endif
Chris@16 506 #ifdef BOOST_MSVC
Chris@16 507 #pragma warning(pop)
Chris@16 508 #endif
Chris@16 509
Chris@16 510 #endif
Chris@16 511