/usr/include/boost/xpressive/detail/static
Edit: /usr/include/boost/xpressive/detail/static/width_of.hpp (8960B)
///////////////////////////////////////////////////////////////////////////////
// width_of.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_STATIC_WIDTH_OF_HPP_EAN_10_04_2005
#define BOOST_XPRESSIVE_DETAIL_STATIC_WIDTH_OF_HPP_EAN_10_04_2005
// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace boost { namespace xpressive { namespace detail
{
template
struct width_of;
///////////////////////////////////////////////////////////////////////////////
// add_widths
//
template
struct add_widths
: mpl::size_t
{};
template
struct add_widths
: unknown_width
{};
template
struct add_widths
: unknown_width
{};
template<>
struct add_widths
: unknown_width
{};
///////////////////////////////////////////////////////////////////////////////
// or_widths
//
template
struct or_widths
: unknown_width
{};
template
struct or_widths
: mpl::size_t
{};
///////////////////////////////////////////////////////////////////////////////
// width_of_terminal
//
template::value>
struct width_of_terminal
: mpl::size_t // xpressive literals
{};
template
struct width_of_terminal
: unknown_width // unknown literals (eg, basic_string, basic_regex, etc.)
{};
template
struct width_of_terminal
: mpl::size_t<1> // char literals
{};
template
struct width_of_terminal
: mpl::size_t<1> // char literals
{};
template<>
struct width_of_terminal
: mpl::size_t<1> // char literals
{};
template
struct width_of_terminal
: mpl::size_t::value> // string literals
{};
template
struct width_of_terminal
: mpl::size_t::value> // string literals
{};
///////////////////////////////////////////////////////////////////////////////
// width_of
//
template
struct width_of
{};
template
struct width_of
: width_of_terminal::type, Char>
{};
template
struct width_of
: add_widths<
width_of::type::proto_base_expr, Char>::value
, width_of::type::proto_base_expr, Char>::value
>
{};
template
struct width_of
: or_widths<
width_of::type::proto_base_expr, Char>::value
, width_of::type::proto_base_expr, Char>::value
>
{};
template
struct width_of_assign
{};
template
struct width_of_assign
: width_of::type::proto_base_expr, Char>
{};
template
struct width_of_assign
: mpl::size_t<1>
{};
template
struct width_of_assign >
: unknown_width
{};
// either (s1 = ...) or (a1 = ...) or (set = ...)
template
struct width_of
: width_of_assign<
Expr
, Char
, typename proto::result_of::value<
typename remove_reference::type::proto_base_expr
>::type
>
{};
template
struct width_of
: width_of::type::proto_base_expr, Char>
{};
template
struct width_of
: mpl::size_t<0>
{};
template
struct width_of
: mpl::size_t<0>
{};
// keep() is used to turn off backtracking, so they should only be used
// for things that are variable-width (eg. quantified)
template
struct width_of
: unknown_width
{
// TODO: keep() now has a second meaning: execute actions immediately.
// In that sense, it is perfectly reasonable to put a fixed-width
// sub-expression in a keep. Can fixed-width keep() sub-expressions
// use the simple_repeat_matcher?
};
template
struct width_of
: unknown_width
{};
template
struct width_of
: unknown_width
{};
template
struct width_of
: unknown_width
{};
template
struct width_of >
: unknown_width
{};
template
struct width_of >
: mpl::if_c<
mpl::equal_to::type::proto_base_expr, Char> >::value
, unknown_width
, mpl::times<
width_of::type::proto_base_expr, Char>
, mpl::size_t
>
>::type
{};
template
struct width_of
: width_of::type::proto_base_expr, Char>
{};
// when complementing a set or an assertion, the width is that of the set (1) or the assertion (0)
template
struct width_of
: width_of::type::proto_base_expr, Char>
{};
// The comma is used in list-initialized sets, and the width of sets are 1
template
struct width_of
: mpl::size_t<1>
{};
// The subscript operator[] is used for sets, as in set['a' | range('b','h')],
// or for actions as in (any >> expr)[ action ]
template
struct width_of_subscript
: width_of
{};
template
struct width_of_subscript
: mpl::size_t<1>
{
// If Left is "set" then make sure that Right has a width_of 1
BOOST_MPL_ASSERT_RELATION(
1
, ==
, (width_of::type::proto_base_expr, Char>::value));
};
template
struct width_of
: width_of_subscript::type::proto_base_expr>
{};
}}} // namespace boost::xpressive::detail
#undef UNREF
#endif