You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
4.3 KiB
130 lines
4.3 KiB
3 years ago
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// 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)
|
||
|
# 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
|