blob: 15bb7ba2b8880baa823c26e817603178160d9f81 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// 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