| /////////////////////////////////////////////////////////////////////////////// |
| // quant_style.hpp |
| // |
| // 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_DETAIL_CORE_QUANT_STYLE_HPP_EAN_10_04_2005 |
| #define BOOST_XPRESSIVE_DETAIL_CORE_QUANT_STYLE_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/has_xxx.hpp> |
| #include <boost/xpressive/detail/utility/width.hpp> |
| #include <boost/xpressive/detail/detail_fwd.hpp> |
| |
| namespace boost { namespace xpressive { namespace detail |
| { |
| |
| BOOST_MPL_HAS_XXX_TRAIT_DEF(is_boost_xpressive_xpression_) |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // is_xpr |
| // |
| template<typename Xpr> |
| struct is_xpr |
| : has_is_boost_xpressive_xpression_<Xpr> |
| {}; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // quant_enum |
| // |
| enum quant_enum |
| { |
| quant_none, |
| quant_fixed_width, |
| quant_variable_width |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // quant_style |
| // |
| template<quant_enum QuantStyle, std::size_t Width = unknown_width::value, bool Pure = true> |
| struct quant_style |
| { |
| typedef void is_boost_xpressive_xpression_; |
| |
| // Which quantification strategy to use? |
| BOOST_STATIC_CONSTANT(int, quant = QuantStyle); |
| |
| // how many characters this matcher consumes |
| BOOST_STATIC_CONSTANT(std::size_t, width = Width); |
| |
| // whether this matcher has observable side-effects |
| BOOST_STATIC_CONSTANT(bool, pure = Pure); |
| |
| static detail::width get_width() |
| { |
| return width; |
| } |
| }; |
| |
| #define BOOST_XPR_QUANT_STYLE(Style, Width, Pure) \ |
| typedef void is_boost_xpressive_xpression_; \ |
| BOOST_STATIC_CONSTANT(int, quant = Style); \ |
| BOOST_STATIC_CONSTANT(std::size_t, width = Width); \ |
| BOOST_STATIC_CONSTANT(bool, pure = Pure); \ |
| static detail::width get_width() { return width; } \ |
| /**/ |
| |
| // // Replace transmogrify stupidity with rebindable matchers/placeholders |
| //#define BOOST_XPR_IDENTITY_REBIND(TYPE) \/ |
| // template<typename BidiIter, typename ICase, typename Traits> \/ |
| // struct rebind \/ |
| // { \/ |
| // typedef TYPE type; \/ |
| // }; \/ |
| // /**/ |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // quant_style_none |
| // this sub-expression cannot be quantified |
| typedef quant_style<quant_none> quant_style_none; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // quant_style_fixed_unknown_width |
| // this sub-expression is fixed width for the purpose of quantification, but |
| // the width cannot be determined at compile time. An example would be the |
| // string_matcher or the mark_matcher. |
| typedef quant_style<quant_fixed_width> quant_style_fixed_unknown_width; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // quant_style_variable_width |
| // this sub-expression can match a variable number of characters |
| typedef quant_style<quant_variable_width> quant_style_variable_width; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // quant_style_fixed_width |
| // for when the sub-expression has a fixed width that is known at compile time |
| template<std::size_t Width> |
| struct quant_style_fixed_width |
| : quant_style<quant_fixed_width, Width> |
| { |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // quant_style_assertion |
| // a zero-width assertion. |
| struct quant_style_assertion |
| : quant_style<quant_none, 0> |
| { |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // quant_type |
| // |
| template<typename Matcher> |
| struct quant_type |
| : mpl::int_<Matcher::quant> |
| { |
| }; |
| |
| }}} // namespace boost::xpressive::detail |
| |
| #endif |