| 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         concepts.hpp | 
|---|
| 15 |   *   VERSION      see <boost/version.hpp> | 
|---|
| 16 |   *   DESCRIPTION: Declares regular expression concepts. | 
|---|
| 17 |   */ | 
|---|
| 18 |  | 
|---|
| 19 | #ifndef BOOST_REGEX_CONCEPTS_HPP_INCLUDED | 
|---|
| 20 | #define BOOST_REGEX_CONCEPTS_HPP_INCLUDED | 
|---|
| 21 |  | 
|---|
| 22 | #include <boost/concept_archetype.hpp> | 
|---|
| 23 | #include <boost/concept_check.hpp> | 
|---|
| 24 | #include <boost/type_traits/is_enum.hpp> | 
|---|
| 25 | #include <boost/type_traits/is_base_and_derived.hpp> | 
|---|
| 26 | #include <boost/static_assert.hpp> | 
|---|
| 27 | #ifndef BOOST_TEST_TR1_REGEX | 
|---|
| 28 | #include <boost/regex.hpp> | 
|---|
| 29 | #endif | 
|---|
| 30 | #include <bitset> | 
|---|
| 31 | #include <vector> | 
|---|
| 32 | #include <iostream> | 
|---|
| 33 |  | 
|---|
| 34 | namespace boost{ | 
|---|
| 35 |  | 
|---|
| 36 | // | 
|---|
| 37 | // bitmask_archetype: | 
|---|
| 38 | // this can be either an integer type, an enum, or a std::bitset, | 
|---|
| 39 | // we use the latter as the architype as it offers the "strictest" | 
|---|
| 40 | // of the possible interfaces: | 
|---|
| 41 | // | 
|---|
| 42 | typedef std::bitset<512> bitmask_archetype; | 
|---|
| 43 | // | 
|---|
| 44 | // char_architype: | 
|---|
| 45 | // A strict model for the character type interface. | 
|---|
| 46 | // | 
|---|
| 47 | struct char_architype | 
|---|
| 48 | { | 
|---|
| 49 |    // default constructable: | 
|---|
| 50 |    char_architype(); | 
|---|
| 51 |    // copy constructable / assignable: | 
|---|
| 52 |    char_architype(const char_architype&); | 
|---|
| 53 |    char_architype& operator=(const char_architype&); | 
|---|
| 54 |    // constructable from an integral value: | 
|---|
| 55 |    char_architype(unsigned long val); | 
|---|
| 56 |    // comparable: | 
|---|
| 57 |    bool operator==(const char_architype&)const; | 
|---|
| 58 |    bool operator!=(const char_architype&)const; | 
|---|
| 59 |    bool operator<(const char_architype&)const; | 
|---|
| 60 |    bool operator<=(const char_architype&)const; | 
|---|
| 61 |    bool operator>=(const char_architype&)const; | 
|---|
| 62 |    bool operator>(const char_architype&)const; | 
|---|
| 63 |    // conversion to integral type: | 
|---|
| 64 |    operator long()const; | 
|---|
| 65 | }; | 
|---|
| 66 | // | 
|---|
| 67 | // char_architype can not be used with basic_string: | 
|---|
| 68 | // | 
|---|
| 69 | } // namespace boost | 
|---|
| 70 | namespace std{ | 
|---|
| 71 |    template<> struct char_traits<boost::char_architype>{}; | 
|---|
| 72 | } | 
|---|
| 73 | namespace boost{ | 
|---|
| 74 | // | 
|---|
| 75 | // regex_traits_architype: | 
|---|
| 76 | // A strict interpretation of the regular expression traits class requirements. | 
|---|
| 77 | // | 
|---|
| 78 | template <class charT> | 
|---|
| 79 | struct regex_traits_architype | 
|---|
| 80 | { | 
|---|
| 81 | public: | 
|---|
| 82 |    regex_traits_architype(); | 
|---|
| 83 |    typedef charT char_type; | 
|---|
| 84 |    typedef std::size_t size_type; | 
|---|
| 85 |    typedef std::vector<char_type> string_type; | 
|---|
| 86 |    typedef copy_constructible_archetype<assignable_archetype<> > locale_type; | 
|---|
| 87 |    typedef bitmask_archetype char_class_type; | 
|---|
| 88 |  | 
|---|
| 89 |    static size_type length(const char_type* ) { return 0; } | 
|---|
| 90 |  | 
|---|
| 91 |    charT translate(charT ) const { return charT(); } | 
|---|
| 92 |    charT translate_nocase(charT ) const { return static_object<charT>::get(); } | 
|---|
| 93 |  | 
|---|
| 94 |    template <class ForwardIterator> | 
|---|
| 95 |    string_type transform(ForwardIterator , ForwardIterator ) const | 
|---|
| 96 |    { return static_object<string_type>::get(); } | 
|---|
| 97 |    template <class ForwardIterator> | 
|---|
| 98 |    string_type transform_primary(ForwardIterator , ForwardIterator ) const | 
|---|
| 99 |    { return static_object<string_type>::get(); } | 
|---|
| 100 |  | 
|---|
| 101 |    template <class ForwardIterator> | 
|---|
| 102 |    char_class_type lookup_classname(ForwardIterator , ForwardIterator ) const | 
|---|
| 103 |    { return static_object<char_class_type>::get(); } | 
|---|
| 104 |    template <class ForwardIterator> | 
|---|
| 105 |    string_type lookup_collatename(ForwardIterator , ForwardIterator ) const | 
|---|
| 106 |    { return static_object<string_type>::get(); } | 
|---|
| 107 |  | 
|---|
| 108 |    bool isctype(charT, char_class_type) const | 
|---|
| 109 |    { return false; } | 
|---|
| 110 |    int value(charT, int) const | 
|---|
| 111 |    { return 0; } | 
|---|
| 112 |  | 
|---|
| 113 |    locale_type imbue(locale_type l) | 
|---|
| 114 |    { return l; } | 
|---|
| 115 |    locale_type getloc()const | 
|---|
| 116 |    { return static_object<locale_type>::get(); } | 
|---|
| 117 |  | 
|---|
| 118 | private: | 
|---|
| 119 |    // this type is not copyable: | 
|---|
| 120 |    regex_traits_architype(const regex_traits_architype&); | 
|---|
| 121 |    regex_traits_architype& operator=(const regex_traits_architype&); | 
|---|
| 122 | }; | 
|---|
| 123 |  | 
|---|
| 124 | // | 
|---|
| 125 | // alter this to std::tr1, to test a std implementation: | 
|---|
| 126 | // | 
|---|
| 127 | #ifndef BOOST_TEST_TR1_REGEX | 
|---|
| 128 | namespace global_regex_namespace = ::boost; | 
|---|
| 129 | #else | 
|---|
| 130 | namespace global_regex_namespace = ::std::tr1; | 
|---|
| 131 | #endif | 
|---|
| 132 |  | 
|---|
| 133 | template <class Bitmask> | 
|---|
| 134 | struct BitmaskConcept | 
|---|
| 135 | { | 
|---|
| 136 |    void constraints()  | 
|---|
| 137 |    { | 
|---|
| 138 |       function_requires<CopyConstructibleConcept<Bitmask> >(); | 
|---|
| 139 |       function_requires<AssignableConcept<Bitmask> >(); | 
|---|
| 140 |  | 
|---|
| 141 |       m_mask1 = m_mask2 | m_mask3; | 
|---|
| 142 |       m_mask1 = m_mask2 & m_mask3; | 
|---|
| 143 |       m_mask1 = m_mask2 ^ m_mask3; | 
|---|
| 144 |  | 
|---|
| 145 |       m_mask1 = ~m_mask2; | 
|---|
| 146 |  | 
|---|
| 147 |       m_mask1 |= m_mask2; | 
|---|
| 148 |       m_mask1 &= m_mask2; | 
|---|
| 149 |       m_mask1 ^= m_mask2; | 
|---|
| 150 |    } | 
|---|
| 151 |    Bitmask m_mask1, m_mask2, m_mask3; | 
|---|
| 152 | }; | 
|---|
| 153 |  | 
|---|
| 154 | template <class traits> | 
|---|
| 155 | struct RegexTraitsConcept | 
|---|
| 156 | { | 
|---|
| 157 |    RegexTraitsConcept(); | 
|---|
| 158 |    // required typedefs: | 
|---|
| 159 |    typedef typename traits::char_type char_type; | 
|---|
| 160 |    typedef typename traits::size_type size_type; | 
|---|
| 161 |    typedef typename traits::string_type string_type; | 
|---|
| 162 |    typedef typename traits::locale_type locale_type; | 
|---|
| 163 |    typedef typename traits::char_class_type char_class_type; | 
|---|
| 164 |  | 
|---|
| 165 |    void constraints()  | 
|---|
| 166 |    { | 
|---|
| 167 |       function_requires<UnsignedIntegerConcept<size_type> >(); | 
|---|
| 168 |       function_requires<RandomAccessContainerConcept<string_type> >(); | 
|---|
| 169 |       function_requires<DefaultConstructibleConcept<locale_type> >(); | 
|---|
| 170 |       function_requires<CopyConstructibleConcept<locale_type> >(); | 
|---|
| 171 |       function_requires<AssignableConcept<locale_type> >(); | 
|---|
| 172 |       function_requires<BitmaskConcept<char_class_type> >(); | 
|---|
| 173 |  | 
|---|
| 174 |       size_type n = traits::length(m_pointer); | 
|---|
| 175 |       ignore_unused_variable_warning(n); | 
|---|
| 176 |  | 
|---|
| 177 |       char_type c = m_ctraits.translate(m_char); | 
|---|
| 178 |       ignore_unused_variable_warning(c); | 
|---|
| 179 |       c = m_ctraits.translate_nocase(m_char); | 
|---|
| 180 |        | 
|---|
| 181 |       //string_type::foobar bar; | 
|---|
| 182 |       string_type s1 = m_ctraits.transform(m_pointer, m_pointer); | 
|---|
| 183 |       ignore_unused_variable_warning(s1); | 
|---|
| 184 |  | 
|---|
| 185 |       string_type s2 = m_ctraits.transform_primary(m_pointer, m_pointer); | 
|---|
| 186 |       ignore_unused_variable_warning(s2); | 
|---|
| 187 |  | 
|---|
| 188 |       char_class_type cc = m_ctraits.lookup_classname(m_pointer, m_pointer); | 
|---|
| 189 |       ignore_unused_variable_warning(cc); | 
|---|
| 190 |  | 
|---|
| 191 |       string_type s3 = m_ctraits.lookup_collatename(m_pointer, m_pointer); | 
|---|
| 192 |       ignore_unused_variable_warning(s3); | 
|---|
| 193 |  | 
|---|
| 194 |       bool b = m_ctraits.isctype(m_char, cc); | 
|---|
| 195 |       ignore_unused_variable_warning(b); | 
|---|
| 196 |  | 
|---|
| 197 |       int v = m_ctraits.value(m_char, 16); | 
|---|
| 198 |       ignore_unused_variable_warning(v); | 
|---|
| 199 |  | 
|---|
| 200 |       locale_type l(m_ctraits.getloc()); | 
|---|
| 201 |       m_traits.imbue(l); | 
|---|
| 202 |       ignore_unused_variable_warning(l); | 
|---|
| 203 |    } | 
|---|
| 204 |    traits m_traits; | 
|---|
| 205 |    const traits m_ctraits; | 
|---|
| 206 |    const char_type* m_pointer; | 
|---|
| 207 |    char_type m_char; | 
|---|
| 208 | }; | 
|---|
| 209 |  | 
|---|
| 210 | // | 
|---|
| 211 | // helper class to compute what traits class a regular expression type is using: | 
|---|
| 212 | // | 
|---|
| 213 | template <class Regex> | 
|---|
| 214 | struct regex_traits_computer; | 
|---|
| 215 |  | 
|---|
| 216 | template <class charT, class traits> | 
|---|
| 217 | struct regex_traits_computer< global_regex_namespace::basic_regex<charT, traits> > | 
|---|
| 218 | { | 
|---|
| 219 |    typedef traits type; | 
|---|
| 220 | }; | 
|---|
| 221 |  | 
|---|
| 222 | // | 
|---|
| 223 | // BaseRegexConcept does not test anything dependent on basic_string, | 
|---|
| 224 | // in case our charT does not have an associated char_traits: | 
|---|
| 225 | // | 
|---|
| 226 | template <class Regex> | 
|---|
| 227 | struct BaseRegexConcept | 
|---|
| 228 | { | 
|---|
| 229 |    typedef typename Regex::value_type value_type; | 
|---|
| 230 |    typedef typename Regex::size_type size_type; | 
|---|
| 231 |    typedef typename Regex::flag_type flag_type; | 
|---|
| 232 |    typedef typename Regex::locale_type locale_type; | 
|---|
| 233 |    typedef input_iterator_archetype<value_type> input_iterator_type; | 
|---|
| 234 |  | 
|---|
| 235 |    // derived test types: | 
|---|
| 236 |    typedef const value_type* pointer_type; | 
|---|
| 237 |    typedef bidirectional_iterator_archetype<value_type> BidiIterator; | 
|---|
| 238 |    typedef global_regex_namespace::sub_match<BidiIterator> sub_match_type; | 
|---|
| 239 |    typedef global_regex_namespace::match_results<BidiIterator> match_results_type; | 
|---|
| 240 |    typedef output_iterator_archetype<value_type> OutIterator; | 
|---|
| 241 |    typedef typename regex_traits_computer<Regex>::type traits_type; | 
|---|
| 242 |    typedef global_regex_namespace::regex_iterator<BidiIterator, value_type, traits_type> regex_iterator_type; | 
|---|
| 243 |    typedef global_regex_namespace::regex_token_iterator<BidiIterator, value_type, traits_type> regex_token_iterator_type; | 
|---|
| 244 |  | 
|---|
| 245 |    void global_constraints() | 
|---|
| 246 |    { | 
|---|
| 247 |       // | 
|---|
| 248 |       // test non-template components: | 
|---|
| 249 |       // | 
|---|
| 250 |       function_requires<BitmaskConcept<global_regex_namespace::regex_constants::syntax_option_type> >(); | 
|---|
| 251 |       global_regex_namespace::regex_constants::syntax_option_type opts | 
|---|
| 252 |          = global_regex_namespace::regex_constants::icase | 
|---|
| 253 |          | global_regex_namespace::regex_constants::nosubs | 
|---|
| 254 |          | global_regex_namespace::regex_constants::optimize | 
|---|
| 255 |          | global_regex_namespace::regex_constants::collate | 
|---|
| 256 |          | global_regex_namespace::regex_constants::ECMAScript | 
|---|
| 257 |          | global_regex_namespace::regex_constants::basic | 
|---|
| 258 |          | global_regex_namespace::regex_constants::extended | 
|---|
| 259 |          | global_regex_namespace::regex_constants::awk | 
|---|
| 260 |          | global_regex_namespace::regex_constants::grep | 
|---|
| 261 |          | global_regex_namespace::regex_constants::egrep; | 
|---|
| 262 |       ignore_unused_variable_warning(opts); | 
|---|
| 263 |  | 
|---|
| 264 |       function_requires<BitmaskConcept<global_regex_namespace::regex_constants::match_flag_type> >(); | 
|---|
| 265 |       global_regex_namespace::regex_constants::match_flag_type mopts | 
|---|
| 266 |          = global_regex_namespace::regex_constants::match_default | 
|---|
| 267 |          | global_regex_namespace::regex_constants::match_not_bol | 
|---|
| 268 |          | global_regex_namespace::regex_constants::match_not_eol | 
|---|
| 269 |          | global_regex_namespace::regex_constants::match_not_bow | 
|---|
| 270 |          | global_regex_namespace::regex_constants::match_not_eow | 
|---|
| 271 |          | global_regex_namespace::regex_constants::match_any | 
|---|
| 272 |          | global_regex_namespace::regex_constants::match_not_null | 
|---|
| 273 |          | global_regex_namespace::regex_constants::match_continuous | 
|---|
| 274 |          | global_regex_namespace::regex_constants::match_prev_avail | 
|---|
| 275 |          | global_regex_namespace::regex_constants::format_default | 
|---|
| 276 |          | global_regex_namespace::regex_constants::format_sed | 
|---|
| 277 |          | global_regex_namespace::regex_constants::format_no_copy | 
|---|
| 278 |          | global_regex_namespace::regex_constants::format_first_only; | 
|---|
| 279 |       ignore_unused_variable_warning(mopts); | 
|---|
| 280 |  | 
|---|
| 281 |       BOOST_STATIC_ASSERT((::boost::is_enum<global_regex_namespace::regex_constants::error_type>::value)); | 
|---|
| 282 |       global_regex_namespace::regex_constants::error_type e1 = global_regex_namespace::regex_constants::error_collate; | 
|---|
| 283 |       ignore_unused_variable_warning(e1); | 
|---|
| 284 |       e1 = global_regex_namespace::regex_constants::error_ctype; | 
|---|
| 285 |       ignore_unused_variable_warning(e1); | 
|---|
| 286 |       e1 = global_regex_namespace::regex_constants::error_escape; | 
|---|
| 287 |       ignore_unused_variable_warning(e1); | 
|---|
| 288 |       e1 = global_regex_namespace::regex_constants::error_backref; | 
|---|
| 289 |       ignore_unused_variable_warning(e1); | 
|---|
| 290 |       e1 = global_regex_namespace::regex_constants::error_brack; | 
|---|
| 291 |       ignore_unused_variable_warning(e1); | 
|---|
| 292 |       e1 = global_regex_namespace::regex_constants::error_paren; | 
|---|
| 293 |       ignore_unused_variable_warning(e1); | 
|---|
| 294 |       e1 = global_regex_namespace::regex_constants::error_brace; | 
|---|
| 295 |       ignore_unused_variable_warning(e1); | 
|---|
| 296 |       e1 = global_regex_namespace::regex_constants::error_badbrace; | 
|---|
| 297 |       ignore_unused_variable_warning(e1); | 
|---|
| 298 |       e1 = global_regex_namespace::regex_constants::error_range; | 
|---|
| 299 |       ignore_unused_variable_warning(e1); | 
|---|
| 300 |       e1 = global_regex_namespace::regex_constants::error_space; | 
|---|
| 301 |       ignore_unused_variable_warning(e1); | 
|---|
| 302 |       e1 = global_regex_namespace::regex_constants::error_badrepeat; | 
|---|
| 303 |       ignore_unused_variable_warning(e1); | 
|---|
| 304 |       e1 = global_regex_namespace::regex_constants::error_complexity; | 
|---|
| 305 |       ignore_unused_variable_warning(e1); | 
|---|
| 306 |       e1 = global_regex_namespace::regex_constants::error_stack; | 
|---|
| 307 |       ignore_unused_variable_warning(e1); | 
|---|
| 308 |  | 
|---|
| 309 |       BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::runtime_error, global_regex_namespace::regex_error>::value  )); | 
|---|
| 310 |       const global_regex_namespace::regex_error except(e1); | 
|---|
| 311 |       e1 = except.code(); | 
|---|
| 312 |  | 
|---|
| 313 |       typedef typename Regex::value_type value_type; | 
|---|
| 314 |       function_requires< RegexTraitsConcept<global_regex_namespace::regex_traits<char> > >(); | 
|---|
| 315 |       function_requires< BaseRegexConcept<global_regex_namespace::basic_regex<char> > >(); | 
|---|
| 316 |    } | 
|---|
| 317 |    void constraints()  | 
|---|
| 318 |    { | 
|---|
| 319 |       global_constraints(); | 
|---|
| 320 |  | 
|---|
| 321 |       BOOST_STATIC_ASSERT((::boost::is_same< flag_type, global_regex_namespace::regex_constants::syntax_option_type>::value)); | 
|---|
| 322 |       flag_type opts | 
|---|
| 323 |          = Regex::icase | 
|---|
| 324 |          | Regex::nosubs | 
|---|
| 325 |          | Regex::optimize | 
|---|
| 326 |          | Regex::collate | 
|---|
| 327 |          | Regex::ECMAScript | 
|---|
| 328 |          | Regex::basic | 
|---|
| 329 |          | Regex::extended | 
|---|
| 330 |          | Regex::awk | 
|---|
| 331 |          | Regex::grep | 
|---|
| 332 |          | Regex::egrep; | 
|---|
| 333 |       ignore_unused_variable_warning(opts); | 
|---|
| 334 |  | 
|---|
| 335 |       function_requires<DefaultConstructibleConcept<Regex> >(); | 
|---|
| 336 |       function_requires<CopyConstructibleConcept<Regex> >(); | 
|---|
| 337 |  | 
|---|
| 338 |       // Regex constructors: | 
|---|
| 339 |       Regex e1(m_pointer); | 
|---|
| 340 |       ignore_unused_variable_warning(e1); | 
|---|
| 341 |       Regex e2(m_pointer, m_flags); | 
|---|
| 342 |       ignore_unused_variable_warning(e2); | 
|---|
| 343 |       Regex e3(m_pointer, m_size, m_flags); | 
|---|
| 344 |       ignore_unused_variable_warning(e3); | 
|---|
| 345 |       Regex e4(in1, in2); | 
|---|
| 346 |       ignore_unused_variable_warning(e4); | 
|---|
| 347 |       Regex e5(in1, in2, m_flags); | 
|---|
| 348 |       ignore_unused_variable_warning(e5); | 
|---|
| 349 |  | 
|---|
| 350 |       // assign etc: | 
|---|
| 351 |       Regex e; | 
|---|
| 352 |       e = m_pointer; | 
|---|
| 353 |       e = e1; | 
|---|
| 354 |       e.assign(e1); | 
|---|
| 355 |       e.assign(m_pointer); | 
|---|
| 356 |       e.assign(m_pointer, m_flags); | 
|---|
| 357 |       e.assign(m_pointer, m_size, m_flags); | 
|---|
| 358 |       e.assign(in1, in2); | 
|---|
| 359 |       e.assign(in1, in2, m_flags); | 
|---|
| 360 |  | 
|---|
| 361 |       // access: | 
|---|
| 362 |       const Regex ce; | 
|---|
| 363 |       bool b = ce.empty(); | 
|---|
| 364 |       ignore_unused_variable_warning(b); | 
|---|
| 365 |       size_type i = ce.mark_count(); | 
|---|
| 366 |       ignore_unused_variable_warning(i); | 
|---|
| 367 |       m_flags = ce.flags(); | 
|---|
| 368 |       e.imbue(ce.getloc()); | 
|---|
| 369 |       e.swap(e1); | 
|---|
| 370 |        | 
|---|
| 371 |       global_regex_namespace::swap(e, e1); | 
|---|
| 372 |  | 
|---|
| 373 |       // sub_match: | 
|---|
| 374 |       BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::pair<BidiIterator, BidiIterator>, sub_match_type>::value)); | 
|---|
| 375 |       typedef typename sub_match_type::value_type sub_value_type; | 
|---|
| 376 |       typedef typename sub_match_type::difference_type sub_diff_type; | 
|---|
| 377 |       typedef typename sub_match_type::iterator sub_iter_type; | 
|---|
| 378 |       BOOST_STATIC_ASSERT((::boost::is_same<sub_value_type, value_type>::value)); | 
|---|
| 379 |       BOOST_STATIC_ASSERT((::boost::is_same<sub_iter_type, BidiIterator>::value)); | 
|---|
| 380 |       b = m_sub.matched; | 
|---|
| 381 |       ignore_unused_variable_warning(b); | 
|---|
| 382 |       BidiIterator bi = m_sub.first; | 
|---|
| 383 |       ignore_unused_variable_warning(bi); | 
|---|
| 384 |       bi = m_sub.second; | 
|---|
| 385 |       ignore_unused_variable_warning(bi); | 
|---|
| 386 |       sub_diff_type diff = m_sub.length(); | 
|---|
| 387 |       ignore_unused_variable_warning(diff); | 
|---|
| 388 |       // match_results tests: | 
|---|
| 389 |       typedef typename match_results_type::value_type mr_value_type; | 
|---|
| 390 |       typedef typename match_results_type::const_reference mr_const_reference; | 
|---|
| 391 |       typedef typename match_results_type::reference mr_reference; | 
|---|
| 392 |       typedef typename match_results_type::const_iterator mr_const_iterator; | 
|---|
| 393 |       typedef typename match_results_type::iterator mr_iterator; | 
|---|
| 394 |       typedef typename match_results_type::difference_type mr_difference_type; | 
|---|
| 395 |       typedef typename match_results_type::size_type mr_size_type; | 
|---|
| 396 |       typedef typename match_results_type::allocator_type mr_allocator_type; | 
|---|
| 397 |       typedef typename match_results_type::char_type mr_char_type; | 
|---|
| 398 |       typedef typename match_results_type::string_type mr_string_type; | 
|---|
| 399 |  | 
|---|
| 400 |       match_results_type m1; | 
|---|
| 401 |       mr_allocator_type at; | 
|---|
| 402 |       match_results_type m2(at); | 
|---|
| 403 |       match_results_type m3(m1); | 
|---|
| 404 |       m1 = m2; | 
|---|
| 405 |  | 
|---|
| 406 |       mr_size_type mrs = m_cresults.size(); | 
|---|
| 407 |       ignore_unused_variable_warning(mrs); | 
|---|
| 408 |       mrs = m_cresults.max_size(); | 
|---|
| 409 |       ignore_unused_variable_warning(mrs); | 
|---|
| 410 |       b = m_cresults.empty(); | 
|---|
| 411 |       ignore_unused_variable_warning(b); | 
|---|
| 412 |       mr_difference_type mrd = m_cresults.length(); | 
|---|
| 413 |       ignore_unused_variable_warning(mrd); | 
|---|
| 414 |       mrd = m_cresults.length(mrs); | 
|---|
| 415 |       ignore_unused_variable_warning(mrd); | 
|---|
| 416 |       mrd = m_cresults.position(); | 
|---|
| 417 |       ignore_unused_variable_warning(mrd); | 
|---|
| 418 |       mrd = m_cresults.position(mrs); | 
|---|
| 419 |       ignore_unused_variable_warning(mrd); | 
|---|
| 420 |  | 
|---|
| 421 |       mr_const_reference mrcr = m_cresults[m_size]; | 
|---|
| 422 |       ignore_unused_variable_warning(mrcr); | 
|---|
| 423 |       mr_const_reference mrcr2 = m_cresults.prefix(); | 
|---|
| 424 |       ignore_unused_variable_warning(mrcr2); | 
|---|
| 425 |       mr_const_reference mrcr3 = m_cresults.suffix(); | 
|---|
| 426 |       ignore_unused_variable_warning(mrcr3); | 
|---|
| 427 |       mr_const_iterator mrci = m_cresults.begin(); | 
|---|
| 428 |       ignore_unused_variable_warning(mrci); | 
|---|
| 429 |       mrci = m_cresults.end(); | 
|---|
| 430 |       ignore_unused_variable_warning(mrci); | 
|---|
| 431 |  | 
|---|
| 432 |       mr_allocator_type at2 = m_cresults.get_allocator(); | 
|---|
| 433 |       m_results.swap(m_results); | 
|---|
| 434 |       global_regex_namespace::swap(m_results, m_results); | 
|---|
| 435 |  | 
|---|
| 436 |       // regex_match: | 
|---|
| 437 |       b = global_regex_namespace::regex_match(m_in, m_in, m_results, e); | 
|---|
| 438 |       ignore_unused_variable_warning(b); | 
|---|
| 439 |       b = global_regex_namespace::regex_match(m_in, m_in, m_results, e, m_mft); | 
|---|
| 440 |       ignore_unused_variable_warning(b); | 
|---|
| 441 |       b = global_regex_namespace::regex_match(m_in, m_in, e); | 
|---|
| 442 |       ignore_unused_variable_warning(b); | 
|---|
| 443 |       b = global_regex_namespace::regex_match(m_in, m_in, e, m_mft); | 
|---|
| 444 |       ignore_unused_variable_warning(b); | 
|---|
| 445 |       b = global_regex_namespace::regex_match(m_pointer, m_pmatch, e); | 
|---|
| 446 |       ignore_unused_variable_warning(b); | 
|---|
| 447 |       b = global_regex_namespace::regex_match(m_pointer, m_pmatch, e, m_mft); | 
|---|
| 448 |       ignore_unused_variable_warning(b); | 
|---|
| 449 |       b = global_regex_namespace::regex_match(m_pointer, e); | 
|---|
| 450 |       ignore_unused_variable_warning(b); | 
|---|
| 451 |       b = global_regex_namespace::regex_match(m_pointer, e, m_mft); | 
|---|
| 452 |       ignore_unused_variable_warning(b); | 
|---|
| 453 |       // regex_search: | 
|---|
| 454 |       b = global_regex_namespace::regex_search(m_in, m_in, m_results, e); | 
|---|
| 455 |       ignore_unused_variable_warning(b); | 
|---|
| 456 |       b = global_regex_namespace::regex_search(m_in, m_in, m_results, e, m_mft); | 
|---|
| 457 |       ignore_unused_variable_warning(b); | 
|---|
| 458 |       b = global_regex_namespace::regex_search(m_in, m_in, e); | 
|---|
| 459 |       ignore_unused_variable_warning(b); | 
|---|
| 460 |       b = global_regex_namespace::regex_search(m_in, m_in, e, m_mft); | 
|---|
| 461 |       ignore_unused_variable_warning(b); | 
|---|
| 462 |       b = global_regex_namespace::regex_search(m_pointer, m_pmatch, e); | 
|---|
| 463 |       ignore_unused_variable_warning(b); | 
|---|
| 464 |       b = global_regex_namespace::regex_search(m_pointer, m_pmatch, e, m_mft); | 
|---|
| 465 |       ignore_unused_variable_warning(b); | 
|---|
| 466 |       b = global_regex_namespace::regex_search(m_pointer, e); | 
|---|
| 467 |       ignore_unused_variable_warning(b); | 
|---|
| 468 |       b = global_regex_namespace::regex_search(m_pointer, e, m_mft); | 
|---|
| 469 |       ignore_unused_variable_warning(b); | 
|---|
| 470 |  | 
|---|
| 471 |       // regex_iterator: | 
|---|
| 472 |       typedef typename regex_iterator_type::regex_type rit_regex_type; | 
|---|
| 473 |       typedef typename regex_iterator_type::value_type rit_value_type; | 
|---|
| 474 |       typedef typename regex_iterator_type::difference_type rit_difference_type; | 
|---|
| 475 |       typedef typename regex_iterator_type::pointer rit_pointer; | 
|---|
| 476 |       typedef typename regex_iterator_type::reference rit_reference; | 
|---|
| 477 |       typedef typename regex_iterator_type::iterator_category rit_iterator_category; | 
|---|
| 478 |       BOOST_STATIC_ASSERT((::boost::is_same<rit_regex_type, Regex>::value)); | 
|---|
| 479 |       BOOST_STATIC_ASSERT((::boost::is_same<rit_value_type, match_results_type>::value)); | 
|---|
| 480 |       BOOST_STATIC_ASSERT((::boost::is_same<rit_difference_type, std::ptrdiff_t>::value)); | 
|---|
| 481 |       BOOST_STATIC_ASSERT((::boost::is_same<rit_pointer, const match_results_type*>::value)); | 
|---|
| 482 |       BOOST_STATIC_ASSERT((::boost::is_same<rit_reference, const match_results_type&>::value)); | 
|---|
| 483 |       BOOST_STATIC_ASSERT((::boost::is_convertible<rit_iterator_category*, std::forward_iterator_tag*>::value)); | 
|---|
| 484 |       // this takes care of most of the checks needed: | 
|---|
| 485 |       function_requires<ForwardIteratorConcept<regex_iterator_type> >(); | 
|---|
| 486 |       regex_iterator_type iter1(m_in, m_in, e); | 
|---|
| 487 |       ignore_unused_variable_warning(iter1); | 
|---|
| 488 |       regex_iterator_type iter2(m_in, m_in, e, m_mft); | 
|---|
| 489 |       ignore_unused_variable_warning(iter2); | 
|---|
| 490 |  | 
|---|
| 491 |       // regex_token_iterator: | 
|---|
| 492 |       typedef typename regex_token_iterator_type::regex_type rtit_regex_type; | 
|---|
| 493 |       typedef typename regex_token_iterator_type::value_type rtit_value_type; | 
|---|
| 494 |       typedef typename regex_token_iterator_type::difference_type rtit_difference_type; | 
|---|
| 495 |       typedef typename regex_token_iterator_type::pointer rtit_pointer; | 
|---|
| 496 |       typedef typename regex_token_iterator_type::reference rtit_reference; | 
|---|
| 497 |       typedef typename regex_token_iterator_type::iterator_category rtit_iterator_category; | 
|---|
| 498 |       BOOST_STATIC_ASSERT((::boost::is_same<rtit_regex_type, Regex>::value)); | 
|---|
| 499 |       BOOST_STATIC_ASSERT((::boost::is_same<rtit_value_type, sub_match_type>::value)); | 
|---|
| 500 |       BOOST_STATIC_ASSERT((::boost::is_same<rtit_difference_type, std::ptrdiff_t>::value)); | 
|---|
| 501 |       BOOST_STATIC_ASSERT((::boost::is_same<rtit_pointer, const sub_match_type*>::value)); | 
|---|
| 502 |       BOOST_STATIC_ASSERT((::boost::is_same<rtit_reference, const sub_match_type&>::value)); | 
|---|
| 503 |       BOOST_STATIC_ASSERT((::boost::is_convertible<rtit_iterator_category*, std::forward_iterator_tag*>::value)); | 
|---|
| 504 |       // this takes care of most of the checks needed: | 
|---|
| 505 |       function_requires<ForwardIteratorConcept<regex_token_iterator_type> >(); | 
|---|
| 506 |       regex_token_iterator_type ti1(m_in, m_in, e); | 
|---|
| 507 |       ignore_unused_variable_warning(ti1); | 
|---|
| 508 |       regex_token_iterator_type ti2(m_in, m_in, e, 0); | 
|---|
| 509 |       ignore_unused_variable_warning(ti2); | 
|---|
| 510 |       regex_token_iterator_type ti3(m_in, m_in, e, 0, m_mft); | 
|---|
| 511 |       ignore_unused_variable_warning(ti3); | 
|---|
| 512 |       std::vector<int> subs; | 
|---|
| 513 |       regex_token_iterator_type ti4(m_in, m_in, e, subs); | 
|---|
| 514 |       ignore_unused_variable_warning(ti4); | 
|---|
| 515 |       regex_token_iterator_type ti5(m_in, m_in, e, subs, m_mft); | 
|---|
| 516 |       ignore_unused_variable_warning(ti5); | 
|---|
| 517 |       static const int i_array[3] = { 1, 2, 3, }; | 
|---|
| 518 |       regex_token_iterator_type ti6(m_in, m_in, e, i_array); | 
|---|
| 519 |       ignore_unused_variable_warning(ti6); | 
|---|
| 520 |       regex_token_iterator_type ti7(m_in, m_in, e, i_array, m_mft); | 
|---|
| 521 |       ignore_unused_variable_warning(ti7); | 
|---|
| 522 |    } | 
|---|
| 523 |  | 
|---|
| 524 |    pointer_type m_pointer; | 
|---|
| 525 |    flag_type m_flags; | 
|---|
| 526 |    size_type m_size; | 
|---|
| 527 |    input_iterator_type in1, in2; | 
|---|
| 528 |    const sub_match_type m_sub; | 
|---|
| 529 |    const value_type m_char; | 
|---|
| 530 |    match_results_type m_results; | 
|---|
| 531 |    const match_results_type m_cresults; | 
|---|
| 532 |    OutIterator m_out; | 
|---|
| 533 |    BidiIterator m_in; | 
|---|
| 534 |    global_regex_namespace::regex_constants::match_flag_type m_mft; | 
|---|
| 535 |    global_regex_namespace::match_results<pointer_type> m_pmatch; | 
|---|
| 536 |  | 
|---|
| 537 |    BaseRegexConcept(); | 
|---|
| 538 |    BaseRegexConcept(const BaseRegexConcept&); | 
|---|
| 539 |    BaseRegexConcept& operator=(const BaseRegexConcept&); | 
|---|
| 540 | }; | 
|---|
| 541 |  | 
|---|
| 542 | // | 
|---|
| 543 | // RegexConcept: | 
|---|
| 544 | // Test every interface in the std: | 
|---|
| 545 | // | 
|---|
| 546 | template <class Regex> | 
|---|
| 547 | struct RegexConcept | 
|---|
| 548 | { | 
|---|
| 549 |    typedef typename Regex::value_type value_type; | 
|---|
| 550 |    typedef typename Regex::size_type size_type; | 
|---|
| 551 |    typedef typename Regex::flag_type flag_type; | 
|---|
| 552 |    typedef typename Regex::locale_type locale_type; | 
|---|
| 553 |  | 
|---|
| 554 |    // derived test types: | 
|---|
| 555 |    typedef const value_type* pointer_type; | 
|---|
| 556 |    typedef std::basic_string<value_type> string_type; | 
|---|
| 557 |    typedef boost::bidirectional_iterator_archetype<value_type> BidiIterator; | 
|---|
| 558 |    typedef global_regex_namespace::sub_match<BidiIterator> sub_match_type; | 
|---|
| 559 |    typedef global_regex_namespace::match_results<BidiIterator> match_results_type; | 
|---|
| 560 |    typedef output_iterator_archetype<value_type> OutIterator; | 
|---|
| 561 |  | 
|---|
| 562 |  | 
|---|
| 563 |    void constraints()  | 
|---|
| 564 |    { | 
|---|
| 565 |       function_requires<BaseRegexConcept<Regex> >(); | 
|---|
| 566 |       // string based construct: | 
|---|
| 567 |       Regex e1(m_string); | 
|---|
| 568 |       ignore_unused_variable_warning(e1); | 
|---|
| 569 |       Regex e2(m_string, m_flags); | 
|---|
| 570 |       ignore_unused_variable_warning(e2); | 
|---|
| 571 |  | 
|---|
| 572 |       // assign etc: | 
|---|
| 573 |       Regex e; | 
|---|
| 574 |       e = m_string; | 
|---|
| 575 |       e.assign(m_string); | 
|---|
| 576 |       e.assign(m_string, m_flags); | 
|---|
| 577 |  | 
|---|
| 578 |       // sub_match: | 
|---|
| 579 |       string_type s(m_sub); | 
|---|
| 580 |       ignore_unused_variable_warning(s); | 
|---|
| 581 |       s = m_sub.str(); | 
|---|
| 582 |       ignore_unused_variable_warning(s); | 
|---|
| 583 |       int i = m_sub.compare(m_string); | 
|---|
| 584 |       ignore_unused_variable_warning(i); | 
|---|
| 585 |  | 
|---|
| 586 |       int i2 = m_sub.compare(m_sub); | 
|---|
| 587 |       ignore_unused_variable_warning(i2); | 
|---|
| 588 |       i2 = m_sub.compare(m_pointer); | 
|---|
| 589 |       ignore_unused_variable_warning(i2); | 
|---|
| 590 |  | 
|---|
| 591 |       bool b = m_sub == m_sub; | 
|---|
| 592 |       ignore_unused_variable_warning(b); | 
|---|
| 593 |       b = m_sub != m_sub; | 
|---|
| 594 |       ignore_unused_variable_warning(b); | 
|---|
| 595 |       b = m_sub <= m_sub; | 
|---|
| 596 |       ignore_unused_variable_warning(b); | 
|---|
| 597 |       b = m_sub <= m_sub; | 
|---|
| 598 |       ignore_unused_variable_warning(b); | 
|---|
| 599 |       b = m_sub > m_sub; | 
|---|
| 600 |       ignore_unused_variable_warning(b); | 
|---|
| 601 |       b = m_sub >= m_sub; | 
|---|
| 602 |       ignore_unused_variable_warning(b); | 
|---|
| 603 |  | 
|---|
| 604 |       b = m_sub == m_pointer; | 
|---|
| 605 |       ignore_unused_variable_warning(b); | 
|---|
| 606 |       b = m_sub != m_pointer; | 
|---|
| 607 |       ignore_unused_variable_warning(b); | 
|---|
| 608 |       b = m_sub <= m_pointer; | 
|---|
| 609 |       ignore_unused_variable_warning(b); | 
|---|
| 610 |       b = m_sub <= m_pointer; | 
|---|
| 611 |       ignore_unused_variable_warning(b); | 
|---|
| 612 |       b = m_sub > m_pointer; | 
|---|
| 613 |       ignore_unused_variable_warning(b); | 
|---|
| 614 |       b = m_sub >= m_pointer; | 
|---|
| 615 |       ignore_unused_variable_warning(b); | 
|---|
| 616 |  | 
|---|
| 617 |       b = m_pointer == m_sub; | 
|---|
| 618 |       ignore_unused_variable_warning(b); | 
|---|
| 619 |       b = m_pointer != m_sub; | 
|---|
| 620 |       ignore_unused_variable_warning(b); | 
|---|
| 621 |       b = m_pointer <= m_sub; | 
|---|
| 622 |       ignore_unused_variable_warning(b); | 
|---|
| 623 |       b = m_pointer <= m_sub; | 
|---|
| 624 |       ignore_unused_variable_warning(b); | 
|---|
| 625 |       b = m_pointer > m_sub; | 
|---|
| 626 |       ignore_unused_variable_warning(b); | 
|---|
| 627 |       b = m_pointer >= m_sub; | 
|---|
| 628 |       ignore_unused_variable_warning(b); | 
|---|
| 629 |  | 
|---|
| 630 |       b = m_sub == m_char; | 
|---|
| 631 |       ignore_unused_variable_warning(b); | 
|---|
| 632 |       b = m_sub != m_char; | 
|---|
| 633 |       ignore_unused_variable_warning(b); | 
|---|
| 634 |       b = m_sub <= m_char; | 
|---|
| 635 |       ignore_unused_variable_warning(b); | 
|---|
| 636 |       b = m_sub <= m_char; | 
|---|
| 637 |       ignore_unused_variable_warning(b); | 
|---|
| 638 |       b = m_sub > m_char; | 
|---|
| 639 |       ignore_unused_variable_warning(b); | 
|---|
| 640 |       b = m_sub >= m_char; | 
|---|
| 641 |       ignore_unused_variable_warning(b); | 
|---|
| 642 |  | 
|---|
| 643 |       b = m_char == m_sub; | 
|---|
| 644 |       ignore_unused_variable_warning(b); | 
|---|
| 645 |       b = m_char != m_sub; | 
|---|
| 646 |       ignore_unused_variable_warning(b); | 
|---|
| 647 |       b = m_char <= m_sub; | 
|---|
| 648 |       ignore_unused_variable_warning(b); | 
|---|
| 649 |       b = m_char <= m_sub; | 
|---|
| 650 |       ignore_unused_variable_warning(b); | 
|---|
| 651 |       b = m_char > m_sub; | 
|---|
| 652 |       ignore_unused_variable_warning(b); | 
|---|
| 653 |       b = m_char >= m_sub; | 
|---|
| 654 |       ignore_unused_variable_warning(b); | 
|---|
| 655 |  | 
|---|
| 656 |       b = m_sub == m_string; | 
|---|
| 657 |       ignore_unused_variable_warning(b); | 
|---|
| 658 |       b = m_sub != m_string; | 
|---|
| 659 |       ignore_unused_variable_warning(b); | 
|---|
| 660 |       b = m_sub <= m_string; | 
|---|
| 661 |       ignore_unused_variable_warning(b); | 
|---|
| 662 |       b = m_sub <= m_string; | 
|---|
| 663 |       ignore_unused_variable_warning(b); | 
|---|
| 664 |       b = m_sub > m_string; | 
|---|
| 665 |       ignore_unused_variable_warning(b); | 
|---|
| 666 |       b = m_sub >= m_string; | 
|---|
| 667 |       ignore_unused_variable_warning(b); | 
|---|
| 668 |  | 
|---|
| 669 |       b = m_string == m_sub; | 
|---|
| 670 |       ignore_unused_variable_warning(b); | 
|---|
| 671 |       b = m_string != m_sub; | 
|---|
| 672 |       ignore_unused_variable_warning(b); | 
|---|
| 673 |       b = m_string <= m_sub; | 
|---|
| 674 |       ignore_unused_variable_warning(b); | 
|---|
| 675 |       b = m_string <= m_sub; | 
|---|
| 676 |       ignore_unused_variable_warning(b); | 
|---|
| 677 |       b = m_string > m_sub; | 
|---|
| 678 |       ignore_unused_variable_warning(b); | 
|---|
| 679 |       b = m_string >= m_sub; | 
|---|
| 680 |       ignore_unused_variable_warning(b); | 
|---|
| 681 |  | 
|---|
| 682 |       // match results: | 
|---|
| 683 |       m_string = m_results.str(); | 
|---|
| 684 |       ignore_unused_variable_warning(m_string); | 
|---|
| 685 |       m_string = m_results.str(0); | 
|---|
| 686 |       ignore_unused_variable_warning(m_string); | 
|---|
| 687 |       m_out = m_cresults.format(m_out, m_string); | 
|---|
| 688 |       m_out = m_cresults.format(m_out, m_string, m_mft); | 
|---|
| 689 |       m_string = m_cresults.format(m_string); | 
|---|
| 690 |       ignore_unused_variable_warning(m_string); | 
|---|
| 691 |       m_string = m_cresults.format(m_string, m_mft); | 
|---|
| 692 |       ignore_unused_variable_warning(m_string); | 
|---|
| 693 |  | 
|---|
| 694 |       // regex_match: | 
|---|
| 695 |       b = global_regex_namespace::regex_match(m_string, m_smatch, e); | 
|---|
| 696 |       ignore_unused_variable_warning(b); | 
|---|
| 697 |       b = global_regex_namespace::regex_match(m_string, m_smatch, e, m_mft); | 
|---|
| 698 |       ignore_unused_variable_warning(b); | 
|---|
| 699 |       b = global_regex_namespace::regex_match(m_string, e); | 
|---|
| 700 |       ignore_unused_variable_warning(b); | 
|---|
| 701 |       b = global_regex_namespace::regex_match(m_string, e, m_mft); | 
|---|
| 702 |       ignore_unused_variable_warning(b); | 
|---|
| 703 |  | 
|---|
| 704 |       // regex_search: | 
|---|
| 705 |       b = global_regex_namespace::regex_search(m_string, m_smatch, e); | 
|---|
| 706 |       ignore_unused_variable_warning(b); | 
|---|
| 707 |       b = global_regex_namespace::regex_search(m_string, m_smatch, e, m_mft); | 
|---|
| 708 |       ignore_unused_variable_warning(b); | 
|---|
| 709 |       b = global_regex_namespace::regex_search(m_string, e); | 
|---|
| 710 |       ignore_unused_variable_warning(b); | 
|---|
| 711 |       b = global_regex_namespace::regex_search(m_string, e, m_mft); | 
|---|
| 712 |       ignore_unused_variable_warning(b); | 
|---|
| 713 |  | 
|---|
| 714 |       // regex_replace: | 
|---|
| 715 |       m_out = global_regex_namespace::regex_replace(m_out, m_in, m_in, e, m_string, m_mft); | 
|---|
| 716 |       m_out = global_regex_namespace::regex_replace(m_out, m_in, m_in, e, m_string); | 
|---|
| 717 |       m_string = global_regex_namespace::regex_replace(m_string, e, m_string, m_mft); | 
|---|
| 718 |       ignore_unused_variable_warning(m_string); | 
|---|
| 719 |       m_string = global_regex_namespace::regex_replace(m_string, e, m_string); | 
|---|
| 720 |       ignore_unused_variable_warning(m_string); | 
|---|
| 721 |  | 
|---|
| 722 |    } | 
|---|
| 723 |  | 
|---|
| 724 |    flag_type m_flags; | 
|---|
| 725 |    string_type m_string; | 
|---|
| 726 |    const sub_match_type m_sub; | 
|---|
| 727 |    match_results_type m_results; | 
|---|
| 728 |    pointer_type m_pointer; | 
|---|
| 729 |    value_type m_char; | 
|---|
| 730 |    const match_results_type m_cresults; | 
|---|
| 731 |    OutIterator m_out; | 
|---|
| 732 |    BidiIterator m_in; | 
|---|
| 733 |    global_regex_namespace::regex_constants::match_flag_type m_mft; | 
|---|
| 734 |    global_regex_namespace::match_results<typename string_type::const_iterator> m_smatch; | 
|---|
| 735 |  | 
|---|
| 736 |    RegexConcept(); | 
|---|
| 737 |    RegexConcept(const RegexConcept&); | 
|---|
| 738 |    RegexConcept& operator=(const RegexConcept&); | 
|---|
| 739 | }; | 
|---|
| 740 |  | 
|---|
| 741 | // | 
|---|
| 742 | // BoostRegexConcept: | 
|---|
| 743 | // Test every interface in the Boost implementation: | 
|---|
| 744 | // | 
|---|
| 745 | template <class Regex> | 
|---|
| 746 | struct BoostRegexConcept | 
|---|
| 747 | { | 
|---|
| 748 |    typedef typename Regex::value_type value_type; | 
|---|
| 749 |    typedef typename Regex::size_type size_type; | 
|---|
| 750 |    typedef typename Regex::flag_type flag_type; | 
|---|
| 751 |    typedef typename Regex::locale_type locale_type; | 
|---|
| 752 |  | 
|---|
| 753 |    // derived test types: | 
|---|
| 754 |    typedef const value_type* pointer_type; | 
|---|
| 755 |    typedef std::basic_string<value_type> string_type; | 
|---|
| 756 |    typedef typename Regex::const_iterator const_iterator; | 
|---|
| 757 |    typedef bidirectional_iterator_archetype<value_type> BidiIterator; | 
|---|
| 758 |    typedef global_regex_namespace::sub_match<BidiIterator> sub_match_type; | 
|---|
| 759 |    typedef global_regex_namespace::match_results<BidiIterator> match_results_type; | 
|---|
| 760 |  | 
|---|
| 761 |    void constraints()  | 
|---|
| 762 |    { | 
|---|
| 763 |       global_regex_namespace::regex_constants::match_flag_type mopts | 
|---|
| 764 |          = global_regex_namespace::regex_constants::match_default | 
|---|
| 765 |          | global_regex_namespace::regex_constants::match_not_bol | 
|---|
| 766 |          | global_regex_namespace::regex_constants::match_not_eol | 
|---|
| 767 |          | global_regex_namespace::regex_constants::match_not_bow | 
|---|
| 768 |          | global_regex_namespace::regex_constants::match_not_eow | 
|---|
| 769 |          | global_regex_namespace::regex_constants::match_any | 
|---|
| 770 |          | global_regex_namespace::regex_constants::match_not_null | 
|---|
| 771 |          | global_regex_namespace::regex_constants::match_continuous | 
|---|
| 772 |          | global_regex_namespace::regex_constants::match_partial | 
|---|
| 773 |          | global_regex_namespace::regex_constants::match_prev_avail | 
|---|
| 774 |          | global_regex_namespace::regex_constants::format_default | 
|---|
| 775 |          | global_regex_namespace::regex_constants::format_sed | 
|---|
| 776 |          | global_regex_namespace::regex_constants::format_perl | 
|---|
| 777 |          | global_regex_namespace::regex_constants::format_no_copy | 
|---|
| 778 |          | global_regex_namespace::regex_constants::format_first_only; | 
|---|
| 779 |  | 
|---|
| 780 |       function_requires<RegexConcept<Regex> >(); | 
|---|
| 781 |       const global_regex_namespace::regex_error except(global_regex_namespace::regex_constants::error_collate); | 
|---|
| 782 |       std::ptrdiff_t pt = except.position(); | 
|---|
| 783 |       ignore_unused_variable_warning(pt); | 
|---|
| 784 |       const Regex ce, ce2; | 
|---|
| 785 | #ifndef BOOST_NO_STD_LOCALE | 
|---|
| 786 |       m_stream << ce; | 
|---|
| 787 | #endif | 
|---|
| 788 |       unsigned i = ce.error_code(); | 
|---|
| 789 |       ignore_unused_variable_warning(i); | 
|---|
| 790 |       pointer_type p = ce.expression(); | 
|---|
| 791 |       ignore_unused_variable_warning(p); | 
|---|
| 792 |       int i2 = ce.compare(ce2); | 
|---|
| 793 |       ignore_unused_variable_warning(i2); | 
|---|
| 794 |       bool b = ce == ce2; | 
|---|
| 795 |       ignore_unused_variable_warning(b); | 
|---|
| 796 |       b = ce != ce2; | 
|---|
| 797 |       ignore_unused_variable_warning(b); | 
|---|
| 798 |       b = ce < ce2; | 
|---|
| 799 |       ignore_unused_variable_warning(b); | 
|---|
| 800 |       b = ce > ce2; | 
|---|
| 801 |       ignore_unused_variable_warning(b); | 
|---|
| 802 |       b = ce <= ce2; | 
|---|
| 803 |       ignore_unused_variable_warning(b); | 
|---|
| 804 |       b = ce >= ce2; | 
|---|
| 805 |       ignore_unused_variable_warning(b); | 
|---|
| 806 |       i = ce.status(); | 
|---|
| 807 |       ignore_unused_variable_warning(i); | 
|---|
| 808 |       size_type s = ce.max_size(); | 
|---|
| 809 |       ignore_unused_variable_warning(s); | 
|---|
| 810 |       s = ce.size(); | 
|---|
| 811 |       ignore_unused_variable_warning(s); | 
|---|
| 812 |       const_iterator pi = ce.begin(); | 
|---|
| 813 |       ignore_unused_variable_warning(pi); | 
|---|
| 814 |       pi = ce.end(); | 
|---|
| 815 |       ignore_unused_variable_warning(pi); | 
|---|
| 816 |       string_type s2 = ce.str(); | 
|---|
| 817 |       ignore_unused_variable_warning(s2); | 
|---|
| 818 |  | 
|---|
| 819 |       m_string = m_sub + m_sub; | 
|---|
| 820 |       ignore_unused_variable_warning(m_string); | 
|---|
| 821 |       m_string = m_sub + m_pointer; | 
|---|
| 822 |       ignore_unused_variable_warning(m_string); | 
|---|
| 823 |       m_string = m_pointer + m_sub; | 
|---|
| 824 |       ignore_unused_variable_warning(m_string); | 
|---|
| 825 |       m_string = m_sub + m_string; | 
|---|
| 826 |       ignore_unused_variable_warning(m_string); | 
|---|
| 827 |       m_string = m_string + m_sub; | 
|---|
| 828 |       ignore_unused_variable_warning(m_string); | 
|---|
| 829 |       m_string = m_sub + m_char; | 
|---|
| 830 |       ignore_unused_variable_warning(m_string); | 
|---|
| 831 |       m_string = m_char + m_sub; | 
|---|
| 832 |       ignore_unused_variable_warning(m_string); | 
|---|
| 833 |  | 
|---|
| 834 | #ifndef BOOST_NO_STD_LOCALE | 
|---|
| 835 |       m_stream << m_sub; | 
|---|
| 836 |       m_stream << m_cresults; | 
|---|
| 837 | #endif | 
|---|
| 838 |    } | 
|---|
| 839 |  | 
|---|
| 840 |    std::basic_ostream<value_type> m_stream; | 
|---|
| 841 |    sub_match_type m_sub; | 
|---|
| 842 |    pointer_type m_pointer; | 
|---|
| 843 |    string_type m_string; | 
|---|
| 844 |    const value_type m_char; | 
|---|
| 845 |    match_results_type m_results; | 
|---|
| 846 |    const match_results_type m_cresults; | 
|---|
| 847 |  | 
|---|
| 848 |    BoostRegexConcept(); | 
|---|
| 849 |    BoostRegexConcept(const BoostRegexConcept&); | 
|---|
| 850 |    BoostRegexConcept& operator=(const BoostRegexConcept&); | 
|---|
| 851 | }; | 
|---|
| 852 |  | 
|---|
| 853 | } | 
|---|
| 854 |  | 
|---|
| 855 | #endif | 
|---|