Files
boost_regex/include/boost/regex/concepts.hpp
T
Eric Niebler cfacfddccd Merged revisions 44111-44378 via svnmerge from
https://svn.boost.org/svn/boost/trunk

........
  r44114 | emildotchevski | 2008-04-08 14:29:37 -0700 (Tue, 08 Apr 2008) | 1 line
  
  fixed compile errors, removed tabs as required.
........
  r44118 | djowel | 2008-04-08 18:29:12 -0700 (Tue, 08 Apr 2008) | 7 lines
  
  In preparation for spirit2:
  * flat includes
  * home directory
  * forwarding headers
  * classic spirit
........
  r44119 | djowel | 2008-04-08 18:51:47 -0700 (Tue, 08 Apr 2008) | 7 lines
  
  In preparation for spirit2:
  * flat includes
  * home directory
  * forwarding headers
  * classic spirit
........
  r44120 | hkaiser | 2008-04-08 19:17:53 -0700 (Tue, 08 Apr 2008) | 1 line
  
  Fixed one more include path
........
  r44121 | johnmaddock | 2008-04-09 04:34:20 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Run config_info and config_test in both single and multi-thread modes.
........
  r44122 | johnmaddock | 2008-04-09 04:34:45 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Run config_info and config_test in both single and multi-thread modes.
........
  r44123 | johnmaddock | 2008-04-09 04:35:36 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Added needed #includes.
........
  r44124 | johnmaddock | 2008-04-09 04:45:15 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Added improved SVG support.
........
  r44125 | hkaiser | 2008-04-09 06:50:03 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Fixed #pragma message directives and a couple of forwarding headers.
........
  r44126 | johnmaddock | 2008-04-09 08:21:03 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Fix bug report #1797.
........
  r44127 | johnmaddock | 2008-04-09 08:31:33 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Update for bug report #1790.
........
  r44128 | johnmaddock | 2008-04-09 08:32:08 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Fix for bug #1790.
........
  r44130 | danieljames | 2008-04-09 10:26:31 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Fix a typo.
........
  r44131 | danieljames | 2008-04-09 10:27:08 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Rebuild the function types documentation.
........
  r44132 | pdimov | 2008-04-09 10:49:20 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Proper try_lock semantics.
........
  r44134 | emildotchevski | 2008-04-09 11:48:39 -0700 (Wed, 09 Apr 2008) | 1 line
  
  missing include
........
  r44136 | anthonyw | 2008-04-09 12:33:06 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Added test for trac ticket #1803: condition_variable::notify_one may fail to wake a waiting thread on win32
........
  r44137 | pdimov | 2008-04-09 12:58:54 -0700 (Wed, 09 Apr 2008) | 1 line
  
  sp_counted_base_spin.hpp added, enabled by BOOST_SP_USE_SPINLOCK.
........
  r44138 | pdimov | 2008-04-09 14:08:39 -0700 (Wed, 09 Apr 2008) | 1 line
  
  spinlock_gcc_arm.hpp added.
........
  r44139 | grafik | 2008-04-09 14:20:28 -0700 (Wed, 09 Apr 2008) | 1 line
  
  Add ARM architecture/instrustion-set.
........
  r44140 | pdimov | 2008-04-09 16:19:22 -0700 (Wed, 09 Apr 2008) | 1 line
  
  ARM assembly fix.
........
  r44145 | johnmaddock | 2008-04-10 05:46:41 -0700 (Thu, 10 Apr 2008) | 2 lines
  
  Doh! Changes to code should actually compile!
  A fix for the last change.
........
  r44146 | anthonyw | 2008-04-10 06:14:43 -0700 (Thu, 10 Apr 2008) | 1 line
  
  fix for notify problem in trac ticket #1803
........
  r44147 | anthonyw | 2008-04-10 06:27:44 -0700 (Thu, 10 Apr 2008) | 1 line
  
  fix for trac ticket #1804
........
  r44148 | anthonyw | 2008-04-10 06:35:07 -0700 (Thu, 10 Apr 2008) | 1 line
  
  Added native_handle to thread on posix platforms
........
  r44149 | anthonyw | 2008-04-10 07:07:39 -0700 (Thu, 10 Apr 2008) | 1 line
  
  added overloads of timed_lock_shared with a relative timeout to shared_mutex
........
  r44150 | anthonyw | 2008-04-10 07:15:26 -0700 (Thu, 10 Apr 2008) | 1 line
  
  added tests for plain timed_lock on shared_mutex
........
  r44151 | daniel_frey | 2008-04-10 07:38:14 -0700 (Thu, 10 Apr 2008) | 1 line
  
  Added test and fix for "convertible to bool" requirement
........
  r44152 | anthonyw | 2008-04-10 08:52:01 -0700 (Thu, 10 Apr 2008) | 1 line
  
  Added native_handle to condition_variable on pthreads
........
  r44153 | anthonyw | 2008-04-10 11:34:42 -0700 (Thu, 10 Apr 2008) | 1 line
  
  Updated thread.hpp as catch-all header
