annotate DEPENDENCIES/generic/include/boost/regex/v4/sub_match.hpp @ 16:2665513ce2d3

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