| /* |
| * |
| * Copyright (c) 2004 |
| * John Maddock |
| * |
| * Use, modification and distribution are subject to the |
| * Boost Software License, Version 1.0. (See accompanying file |
| * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| * |
| */ |
| |
| /* |
| * LOCATION: see http://www.boost.org for most recent version. |
| * FILE concepts.hpp |
| * VERSION see <boost/version.hpp> |
| * DESCRIPTION: Declares regular expression concepts. |
| */ |
| |
| #ifndef BOOST_REGEX_CONCEPTS_HPP_INCLUDED |
| #define BOOST_REGEX_CONCEPTS_HPP_INCLUDED |
| |
| #include <boost/concept_archetype.hpp> |
| #include <boost/concept_check.hpp> |
| #include <boost/type_traits/is_enum.hpp> |
| #include <boost/type_traits/is_base_and_derived.hpp> |
| #include <boost/static_assert.hpp> |
| #ifndef BOOST_TEST_TR1_REGEX |
| #include <boost/regex.hpp> |
| #endif |
| #include <bitset> |
| #include <vector> |
| #include <iostream> |
| |
| namespace boost{ |
| |
| // |
| // bitmask_archetype: |
| // this can be either an integer type, an enum, or a std::bitset, |
| // we use the latter as the architype as it offers the "strictest" |
| // of the possible interfaces: |
| // |
| typedef std::bitset<512> bitmask_archetype; |
| // |
| // char_architype: |
| // A strict model for the character type interface. |
| // |
| struct char_architype |
| { |
| // default constructable: |
| char_architype(); |
| // copy constructable / assignable: |
| char_architype(const char_architype&); |
| char_architype& operator=(const char_architype&); |
| // constructable from an integral value: |
| char_architype(unsigned long val); |
| // comparable: |
| bool operator==(const char_architype&)const; |
| bool operator!=(const char_architype&)const; |
| bool operator<(const char_architype&)const; |
| bool operator<=(const char_architype&)const; |
| bool operator>=(const char_architype&)const; |
| bool operator>(const char_architype&)const; |
| // conversion to integral type: |
| operator long()const; |
| }; |
| // |
| // char_architype can not be used with basic_string: |
| // |
| } // namespace boost |
| namespace std{ |
| template<> struct char_traits<boost::char_architype> |
| { |
| // The intent is that this template is not instantiated, |
| // but this typedef gives us a chance of compilation in |
| // case it is: |
| typedef boost::char_architype char_type; |
| }; |
| } |
| // |
| // Allocator architype: |
| // |
| template <class T> |
| class allocator_architype |
| { |
| public: |
| typedef T* pointer; |
| typedef const T* const_pointer; |
| typedef T& reference; |
| typedef const T& const_reference; |
| typedef T value_type; |
| typedef unsigned size_type; |
| typedef int difference_type; |
| |
| template <class U> |
| struct rebind |
| { |
| typedef allocator_architype<U> other; |
| }; |
| |
| pointer address(reference r); |
| const_pointer address(const_reference r); |
| pointer allocate(size_type); |
| pointer allocate(size_type, pointer); |
| void deallocate(pointer, size_type); |
| size_type max_size()const; |
| |
| allocator_architype(); |
| allocator_architype(const allocator_architype&); |
| |
| template <class Other> |
| allocator_architype(const allocator_architype<Other>&); |
| |
| void construct(pointer, const_reference); |
| void destroy(pointer); |
| }; |
| |
| template <class T> |
| bool operator == (const allocator_architype<T>&, const allocator_architype<T>&); |
| template <class T> |
| bool operator != (const allocator_architype<T>&, const allocator_architype<T>&); |
| |
| namespace boost{ |
| // |
| // regex_traits_architype: |
| // A strict interpretation of the regular expression traits class requirements. |
| // |
| template <class charT> |
| struct regex_traits_architype |
| { |
| public: |
| regex_traits_architype(); |
| typedef charT char_type; |
| // typedef std::size_t size_type; |
| typedef std::vector<char_type> string_type; |
| typedef copy_constructible_archetype<assignable_archetype<> > locale_type; |
| typedef bitmask_archetype char_class_type; |
| |
| static std::size_t length(const char_type* ) { return 0; } |
| |
| charT translate(charT ) const { return charT(); } |
| charT translate_nocase(charT ) const { return static_object<charT>::get(); } |
| |
| template <class ForwardIterator> |
| string_type transform(ForwardIterator , ForwardIterator ) const |
| { return static_object<string_type>::get(); } |
| template <class ForwardIterator> |
| string_type transform_primary(ForwardIterator , ForwardIterator ) const |
| { return static_object<string_type>::get(); } |
| |
| template <class ForwardIterator> |
| char_class_type lookup_classname(ForwardIterator , ForwardIterator ) const |
| { return static_object<char_class_type>::get(); } |
| template <class ForwardIterator> |
| string_type lookup_collatename(ForwardIterator , ForwardIterator ) const |
| { return static_object<string_type>::get(); } |
| |
| bool isctype(charT, char_class_type) const |
| { return false; } |
| int value(charT, int) const |
| { return 0; } |
| |
| locale_type imbue(locale_type l) |
| { return l; } |
| locale_type getloc()const |
| { return static_object<locale_type>::get(); } |
| |
| private: |
| // this type is not copyable: |
| regex_traits_architype(const regex_traits_architype&); |
| regex_traits_architype& operator=(const regex_traits_architype&); |
| }; |
| |
| // |
| // alter this to std::tr1, to test a std implementation: |
| // |
| #ifndef BOOST_TEST_TR1_REGEX |
| namespace global_regex_namespace = ::boost; |
| #else |
| namespace global_regex_namespace = ::std::tr1; |
| #endif |
| |
| template <class Bitmask> |
| struct BitmaskConcept |
| { |
| void constraints() |
| { |
| function_requires<CopyConstructibleConcept<Bitmask> >(); |
| function_requires<AssignableConcept<Bitmask> >(); |
| |
| m_mask1 = m_mask2 | m_mask3; |
| m_mask1 = m_mask2 & m_mask3; |
| m_mask1 = m_mask2 ^ m_mask3; |
| |
| m_mask1 = ~m_mask2; |
| |
| m_mask1 |= m_mask2; |
| m_mask1 &= m_mask2; |
| m_mask1 ^= m_mask2; |
| } |
| Bitmask m_mask1, m_mask2, m_mask3; |
| }; |
| |
| template <class traits> |
| struct RegexTraitsConcept |
| { |
| RegexTraitsConcept(); |
| // required typedefs: |
| typedef typename traits::char_type char_type; |
| // typedef typename traits::size_type size_type; |
| typedef typename traits::string_type string_type; |
| typedef typename traits::locale_type locale_type; |
| typedef typename traits::char_class_type char_class_type; |
| |
| void constraints() |
| { |
| //function_requires<UnsignedIntegerConcept<size_type> >(); |
| function_requires<RandomAccessContainerConcept<string_type> >(); |
| function_requires<DefaultConstructibleConcept<locale_type> >(); |
| function_requires<CopyConstructibleConcept<locale_type> >(); |
| function_requires<AssignableConcept<locale_type> >(); |
| function_requires<BitmaskConcept<char_class_type> >(); |
| |
| std::size_t n = traits::length(m_pointer); |
| ignore_unused_variable_warning(n); |
| |
| char_type c = m_ctraits.translate(m_char); |
| ignore_unused_variable_warning(c); |
| c = m_ctraits.translate_nocase(m_char); |
| |
| //string_type::foobar bar; |
| string_type s1 = m_ctraits.transform(m_pointer, m_pointer); |
| ignore_unused_variable_warning(s1); |
| |
| string_type s2 = m_ctraits.transform_primary(m_pointer, m_pointer); |
| ignore_unused_variable_warning(s2); |
| |
| char_class_type cc = m_ctraits.lookup_classname(m_pointer, m_pointer); |
| ignore_unused_variable_warning(cc); |
| |
| string_type s3 = m_ctraits.lookup_collatename(m_pointer, m_pointer); |
| ignore_unused_variable_warning(s3); |
| |
| bool b = m_ctraits.isctype(m_char, cc); |
| ignore_unused_variable_warning(b); |
| |
| int v = m_ctraits.value(m_char, 16); |
| ignore_unused_variable_warning(v); |
| |
| locale_type l(m_ctraits.getloc()); |
| m_traits.imbue(l); |
| ignore_unused_variable_warning(l); |
| } |
| traits m_traits; |
| const traits m_ctraits; |
| const char_type* m_pointer; |
| char_type m_char; |
| private: |
| RegexTraitsConcept& operator=(RegexTraitsConcept&); |
| }; |
| |
| // |
| // helper class to compute what traits class a regular expression type is using: |
| // |
| template <class Regex> |
| struct regex_traits_computer; |
| |
| template <class charT, class traits> |
| struct regex_traits_computer< global_regex_namespace::basic_regex<charT, traits> > |
| { |
| typedef traits type; |
| }; |
| |
| // |
| // BaseRegexConcept does not test anything dependent on basic_string, |
| // in case our charT does not have an associated char_traits: |
| // |
| template <class Regex> |
| struct BaseRegexConcept |
| { |
| typedef typename Regex::value_type value_type; |
| //typedef typename Regex::size_type size_type; |
| typedef typename Regex::flag_type flag_type; |
| typedef typename Regex::locale_type locale_type; |
| typedef input_iterator_archetype<value_type> input_iterator_type; |
| |
| // derived test types: |
| typedef const value_type* pointer_type; |
| typedef bidirectional_iterator_archetype<value_type> BidiIterator; |
| typedef global_regex_namespace::sub_match<BidiIterator> sub_match_type; |
| typedef global_regex_namespace::match_results<BidiIterator, allocator_architype<sub_match_type> > match_results_type; |
| typedef global_regex_namespace::match_results<BidiIterator> match_results_default_type; |
| typedef output_iterator_archetype<value_type> OutIterator; |
| typedef typename regex_traits_computer<Regex>::type traits_type; |
| typedef global_regex_namespace::regex_iterator<BidiIterator, value_type, traits_type> regex_iterator_type; |
| typedef global_regex_namespace::regex_token_iterator<BidiIterator, value_type, traits_type> regex_token_iterator_type; |
| |
| void global_constraints() |
| { |
| // |
| // test non-template components: |
| // |
| function_requires<BitmaskConcept<global_regex_namespace::regex_constants::syntax_option_type> >(); |
| global_regex_namespace::regex_constants::syntax_option_type opts |
| = global_regex_namespace::regex_constants::icase |
| | global_regex_namespace::regex_constants::nosubs |
| | global_regex_namespace::regex_constants::optimize |
| | global_regex_namespace::regex_constants::collate |
| | global_regex_namespace::regex_constants::ECMAScript |
| | global_regex_namespace::regex_constants::basic |
| | global_regex_namespace::regex_constants::extended |
| | global_regex_namespace::regex_constants::awk |
| | global_regex_namespace::regex_constants::grep |
| | global_regex_namespace::regex_constants::egrep; |
| ignore_unused_variable_warning(opts); |
| |
| function_requires<BitmaskConcept<global_regex_namespace::regex_constants::match_flag_type> >(); |
| global_regex_namespace::regex_constants::match_flag_type mopts |
| = global_regex_namespace::regex_constants::match_default |
| | global_regex_namespace::regex_constants::match_not_bol |
| | global_regex_namespace::regex_constants::match_not_eol |
| | global_regex_namespace::regex_constants::match_not_bow |
| | global_regex_namespace::regex_constants::match_not_eow |
| | global_regex_namespace::regex_constants::match_any |
| | global_regex_namespace::regex_constants::match_not_null |
| | global_regex_namespace::regex_constants::match_continuous |
| | global_regex_namespace::regex_constants::match_prev_avail |
| | global_regex_namespace::regex_constants::format_default |
| | global_regex_namespace::regex_constants::format_sed |
| | global_regex_namespace::regex_constants::format_no_copy |
| | global_regex_namespace::regex_constants::format_first_only; |
| ignore_unused_variable_warning(mopts); |
| |
| BOOST_STATIC_ASSERT((::boost::is_enum<global_regex_namespace::regex_constants::error_type>::value)); |
| global_regex_namespace::regex_constants::error_type e1 = global_regex_namespace::regex_constants::error_collate; |
| ignore_unused_variable_warning(e1); |
| e1 = global_regex_namespace::regex_constants::error_ctype; |
| ignore_unused_variable_warning(e1); |
| e1 = global_regex_namespace::regex_constants::error_escape; |
| ignore_unused_variable_warning(e1); |
| e1 = global_regex_namespace::regex_constants::error_backref; |
| ignore_unused_variable_warning(e1); |
| e1 = global_regex_namespace::regex_constants::error_brack; |
| ignore_unused_variable_warning(e1); |
| e1 = global_regex_namespace::regex_constants::error_paren; |
| ignore_unused_variable_warning(e1); |
| e1 = global_regex_namespace::regex_constants::error_brace; |
| ignore_unused_variable_warning(e1); |
| e1 = global_regex_namespace::regex_constants::error_badbrace; |
| ignore_unused_variable_warning(e1); |
| e1 = global_regex_namespace::regex_constants::error_range; |
| ignore_unused_variable_warning(e1); |
| e1 = global_regex_namespace::regex_constants::error_space; |
| ignore_unused_variable_warning(e1); |
| e1 = global_regex_namespace::regex_constants::error_badrepeat; |
| ignore_unused_variable_warning(e1); |
| e1 = global_regex_namespace::regex_constants::error_complexity; |
| ignore_unused_variable_warning(e1); |
| e1 = global_regex_namespace::regex_constants::error_stack; |
| ignore_unused_variable_warning(e1); |
| |
| BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::runtime_error, global_regex_namespace::regex_error>::value )); |
| const global_regex_namespace::regex_error except(e1); |
| e1 = except.code(); |
| |
| typedef typename Regex::value_type regex_value_type; |
| function_requires< RegexTraitsConcept<global_regex_namespace::regex_traits<char> > >(); |
| function_requires< BaseRegexConcept<global_regex_namespace::basic_regex<char> > >(); |
| } |
| void constraints() |
| { |
| global_constraints(); |
| |
| BOOST_STATIC_ASSERT((::boost::is_same< flag_type, global_regex_namespace::regex_constants::syntax_option_type>::value)); |
| flag_type opts |
| = Regex::icase |
| | Regex::nosubs |
| | Regex::optimize |
| | Regex::collate |
| | Regex::ECMAScript |
| | Regex::basic |
| | Regex::extended |
| | Regex::awk |
| | Regex::grep |
| | Regex::egrep; |
| ignore_unused_variable_warning(opts); |
| |
| function_requires<DefaultConstructibleConcept<Regex> >(); |
| function_requires<CopyConstructibleConcept<Regex> >(); |
| |
| // Regex constructors: |
| Regex e1(m_pointer); |
| ignore_unused_variable_warning(e1); |
| Regex e2(m_pointer, m_flags); |
| ignore_unused_variable_warning(e2); |
| Regex e3(m_pointer, m_size, m_flags); |
| ignore_unused_variable_warning(e3); |
| Regex e4(in1, in2); |
| ignore_unused_variable_warning(e4); |
| Regex e5(in1, in2, m_flags); |
| ignore_unused_variable_warning(e5); |
| |
| // assign etc: |
| Regex e; |
| e = m_pointer; |
| e = e1; |
| e.assign(e1); |
| e.assign(m_pointer); |
| e.assign(m_pointer, m_flags); |
| e.assign(m_pointer, m_size, m_flags); |
| e.assign(in1, in2); |
| e.assign(in1, in2, m_flags); |
| |
| // access: |
| const Regex ce; |
| typename Regex::size_type i = ce.mark_count(); |
| ignore_unused_variable_warning(i); |
| m_flags = ce.flags(); |
| e.imbue(ce.getloc()); |
| e.swap(e1); |
| |
| global_regex_namespace::swap(e, e1); |
| |
| // sub_match: |
| BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::pair<BidiIterator, BidiIterator>, sub_match_type>::value)); |
| typedef typename sub_match_type::value_type sub_value_type; |
| typedef typename sub_match_type::difference_type sub_diff_type; |
| typedef typename sub_match_type::iterator sub_iter_type; |
| BOOST_STATIC_ASSERT((::boost::is_same<sub_value_type, value_type>::value)); |
| BOOST_STATIC_ASSERT((::boost::is_same<sub_iter_type, BidiIterator>::value)); |
| bool b = m_sub.matched; |
| ignore_unused_variable_warning(b); |
| BidiIterator bi = m_sub.first; |
| ignore_unused_variable_warning(bi); |
| bi = m_sub.second; |
| ignore_unused_variable_warning(bi); |
| sub_diff_type diff = m_sub.length(); |
| ignore_unused_variable_warning(diff); |
| // match_results tests: |
| typedef typename match_results_type::value_type mr_value_type; |
| typedef typename match_results_type::const_reference mr_const_reference; |
| typedef typename match_results_type::reference mr_reference; |
| typedef typename match_results_type::const_iterator mr_const_iterator; |
| typedef typename match_results_type::iterator mr_iterator; |
| typedef typename match_results_type::difference_type mr_difference_type; |
| typedef typename match_results_type::size_type mr_size_type; |
| typedef typename match_results_type::allocator_type mr_allocator_type; |
| typedef typename match_results_type::char_type mr_char_type; |
| typedef typename match_results_type::string_type mr_string_type; |
| |
| match_results_type m1; |
| mr_allocator_type at; |
| match_results_type m2(at); |
| match_results_type m3(m1); |
| m1 = m2; |
| |
| int ival = 0; |
| |
| mr_size_type mrs = m_cresults.size(); |
| ignore_unused_variable_warning(mrs); |
| mrs = m_cresults.max_size(); |
| ignore_unused_variable_warning(mrs); |
| b = m_cresults.empty(); |
| ignore_unused_variable_warning(b); |
| mr_difference_type mrd = m_cresults.length(); |
| ignore_unused_variable_warning(mrd); |
| mrd = m_cresults.length(ival); |
| ignore_unused_variable_warning(mrd); |
| mrd = m_cresults.position(); |
| ignore_unused_variable_warning(mrd); |
| mrd = m_cresults.position(mrs); |
| ignore_unused_variable_warning(mrd); |
| |
| mr_const_reference mrcr = m_cresults[ival]; |
| ignore_unused_variable_warning(mrcr); |
| mr_const_reference mrcr2 = m_cresults.prefix(); |
| ignore_unused_variable_warning(mrcr2); |
| mr_const_reference mrcr3 = m_cresults.suffix(); |
| ignore_unused_variable_warning(mrcr3); |
| mr_const_iterator mrci = m_cresults.begin(); |
| ignore_unused_variable_warning(mrci); |
| mrci = m_cresults.end(); |
| ignore_unused_variable_warning(mrci); |
| |
| mr_allocator_type at2 = m_cresults.get_allocator(); |
| m_results.swap(m_results); |
| global_regex_namespace::swap(m_results, m_results); |
| |
| // regex_match: |
| b = global_regex_namespace::regex_match(m_in, m_in, m_results, e); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_match(m_in, m_in, m_results, e, m_mft); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_match(m_in, m_in, e); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_match(m_in, m_in, e, m_mft); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_match(m_pointer, m_pmatch, e); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_match(m_pointer, m_pmatch, e, m_mft); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_match(m_pointer, e); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_match(m_pointer, e, m_mft); |
| ignore_unused_variable_warning(b); |
| // regex_search: |
| b = global_regex_namespace::regex_search(m_in, m_in, m_results, e); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_search(m_in, m_in, m_results, e, m_mft); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_search(m_in, m_in, e); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_search(m_in, m_in, e, m_mft); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_search(m_pointer, m_pmatch, e); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_search(m_pointer, m_pmatch, e, m_mft); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_search(m_pointer, e); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_search(m_pointer, e, m_mft); |
| ignore_unused_variable_warning(b); |
| |
| // regex_iterator: |
| typedef typename regex_iterator_type::regex_type rit_regex_type; |
| typedef typename regex_iterator_type::value_type rit_value_type; |
| typedef typename regex_iterator_type::difference_type rit_difference_type; |
| typedef typename regex_iterator_type::pointer rit_pointer; |
| typedef typename regex_iterator_type::reference rit_reference; |
| typedef typename regex_iterator_type::iterator_category rit_iterator_category; |
| BOOST_STATIC_ASSERT((::boost::is_same<rit_regex_type, Regex>::value)); |
| BOOST_STATIC_ASSERT((::boost::is_same<rit_value_type, match_results_default_type>::value)); |
| BOOST_STATIC_ASSERT((::boost::is_same<rit_difference_type, std::ptrdiff_t>::value)); |
| BOOST_STATIC_ASSERT((::boost::is_same<rit_pointer, const match_results_default_type*>::value)); |
| BOOST_STATIC_ASSERT((::boost::is_same<rit_reference, const match_results_default_type&>::value)); |
| BOOST_STATIC_ASSERT((::boost::is_convertible<rit_iterator_category*, std::forward_iterator_tag*>::value)); |
| // this takes care of most of the checks needed: |
| function_requires<ForwardIteratorConcept<regex_iterator_type> >(); |
| regex_iterator_type iter1(m_in, m_in, e); |
| ignore_unused_variable_warning(iter1); |
| regex_iterator_type iter2(m_in, m_in, e, m_mft); |
| ignore_unused_variable_warning(iter2); |
| |
| // regex_token_iterator: |
| typedef typename regex_token_iterator_type::regex_type rtit_regex_type; |
| typedef typename regex_token_iterator_type::value_type rtit_value_type; |
| typedef typename regex_token_iterator_type::difference_type rtit_difference_type; |
| typedef typename regex_token_iterator_type::pointer rtit_pointer; |
| typedef typename regex_token_iterator_type::reference rtit_reference; |
| typedef typename regex_token_iterator_type::iterator_category rtit_iterator_category; |
| BOOST_STATIC_ASSERT((::boost::is_same<rtit_regex_type, Regex>::value)); |
| BOOST_STATIC_ASSERT((::boost::is_same<rtit_value_type, sub_match_type>::value)); |
| BOOST_STATIC_ASSERT((::boost::is_same<rtit_difference_type, std::ptrdiff_t>::value)); |
| BOOST_STATIC_ASSERT((::boost::is_same<rtit_pointer, const sub_match_type*>::value)); |
| BOOST_STATIC_ASSERT((::boost::is_same<rtit_reference, const sub_match_type&>::value)); |
| BOOST_STATIC_ASSERT((::boost::is_convertible<rtit_iterator_category*, std::forward_iterator_tag*>::value)); |
| // this takes care of most of the checks needed: |
| function_requires<ForwardIteratorConcept<regex_token_iterator_type> >(); |
| regex_token_iterator_type ti1(m_in, m_in, e); |
| ignore_unused_variable_warning(ti1); |
| regex_token_iterator_type ti2(m_in, m_in, e, 0); |
| ignore_unused_variable_warning(ti2); |
| regex_token_iterator_type ti3(m_in, m_in, e, 0, m_mft); |
| ignore_unused_variable_warning(ti3); |
| std::vector<int> subs; |
| regex_token_iterator_type ti4(m_in, m_in, e, subs); |
| ignore_unused_variable_warning(ti4); |
| regex_token_iterator_type ti5(m_in, m_in, e, subs, m_mft); |
| ignore_unused_variable_warning(ti5); |
| static const int i_array[3] = { 1, 2, 3, }; |
| regex_token_iterator_type ti6(m_in, m_in, e, i_array); |
| ignore_unused_variable_warning(ti6); |
| regex_token_iterator_type ti7(m_in, m_in, e, i_array, m_mft); |
| ignore_unused_variable_warning(ti7); |
| } |
| |
| pointer_type m_pointer; |
| flag_type m_flags; |
| std::size_t m_size; |
| input_iterator_type in1, in2; |
| const sub_match_type m_sub; |
| const value_type m_char; |
| match_results_type m_results; |
| const match_results_type m_cresults; |
| OutIterator m_out; |
| BidiIterator m_in; |
| global_regex_namespace::regex_constants::match_flag_type m_mft; |
| global_regex_namespace::match_results< |
| pointer_type, |
| allocator_architype<global_regex_namespace::sub_match<pointer_type> > > |
| m_pmatch; |
| |
| BaseRegexConcept(); |
| BaseRegexConcept(const BaseRegexConcept&); |
| BaseRegexConcept& operator=(const BaseRegexConcept&); |
| }; |
| |
| // |
| // RegexConcept: |
| // Test every interface in the std: |
| // |
| template <class Regex> |
| struct RegexConcept |
| { |
| typedef typename Regex::value_type value_type; |
| //typedef typename Regex::size_type size_type; |
| typedef typename Regex::flag_type flag_type; |
| typedef typename Regex::locale_type locale_type; |
| |
| // derived test types: |
| typedef const value_type* pointer_type; |
| typedef std::basic_string<value_type> string_type; |
| typedef boost::bidirectional_iterator_archetype<value_type> BidiIterator; |
| typedef global_regex_namespace::sub_match<BidiIterator> sub_match_type; |
| typedef global_regex_namespace::match_results<BidiIterator, allocator_architype<sub_match_type> > match_results_type; |
| typedef output_iterator_archetype<value_type> OutIterator; |
| |
| |
| void constraints() |
| { |
| function_requires<BaseRegexConcept<Regex> >(); |
| // string based construct: |
| Regex e1(m_string); |
| ignore_unused_variable_warning(e1); |
| Regex e2(m_string, m_flags); |
| ignore_unused_variable_warning(e2); |
| |
| // assign etc: |
| Regex e; |
| e = m_string; |
| e.assign(m_string); |
| e.assign(m_string, m_flags); |
| |
| // sub_match: |
| string_type s(m_sub); |
| ignore_unused_variable_warning(s); |
| s = m_sub.str(); |
| ignore_unused_variable_warning(s); |
| int i = m_sub.compare(m_string); |
| ignore_unused_variable_warning(i); |
| |
| int i2 = m_sub.compare(m_sub); |
| ignore_unused_variable_warning(i2); |
| i2 = m_sub.compare(m_pointer); |
| ignore_unused_variable_warning(i2); |
| |
| bool b = m_sub == m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_sub != m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_sub <= m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_sub <= m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_sub > m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_sub >= m_sub; |
| ignore_unused_variable_warning(b); |
| |
| b = m_sub == m_pointer; |
| ignore_unused_variable_warning(b); |
| b = m_sub != m_pointer; |
| ignore_unused_variable_warning(b); |
| b = m_sub <= m_pointer; |
| ignore_unused_variable_warning(b); |
| b = m_sub <= m_pointer; |
| ignore_unused_variable_warning(b); |
| b = m_sub > m_pointer; |
| ignore_unused_variable_warning(b); |
| b = m_sub >= m_pointer; |
| ignore_unused_variable_warning(b); |
| |
| b = m_pointer == m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_pointer != m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_pointer <= m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_pointer <= m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_pointer > m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_pointer >= m_sub; |
| ignore_unused_variable_warning(b); |
| |
| b = m_sub == m_char; |
| ignore_unused_variable_warning(b); |
| b = m_sub != m_char; |
| ignore_unused_variable_warning(b); |
| b = m_sub <= m_char; |
| ignore_unused_variable_warning(b); |
| b = m_sub <= m_char; |
| ignore_unused_variable_warning(b); |
| b = m_sub > m_char; |
| ignore_unused_variable_warning(b); |
| b = m_sub >= m_char; |
| ignore_unused_variable_warning(b); |
| |
| b = m_char == m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_char != m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_char <= m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_char <= m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_char > m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_char >= m_sub; |
| ignore_unused_variable_warning(b); |
| |
| b = m_sub == m_string; |
| ignore_unused_variable_warning(b); |
| b = m_sub != m_string; |
| ignore_unused_variable_warning(b); |
| b = m_sub <= m_string; |
| ignore_unused_variable_warning(b); |
| b = m_sub <= m_string; |
| ignore_unused_variable_warning(b); |
| b = m_sub > m_string; |
| ignore_unused_variable_warning(b); |
| b = m_sub >= m_string; |
| ignore_unused_variable_warning(b); |
| |
| b = m_string == m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_string != m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_string <= m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_string <= m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_string > m_sub; |
| ignore_unused_variable_warning(b); |
| b = m_string >= m_sub; |
| ignore_unused_variable_warning(b); |
| |
| // match results: |
| m_string = m_results.str(); |
| ignore_unused_variable_warning(m_string); |
| m_string = m_results.str(0); |
| ignore_unused_variable_warning(m_string); |
| m_out = m_cresults.format(m_out, m_string); |
| m_out = m_cresults.format(m_out, m_string, m_mft); |
| m_string = m_cresults.format(m_string); |
| ignore_unused_variable_warning(m_string); |
| m_string = m_cresults.format(m_string, m_mft); |
| ignore_unused_variable_warning(m_string); |
| |
| // regex_match: |
| b = global_regex_namespace::regex_match(m_string, m_smatch, e); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_match(m_string, m_smatch, e, m_mft); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_match(m_string, e); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_match(m_string, e, m_mft); |
| ignore_unused_variable_warning(b); |
| |
| // regex_search: |
| b = global_regex_namespace::regex_search(m_string, m_smatch, e); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_search(m_string, m_smatch, e, m_mft); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_search(m_string, e); |
| ignore_unused_variable_warning(b); |
| b = global_regex_namespace::regex_search(m_string, e, m_mft); |
| ignore_unused_variable_warning(b); |
| |
| // regex_replace: |
| m_out = global_regex_namespace::regex_replace(m_out, m_in, m_in, e, m_string, m_mft); |
| m_out = global_regex_namespace::regex_replace(m_out, m_in, m_in, e, m_string); |
| m_string = global_regex_namespace::regex_replace(m_string, e, m_string, m_mft); |
| ignore_unused_variable_warning(m_string); |
| m_string = global_regex_namespace::regex_replace(m_string, e, m_string); |
| ignore_unused_variable_warning(m_string); |
| |
| } |
| |
| flag_type m_flags; |
| string_type m_string; |
| const sub_match_type m_sub; |
| match_results_type m_results; |
| pointer_type m_pointer; |
| value_type m_char; |
| const match_results_type m_cresults; |
| OutIterator m_out; |
| BidiIterator m_in; |
| global_regex_namespace::regex_constants::match_flag_type m_mft; |
| global_regex_namespace::match_results<typename string_type::const_iterator, allocator_architype<global_regex_namespace::sub_match<typename string_type::const_iterator> > > m_smatch; |
| |
| RegexConcept(); |
| RegexConcept(const RegexConcept&); |
| RegexConcept& operator=(const RegexConcept&); |
| }; |
| |
| #ifndef BOOST_REGEX_TEST_STD |
| |
| template <class M> |
| struct functor1 |
| { |
| typedef typename M::char_type char_type; |
| const char_type* operator()(const M&)const |
| { |
| static const char_type c = static_cast<char_type>(0); |
| return &c; |
| } |
| }; |
| template <class M> |
| struct functor1b |
| { |
| typedef typename M::char_type char_type; |
| std::vector<char_type> operator()(const M&)const |
| { |
| static const std::vector<char_type> c; |
| return c; |
| } |
| }; |
| template <class M> |
| struct functor2 |
| { |
| template <class O> |
| O operator()(const M& /*m*/, O i)const |
| { |
| return i; |
| } |
| }; |
| template <class M> |
| struct functor3 |
| { |
| template <class O> |
| O operator()(const M& /*m*/, O i, regex_constants::match_flag_type)const |
| { |
| return i; |
| } |
| }; |
| |
| // |
| // BoostRegexConcept: |
| // Test every interface in the Boost implementation: |
| // |
| template <class Regex> |
| struct BoostRegexConcept |
| { |
| typedef typename Regex::value_type value_type; |
| typedef typename Regex::size_type size_type; |
| typedef typename Regex::flag_type flag_type; |
| typedef typename Regex::locale_type locale_type; |
| |
| // derived test types: |
| typedef const value_type* pointer_type; |
| typedef std::basic_string<value_type> string_type; |
| typedef typename Regex::const_iterator const_iterator; |
| typedef bidirectional_iterator_archetype<value_type> BidiIterator; |
| typedef output_iterator_archetype<value_type> OutputIterator; |
| typedef global_regex_namespace::sub_match<BidiIterator> sub_match_type; |
| typedef global_regex_namespace::match_results<BidiIterator, allocator_architype<sub_match_type> > match_results_type; |
| typedef global_regex_namespace::match_results<BidiIterator> match_results_default_type; |
| |
| void constraints() |
| { |
| global_regex_namespace::regex_constants::match_flag_type mopts |
| = global_regex_namespace::regex_constants::match_default |
| | global_regex_namespace::regex_constants::match_not_bol |
| | global_regex_namespace::regex_constants::match_not_eol |
| | global_regex_namespace::regex_constants::match_not_bow |
| | global_regex_namespace::regex_constants::match_not_eow |
| | global_regex_namespace::regex_constants::match_any |
| | global_regex_namespace::regex_constants::match_not_null |
| | global_regex_namespace::regex_constants::match_continuous |
| | global_regex_namespace::regex_constants::match_partial |
| | global_regex_namespace::regex_constants::match_prev_avail |
| | global_regex_namespace::regex_constants::format_default |
| | global_regex_namespace::regex_constants::format_sed |
| | global_regex_namespace::regex_constants::format_perl |
| | global_regex_namespace::regex_constants::format_no_copy |
| | global_regex_namespace::regex_constants::format_first_only; |
| |
| (void)mopts; |
| |
| function_requires<RegexConcept<Regex> >(); |
| const global_regex_namespace::regex_error except(global_regex_namespace::regex_constants::error_collate); |
| std::ptrdiff_t pt = except.position(); |
| ignore_unused_variable_warning(pt); |
| const Regex ce, ce2; |
| #ifndef BOOST_NO_STD_LOCALE |
| m_stream << ce; |
| #endif |
| unsigned i = ce.error_code(); |
| ignore_unused_variable_warning(i); |
| pointer_type p = ce.expression(); |
| ignore_unused_variable_warning(p); |
| int i2 = ce.compare(ce2); |
| ignore_unused_variable_warning(i2); |
| bool b = ce == ce2; |
| ignore_unused_variable_warning(b); |
| b = ce.empty(); |
| ignore_unused_variable_warning(b); |
| b = ce != ce2; |
| ignore_unused_variable_warning(b); |
| b = ce < ce2; |
| ignore_unused_variable_warning(b); |
| b = ce > ce2; |
| ignore_unused_variable_warning(b); |
| b = ce <= ce2; |
| ignore_unused_variable_warning(b); |
| b = ce >= ce2; |
| ignore_unused_variable_warning(b); |
| i = ce.status(); |
| ignore_unused_variable_warning(i); |
| size_type s = ce.max_size(); |
| ignore_unused_variable_warning(s); |
| s = ce.size(); |
| ignore_unused_variable_warning(s); |
| const_iterator pi = ce.begin(); |
| ignore_unused_variable_warning(pi); |
| pi = ce.end(); |
| ignore_unused_variable_warning(pi); |
| string_type s2 = ce.str(); |
| ignore_unused_variable_warning(s2); |
| |
| m_string = m_sub + m_sub; |
| ignore_unused_variable_warning(m_string); |
| m_string = m_sub + m_pointer; |
| ignore_unused_variable_warning(m_string); |
| m_string = m_pointer + m_sub; |
| ignore_unused_variable_warning(m_string); |
| m_string = m_sub + m_string; |
| ignore_unused_variable_warning(m_string); |
| m_string = m_string + m_sub; |
| ignore_unused_variable_warning(m_string); |
| m_string = m_sub + m_char; |
| ignore_unused_variable_warning(m_string); |
| m_string = m_char + m_sub; |
| ignore_unused_variable_warning(m_string); |
| |
| // Named sub-expressions: |
| m_sub = m_cresults[&m_char]; |
| ignore_unused_variable_warning(m_sub); |
| m_sub = m_cresults[m_string]; |
| ignore_unused_variable_warning(m_sub); |
| m_sub = m_cresults[""]; |
| ignore_unused_variable_warning(m_sub); |
| m_sub = m_cresults[std::string("")]; |
| ignore_unused_variable_warning(m_sub); |
| m_string = m_cresults.str(&m_char); |
| ignore_unused_variable_warning(m_string); |
| m_string = m_cresults.str(m_string); |
| ignore_unused_variable_warning(m_string); |
| m_string = m_cresults.str(""); |
| ignore_unused_variable_warning(m_string); |
| m_string = m_cresults.str(std::string("")); |
| ignore_unused_variable_warning(m_string); |
| |
| typename match_results_type::difference_type diff; |
| diff = m_cresults.length(&m_char); |
| ignore_unused_variable_warning(diff); |
| diff = m_cresults.length(m_string); |
| ignore_unused_variable_warning(diff); |
| diff = m_cresults.length(""); |
| ignore_unused_variable_warning(diff); |
| diff = m_cresults.length(std::string("")); |
| ignore_unused_variable_warning(diff); |
| diff = m_cresults.position(&m_char); |
| ignore_unused_variable_warning(diff); |
| diff = m_cresults.position(m_string); |
| ignore_unused_variable_warning(diff); |
| diff = m_cresults.position(""); |
| ignore_unused_variable_warning(diff); |
| diff = m_cresults.position(std::string("")); |
| ignore_unused_variable_warning(diff); |
| |
| #ifndef BOOST_NO_STD_LOCALE |
| m_stream << m_sub; |
| m_stream << m_cresults; |
| #endif |
| // |
| // Extended formatting with a functor: |
| // |
| regex_constants::match_flag_type f = regex_constants::match_default; |
| OutputIterator out = static_object<OutputIterator>::get(); |
| |
| functor3<match_results_default_type> func3; |
| functor2<match_results_default_type> func2; |
| functor1<match_results_default_type> func1; |
| |
| functor3<match_results_type> func3b; |
| functor2<match_results_type> func2b; |
| functor1<match_results_type> func1b; |
| |
| out = regex_format(out, m_cresults, func3b, f); |
| out = regex_format(out, m_cresults, func3b); |
| out = regex_format(out, m_cresults, func2b, f); |
| out = regex_format(out, m_cresults, func2b); |
| out = regex_format(out, m_cresults, func1b, f); |
| out = regex_format(out, m_cresults, func1b); |
| out = regex_format(out, m_cresults, boost::ref(func3b), f); |
| out = regex_format(out, m_cresults, boost::ref(func3b)); |
| out = regex_format(out, m_cresults, boost::ref(func2b), f); |
| out = regex_format(out, m_cresults, boost::ref(func2b)); |
| out = regex_format(out, m_cresults, boost::ref(func1b), f); |
| out = regex_format(out, m_cresults, boost::ref(func1b)); |
| out = regex_format(out, m_cresults, boost::cref(func3b), f); |
| out = regex_format(out, m_cresults, boost::cref(func3b)); |
| out = regex_format(out, m_cresults, boost::cref(func2b), f); |
| out = regex_format(out, m_cresults, boost::cref(func2b)); |
| out = regex_format(out, m_cresults, boost::cref(func1b), f); |
| out = regex_format(out, m_cresults, boost::cref(func1b)); |
| |
| m_string += regex_format(m_cresults, func3b, f); |
| m_string += regex_format(m_cresults, func3b); |
| m_string += regex_format(m_cresults, func2b, f); |
| m_string += regex_format(m_cresults, func2b); |
| m_string += regex_format(m_cresults, func1b, f); |
| m_string += regex_format(m_cresults, func1b); |
| m_string += regex_format(m_cresults, boost::ref(func3b), f); |
| m_string += regex_format(m_cresults, boost::ref(func3b)); |
| m_string += regex_format(m_cresults, boost::ref(func2b), f); |
| m_string += regex_format(m_cresults, boost::ref(func2b)); |
| m_string += regex_format(m_cresults, boost::ref(func1b), f); |
| m_string += regex_format(m_cresults, boost::ref(func1b)); |
| m_string += regex_format(m_cresults, boost::cref(func3b), f); |
| m_string += regex_format(m_cresults, boost::cref(func3b)); |
| m_string += regex_format(m_cresults, boost::cref(func2b), f); |
| m_string += regex_format(m_cresults, boost::cref(func2b)); |
| m_string += regex_format(m_cresults, boost::cref(func1b), f); |
| m_string += regex_format(m_cresults, boost::cref(func1b)); |
| |
| out = m_cresults.format(out, func3b, f); |
| out = m_cresults.format(out, func3b); |
| out = m_cresults.format(out, func2b, f); |
| out = m_cresults.format(out, func2b); |
| out = m_cresults.format(out, func1b, f); |
| out = m_cresults.format(out, func1b); |
| out = m_cresults.format(out, boost::ref(func3b), f); |
| out = m_cresults.format(out, boost::ref(func3b)); |
| out = m_cresults.format(out, boost::ref(func2b), f); |
| out = m_cresults.format(out, boost::ref(func2b)); |
| out = m_cresults.format(out, boost::ref(func1b), f); |
| out = m_cresults.format(out, boost::ref(func1b)); |
| out = m_cresults.format(out, boost::cref(func3b), f); |
| out = m_cresults.format(out, boost::cref(func3b)); |
| out = m_cresults.format(out, boost::cref(func2b), f); |
| out = m_cresults.format(out, boost::cref(func2b)); |
| out = m_cresults.format(out, boost::cref(func1b), f); |
| out = m_cresults.format(out, boost::cref(func1b)); |
| |
| m_string += m_cresults.format(func3b, f); |
| m_string += m_cresults.format(func3b); |
| m_string += m_cresults.format(func2b, f); |
| m_string += m_cresults.format(func2b); |
| m_string += m_cresults.format(func1b, f); |
| m_string += m_cresults.format(func1b); |
| m_string += m_cresults.format(boost::ref(func3b), f); |
| m_string += m_cresults.format(boost::ref(func3b)); |
| m_string += m_cresults.format(boost::ref(func2b), f); |
| m_string += m_cresults.format(boost::ref(func2b)); |
| m_string += m_cresults.format(boost::ref(func1b), f); |
| m_string += m_cresults.format(boost::ref(func1b)); |
| m_string += m_cresults.format(boost::cref(func3b), f); |
| m_string += m_cresults.format(boost::cref(func3b)); |
| m_string += m_cresults.format(boost::cref(func2b), f); |
| m_string += m_cresults.format(boost::cref(func2b)); |
| m_string += m_cresults.format(boost::cref(func1b), f); |
| m_string += m_cresults.format(boost::cref(func1b)); |
| |
| out = regex_replace(out, m_in, m_in, ce, func3, f); |
| out = regex_replace(out, m_in, m_in, ce, func3); |
| out = regex_replace(out, m_in, m_in, ce, func2, f); |
| out = regex_replace(out, m_in, m_in, ce, func2); |
| out = regex_replace(out, m_in, m_in, ce, func1, f); |
| out = regex_replace(out, m_in, m_in, ce, func1); |
| out = regex_replace(out, m_in, m_in, ce, boost::ref(func3), f); |
| out = regex_replace(out, m_in, m_in, ce, boost::ref(func3)); |
| out = regex_replace(out, m_in, m_in, ce, boost::ref(func2), f); |
| out = regex_replace(out, m_in, m_in, ce, boost::ref(func2)); |
| out = regex_replace(out, m_in, m_in, ce, boost::ref(func1), f); |
| out = regex_replace(out, m_in, m_in, ce, boost::ref(func1)); |
| out = regex_replace(out, m_in, m_in, ce, boost::cref(func3), f); |
| out = regex_replace(out, m_in, m_in, ce, boost::cref(func3)); |
| out = regex_replace(out, m_in, m_in, ce, boost::cref(func2), f); |
| out = regex_replace(out, m_in, m_in, ce, boost::cref(func2)); |
| out = regex_replace(out, m_in, m_in, ce, boost::cref(func1), f); |
| out = regex_replace(out, m_in, m_in, ce, boost::cref(func1)); |
| |
| functor3<match_results<typename string_type::const_iterator> > func3s; |
| functor2<match_results<typename string_type::const_iterator> > func2s; |
| functor1<match_results<typename string_type::const_iterator> > func1s; |
| m_string += regex_replace(m_string, ce, func3s, f); |
| m_string += regex_replace(m_string, ce, func3s); |
| m_string += regex_replace(m_string, ce, func2s, f); |
| m_string += regex_replace(m_string, ce, func2s); |
| m_string += regex_replace(m_string, ce, func1s, f); |
| m_string += regex_replace(m_string, ce, func1s); |
| m_string += regex_replace(m_string, ce, boost::ref(func3s), f); |
| m_string += regex_replace(m_string, ce, boost::ref(func3s)); |
| m_string += regex_replace(m_string, ce, boost::ref(func2s), f); |
| m_string += regex_replace(m_string, ce, boost::ref(func2s)); |
| m_string += regex_replace(m_string, ce, boost::ref(func1s), f); |
| m_string += regex_replace(m_string, ce, boost::ref(func1s)); |
| m_string += regex_replace(m_string, ce, boost::cref(func3s), f); |
| m_string += regex_replace(m_string, ce, boost::cref(func3s)); |
| m_string += regex_replace(m_string, ce, boost::cref(func2s), f); |
| m_string += regex_replace(m_string, ce, boost::cref(func2s)); |
| m_string += regex_replace(m_string, ce, boost::cref(func1s), f); |
| m_string += regex_replace(m_string, ce, boost::cref(func1s)); |
| } |
| |
| std::basic_ostream<value_type> m_stream; |
| sub_match_type m_sub; |
| pointer_type m_pointer; |
| string_type m_string; |
| const value_type m_char; |
| match_results_type m_results; |
| const match_results_type m_cresults; |
| BidiIterator m_in; |
| |
| BoostRegexConcept(); |
| BoostRegexConcept(const BoostRegexConcept&); |
| BoostRegexConcept& operator=(const BoostRegexConcept&); |
| }; |
| |
| #endif // BOOST_REGEX_TEST_STD |
| |
| } |
| |
| #endif |