Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/xpressive/basic_regex.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/xpressive/basic_regex.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,295 @@ +/////////////////////////////////////////////////////////////////////////////// +/// \file basic_regex.hpp +/// Contains the definition of the basic_regex\<\> class template and its +/// associated helper functions. +// +// Copyright 2008 Eric Niebler. Distributed under 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) + +#ifndef BOOST_XPRESSIVE_BASIC_REGEX_HPP_EAN_10_04_2005 +#define BOOST_XPRESSIVE_BASIC_REGEX_HPP_EAN_10_04_2005 + +// MS compatible compilers support #pragma once +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +# pragma once +#endif + +#include <boost/config.hpp> +#include <boost/mpl/bool.hpp> +#include <boost/xpressive/xpressive_fwd.hpp> +#include <boost/xpressive/regex_constants.hpp> +#include <boost/xpressive/detail/detail_fwd.hpp> +#include <boost/xpressive/detail/core/regex_impl.hpp> +#include <boost/xpressive/detail/core/regex_domain.hpp> + +// Doxygen can't handle proto :-( +#ifndef BOOST_XPRESSIVE_DOXYGEN_INVOKED +# include <boost/xpressive/detail/static/grammar.hpp> +# include <boost/proto/extends.hpp> +#endif + +#if BOOST_XPRESSIVE_HAS_MS_STACK_GUARD +# include <excpt.h> // for _exception_code() +# include <malloc.h> // for _resetstkoflw() +#endif + +namespace boost { namespace xpressive +{ + +namespace detail +{ + inline void throw_on_stack_error(bool stack_error) + { + BOOST_XPR_ENSURE_(!stack_error, regex_constants::error_stack, "Regex stack space exhausted"); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// basic_regex +// +/// \brief Class template basic_regex\<\> is a class for holding a compiled regular expression. +template<typename BidiIter> +struct basic_regex + : proto::extends< + proto::expr<proto::tag::terminal, proto::term<detail::tracking_ptr<detail::regex_impl<BidiIter> > >, 0> + , basic_regex<BidiIter> + , detail::regex_domain + > +{ +private: + typedef proto::expr<proto::tag::terminal, proto::term<detail::tracking_ptr<detail::regex_impl<BidiIter> > >, 0> pimpl_type; + typedef proto::extends<pimpl_type, basic_regex<BidiIter>, detail::regex_domain> base_type; + +public: + typedef BidiIter iterator_type; + typedef typename iterator_value<BidiIter>::type char_type; + // For compatibility with std::basic_regex + typedef typename iterator_value<BidiIter>::type value_type; + typedef typename detail::string_type<char_type>::type string_type; + typedef regex_constants::syntax_option_type flag_type; + + BOOST_STATIC_CONSTANT(regex_constants::syntax_option_type, ECMAScript = regex_constants::ECMAScript); + BOOST_STATIC_CONSTANT(regex_constants::syntax_option_type, icase = regex_constants::icase_); + BOOST_STATIC_CONSTANT(regex_constants::syntax_option_type, nosubs = regex_constants::nosubs); + BOOST_STATIC_CONSTANT(regex_constants::syntax_option_type, optimize = regex_constants::optimize); + BOOST_STATIC_CONSTANT(regex_constants::syntax_option_type, collate = regex_constants::collate); + BOOST_STATIC_CONSTANT(regex_constants::syntax_option_type, single_line = regex_constants::single_line); + BOOST_STATIC_CONSTANT(regex_constants::syntax_option_type, not_dot_null = regex_constants::not_dot_null); + BOOST_STATIC_CONSTANT(regex_constants::syntax_option_type, not_dot_newline = regex_constants::not_dot_newline); + BOOST_STATIC_CONSTANT(regex_constants::syntax_option_type, ignore_white_space = regex_constants::ignore_white_space); + + /// \post regex_id() == 0 + /// \post mark_count() == 0 + basic_regex() + : base_type() + { + } + + /// \param that The basic_regex object to copy. + /// \post regex_id() == that.regex_id() + /// \post mark_count() == that.mark_count() + basic_regex(basic_regex<BidiIter> const &that) + : base_type(that) + { + } + + /// \param that The basic_regex object to copy. + /// \post regex_id() == that.regex_id() + /// \post mark_count() == that.mark_count() + /// \return *this + basic_regex<BidiIter> &operator =(basic_regex<BidiIter> const &that) + { + proto::value(*this) = proto::value(that); + return *this; + } + + /// Construct from a static regular expression. + /// + /// \param expr The static regular expression + /// \pre Expr is the type of a static regular expression. + /// \post regex_id() != 0 + /// \post mark_count() \>= 0 + template<typename Expr> + basic_regex(Expr const &expr) + : base_type() + { + BOOST_XPRESSIVE_CHECK_REGEX(Expr, char_type); + this->compile_(expr, is_valid_regex<Expr, char_type>()); + } + + /// Construct from a static regular expression. + /// + /// \param expr The static regular expression. + /// \pre Expr is the type of a static regular expression. + /// \post regex_id() != 0 + /// \post mark_count() \>= 0 + /// \throw std::bad_alloc on out of memory + /// \return *this + template<typename Expr> + basic_regex<BidiIter> &operator =(Expr const &expr) + { + BOOST_XPRESSIVE_CHECK_REGEX(Expr, char_type); + this->compile_(expr, is_valid_regex<Expr, char_type>()); + return *this; + } + + /// Returns the count of capturing sub-expressions in this regular expression + /// + std::size_t mark_count() const + { + return proto::value(*this) ? proto::value(*this)->mark_count_ : 0; + } + + /// Returns a token which uniquely identifies this regular expression. + /// + regex_id_type regex_id() const + { + return proto::value(*this) ? proto::value(*this)->xpr_.get() : 0; + } + + /// Swaps the contents of this basic_regex object with another. + /// + /// \param that The other basic_regex object. + /// \attention This is a shallow swap that does not do reference tracking. + /// If you embed a basic_regex object by reference in another + /// regular expression and then swap its contents with another + /// basic_regex object, the change will not be visible to the + /// enclosing regular expression. It is done this way to ensure + /// that swap() cannot throw. + /// \throw nothrow + void swap(basic_regex<BidiIter> &that) // throw() + { + proto::value(*this).swap(proto::value(that)); + } + + /// Factory method for building a regex object from a range of characters. + /// Equivalent to regex_compiler\< BidiIter \>().compile(begin, end, flags); + /// + /// \param begin The beginning of a range of characters representing the + /// regular expression to compile. + /// \param end The end of a range of characters representing the + /// regular expression to compile. + /// \param flags Optional bitmask that determines how the pat string is + /// interpreted. (See syntax_option_type.) + /// \return A basic_regex object corresponding to the regular expression + /// represented by the character range. + /// \pre [begin,end) is a valid range. + /// \pre The range of characters specified by [begin,end) contains a + /// valid string-based representation of a regular expression. + /// \throw regex_error when the range of characters has invalid regular + /// expression syntax. + template<typename InputIter> + static basic_regex<BidiIter> compile(InputIter begin, InputIter end, flag_type flags = regex_constants::ECMAScript) + { + return regex_compiler<BidiIter>().compile(begin, end, flags); + } + + /// \overload + /// + template<typename InputRange> + static basic_regex<BidiIter> compile(InputRange const &pat, flag_type flags = regex_constants::ECMAScript) + { + return regex_compiler<BidiIter>().compile(pat, flags); + } + + /// \overload + /// + static basic_regex<BidiIter> compile(char_type const *begin, flag_type flags = regex_constants::ECMAScript) + { + return regex_compiler<BidiIter>().compile(begin, flags); + } + + /// \overload + /// + static basic_regex<BidiIter> compile(char_type const *begin, std::size_t len, flag_type flags) + { + return regex_compiler<BidiIter>().compile(begin, len, flags); + } + +private: + friend struct detail::core_access<BidiIter>; + + // Avoid a common programming mistake. Construction from a string is + // ambiguous. It could mean: + // sregex rx = sregex::compile(str); // compile the string into a regex + // or + // sregex rx = as_xpr(str); // treat the string as a literal + // Since there is no easy way to disambiguate, it is disallowed. You must + // say what you mean. + + /// INTERNAL ONLY + basic_regex(char_type const *); + /// INTERNAL ONLY + basic_regex(string_type const &); + + /// INTERNAL ONLY + bool match_(detail::match_state<BidiIter> &state) const + { + #if BOOST_XPRESSIVE_HAS_MS_STACK_GUARD + bool success = false, stack_error = false; + __try + { + success = proto::value(*this)->xpr_->match(state); + } + __except(_exception_code() == 0xC00000FDUL) + { + stack_error = true; + _resetstkoflw(); + } + detail::throw_on_stack_error(stack_error); + return success; + #else + return proto::value(*this)->xpr_->match(state); + #endif + } + + // Compiles valid static regexes into a state machine. + /// INTERNAL ONLY + template<typename Expr> + void compile_(Expr const &expr, mpl::true_) + { + detail::static_compile(expr, proto::value(*this).get()); + } + + // No-op for invalid static regexes. + /// INTERNAL ONLY + template<typename Expr> + void compile_(Expr const &, mpl::false_) + { + } +}; + +#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION +template<typename BidiIter> regex_constants::syntax_option_type const basic_regex<BidiIter>::ECMAScript; +template<typename BidiIter> regex_constants::syntax_option_type const basic_regex<BidiIter>::icase; +template<typename BidiIter> regex_constants::syntax_option_type const basic_regex<BidiIter>::nosubs; +template<typename BidiIter> regex_constants::syntax_option_type const basic_regex<BidiIter>::optimize; +template<typename BidiIter> regex_constants::syntax_option_type const basic_regex<BidiIter>::collate; +template<typename BidiIter> regex_constants::syntax_option_type const basic_regex<BidiIter>::single_line; +template<typename BidiIter> regex_constants::syntax_option_type const basic_regex<BidiIter>::not_dot_null; +template<typename BidiIter> regex_constants::syntax_option_type const basic_regex<BidiIter>::not_dot_newline; +template<typename BidiIter> regex_constants::syntax_option_type const basic_regex<BidiIter>::ignore_white_space; +#endif + +/////////////////////////////////////////////////////////////////////////////// +// swap +/// \brief Swaps the contents of two basic_regex objects. +/// \param left The first basic_regex object. +/// \param right The second basic_regex object. +/// \attention This is a shallow swap that does not do reference tracking. +/// If you embed a basic_regex object by reference in another +/// regular expression and then swap its contents with another +/// basic_regex object, the change will not be visible to the +/// enclosing regular expression. It is done this way to ensure +/// that swap() cannot throw. +/// \throw nothrow +template<typename BidiIter> +inline void swap(basic_regex<BidiIter> &left, basic_regex<BidiIter> &right) // throw() +{ + left.swap(right); +} + +}} // namespace boost::xpressive + +#endif // BOOST_XPRESSIVE_BASIC_REGEX_HPP_EAN_10_04_2005