........
  r44160 | dgregor | 2008-04-10 14:05:14 -0700 (Thu, 10 Apr 2008) | 1 line
  
  Refactor mpi_datatype_cache to fix problems on VC9
........
  r44161 | danieljames | 2008-04-10 14:06:48 -0700 (Thu, 10 Apr 2008) | 2 lines
  
  Try to fix Herve's name in a couple of places.
........
  r44163 | djowel | 2008-04-10 16:51:31 -0700 (Thu, 10 Apr 2008) | 1 line
  
  moving stuff to classic spirit
........
  r44164 | emildotchevski | 2008-04-10 20:51:06 -0700 (Thu, 10 Apr 2008) | 1 line
  
  to_string fixes
........
  r44165 | grafik | 2008-04-10 22:34:00 -0700 (Thu, 10 Apr 2008) | 1 line
  
  Use local sorted() function to support Python < 2.4.
........
  r44166 | grafik | 2008-04-10 22:36:28 -0700 (Thu, 10 Apr 2008) | 1 line
  
  Add support for toolset requirements at the definition level.
........
  r44167 | grafik | 2008-04-11 00:50:47 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Initial support for cross-compiling to ARM architecture.
........
  r44168 | anthonyw | 2008-04-11 01:52:09 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Added test and fix for win32 condition_variable broadcast bug similar to #1803
........
  r44169 | johnmaddock | 2008-04-11 01:53:54 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Fix doc typo from issue #1794.
........
  r44170 | johnmaddock | 2008-04-11 02:21:08 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Beefed up pthreads test cases.
........
  r44171 | johnmaddock | 2008-04-11 02:22:31 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Hopefully fix gcc/solaris single threading mode.
........
  r44172 | jurko | 2008-04-11 03:51:43 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Comment typo correction.
........
  r44175 | dgregor | 2008-04-11 08:39:41 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Fix some header-inclusion and header-ordering issues to get the MPI library compiling again.
........
  r44186 | johnmaddock | 2008-04-11 10:54:47 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Disable long double tests on unsupported platforms.
........
  r44187 | johnmaddock | 2008-04-11 10:57:58 -0700 (Fri, 11 Apr 2008) | 1 line
  
  We don't need duplicate using declarations.
........
  r44188 | johnmaddock | 2008-04-11 11:08:59 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Update error levels for real_concept tests.
........
  r44189 | johnmaddock | 2008-04-11 11:12:02 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Update tolerance used for skewness test.
........
  r44190 | hkaiser | 2008-04-11 11:19:46 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Fixed reference to Spirit classic test suite
........
  r44192 | emildotchevski | 2008-04-11 11:34:46 -0700 (Fri, 11 Apr 2008) | 1 line
  
  to_string adjustments
........
  r44195 | jurko | 2008-04-11 14:03:06 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Implemented a patch contributed by Igor Nazarenko reimplementing the list_sort() function to use a C qsort() function instead of a hand-crafted merge-sort algorithm. Makes some list sortings (e.g. 1,2,1,2,1,2,1,2,...) extremely faster, in turn significantly speeding up some project builds.
........
  r44196 | hkaiser | 2008-04-11 15:01:55 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Changed SpiritV1 header files to have a classic_ prefix
........
  r44197 | hkaiser | 2008-04-11 15:05:25 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Renamed a SpiritV1 header file I missed before
........
  r44198 | hkaiser | 2008-04-11 19:35:34 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Renamed PhoenixV1 files.
........
  r44203 | hkaiser | 2008-04-11 20:00:17 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Fixed an ambiguity.
........
  r44206 | hkaiser | 2008-04-11 20:02:34 -0700 (Fri, 11 Apr 2008) | 1 line
  
  Fixed more SpiritV1 header references after renaming
........
  r44246 | emildotchevski | 2008-04-11 20:27:57 -0700 (Fri, 11 Apr 2008) | 1 line
  
  removed tabs. what's wrong with tabs anyway?
........
  r44342 | emildotchevski | 2008-04-11 23:08:10 -0700 (Fri, 11 Apr 2008) | 1 line
  
  documentation cleanup
........
  r44343 | speedsnail | 2008-04-12 04:02:35 -0700 (Sat, 12 Apr 2008) | 2 lines
  
  Fixed a bug in for seldom used argument <property:/property-name/> in rule format-name.
  Added /property-name/ may be a regex.
........
  r44344 | pdimov | 2008-04-12 07:27:22 -0700 (Sat, 12 Apr 2008) | 1 line
  
  shared_ptr::lock no longer requires exceptions.
........
  r44346 | johnmaddock | 2008-04-12 09:01:16 -0700 (Sat, 12 Apr 2008) | 1 line
  
  Remove references to Boost.Test from the config_test target.
........
  r44347 | johnmaddock | 2008-04-12 09:02:24 -0700 (Sat, 12 Apr 2008) | 1 line
  
  When -lrt is needed, it's needed in *both* single and multi-threaded builds.
........
  r44350 | johnmaddock | 2008-04-12 09:27:11 -0700 (Sat, 12 Apr 2008) | 2 lines
  
  Add non central distro's to fwd.hpp.
  Added needed #include to bessel_ik.hpp.
........
  r44351 | johnmaddock | 2008-04-12 09:28:57 -0700 (Sat, 12 Apr 2008) | 3 lines
  
  Fix declaration order in dist_nc_beta_incl_test.cpp test.
  Fix long long usage in sf_modf_incl_test.cpp.
  Adjust failure rates in test_zeta.cpp to cope with HP aCC and 128-bit long doubles.
........
  r44352 | johnmaddock | 2008-04-12 09:42:28 -0700 (Sat, 12 Apr 2008) | 1 line
  
  Remove test row that causes problems for VC-7.1 due to a compiler bug.
........
  r44353 | pdimov | 2008-04-12 11:22:18 -0700 (Sat, 12 Apr 2008) | 1 line
  
  sp_accept_owner added.
........
  r44354 | grafik | 2008-04-12 12:44:47 -0700 (Sat, 12 Apr 2008) | 1 line
  
  Add multiple requirements for toolset subconditions instead of one composite as they are not supported for conditional requirements. Thanks to Roland for finding the problem.
........
  r44355 | hkaiser | 2008-04-12 16:58:29 -0700 (Sat, 12 Apr 2008) | 1 line
  
  Changed copyright, started to apply changes for switching namespaces.
........
  r44356 | djowel | 2008-04-12 17:15:11 -0700 (Sat, 12 Apr 2008) | 1 line
  
  added flat forwarding headers
........
  r44357 | djowel | 2008-04-12 17:39:00 -0700 (Sat, 12 Apr 2008) | 1 line
  
  added flat forwarding headers
........
  r44358 | djowel | 2008-04-12 17:54:10 -0700 (Sat, 12 Apr 2008) | 1 line
  
  adding spirit2
........
  r44359 | djowel | 2008-04-12 18:52:31 -0700 (Sat, 12 Apr 2008) | 1 line
  
  spirit2 ! :)
........
  r44360 | djowel | 2008-04-12 20:02:30 -0700 (Sat, 12 Apr 2008) | 1 line
  
  spirit2 ! :)
........
  r44361 | djowel | 2008-04-12 20:17:57 -0700 (Sat, 12 Apr 2008) | 1 line
  
  spirit2 ! :)
........
  r44367 | andreas_huber69 | 2008-04-13 06:57:42 -0700 (Sun, 13 Apr 2008) | 1 line
  
  Changed the PingPong example to demonstrate how the inner workings of an asynchronous_state_machine<> subclass can be hidden.
........
  r44369 | pdimov | 2008-04-13 08:35:40 -0700 (Sun, 13 Apr 2008) | 1 line
  
  Honor BOOST_DISABLE_THREADS; route GCC/ARM to the spinlock implementation; fall back to the spinlock implementation instead of using pthread_mutex.
........
  r44370 | anthonyw | 2008-04-13 08:50:08 -0700 (Sun, 13 Apr 2008) | 1 line
  
  Added extended adopt/defer/try constructors to upgrade_lock
........
  r44371 | hkaiser | 2008-04-13 09:28:27 -0700 (Sun, 13 Apr 2008) | 1 line
  
  Fixed Spirit Classic namespace switching.
........
  r44372 | emildotchevski | 2008-04-13 10:07:26 -0700 (Sun, 13 Apr 2008) | 1 line
  
  minor compile error fix
........
  r44374 | hkaiser | 2008-04-13 15:00:04 -0700 (Sun, 13 Apr 2008) | 1 line
  
  Added SpiritV2 test suite to regression tests.
........
  r44376 | grafik | 2008-04-13 15:12:12 -0700 (Sun, 13 Apr 2008) | 1 line
  
  Move array test into canonical test subdir structure.
........
  r44377 | grafik | 2008-04-13 15:24:41 -0700 (Sun, 13 Apr 2008) | 1 line
  
  Move crc test into canonical test subdir structure.
........


[SVN r44393]
2008-04-14 05:18:26 +00:00

871 lines
32 KiB
C++

/*
*
* 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;
};
}
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 size_type 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> >();
size_type 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> match_results_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 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;
unsigned 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_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_type*>::value));
BOOST_STATIC_ASSERT((::boost::is_same<rit_reference, const match_results_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> 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> 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> m_smatch;
RegexConcept();
RegexConcept(const RegexConcept&);
RegexConcept& operator=(const RegexConcept&);
};
#ifndef BOOST_REGEX_TEST_STD
//
// 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 global_regex_namespace::sub_match<BidiIterator> sub_match_type;
typedef global_regex_namespace::match_results<BidiIterator> match_results_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);
#ifndef BOOST_NO_STD_LOCALE
m_stream << m_sub;
m_stream << m_cresults;
#endif
}
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;
BoostRegexConcept();
BoostRegexConcept(const BoostRegexConcept&);
BoostRegexConcept& operator=(const BoostRegexConcept&);
};
#endif // BOOST_REGEX_TEST_STD
}
#endif