Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // is_pure.hpp Chris@16: // Chris@16: // Copyright 2008 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_XPRESSIVE_DETAIL_STATIC_IS_PURE_HPP_EAN_10_04_2005 Chris@16: #define BOOST_XPRESSIVE_DETAIL_STATIC_IS_PURE_HPP_EAN_10_04_2005 Chris@16: Chris@16: // MS compatible compilers support #pragma once Chris@101: #if defined(_MSC_VER) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace xpressive { namespace detail Chris@16: { Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // use_simple_repeat_terminal Chris@16: // Chris@16: template::value> Chris@16: struct use_simple_repeat_terminal Chris@16: : mpl::bool_< Chris@16: Expr::quant == quant_fixed_width Chris@16: || (Expr::width != unknown_width::value && Expr::pure) Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_terminal Chris@16: : mpl::true_ // char literals, string literals, etc. Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_terminal >, Char, false> Chris@16: : mpl::false_ // basic_regex Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_terminal >, Char, false> Chris@16: : mpl::false_ // basic_regex Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_terminal const>, Char, false> Chris@16: : mpl::false_ // basic_regex Chris@16: {}; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // use_simple_repeat_ Chris@16: // Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : use_simple_repeat_terminal::type, Char> Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : mpl::and_< Chris@16: use_simple_repeat_::type::proto_base_expr, Char> Chris@16: , use_simple_repeat_::type::proto_base_expr, Char> Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : mpl::and_< Chris@16: mpl::not_equal_to > Chris@16: , use_simple_repeat_::type::proto_base_expr, Char> Chris@16: , use_simple_repeat_::type::proto_base_expr, Char> Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_assign Chris@16: {}; Chris@16: Chris@16: template<> Chris@16: struct use_simple_repeat_assign Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: template<> Chris@16: struct use_simple_repeat_assign Chris@16: : mpl::true_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_assign > Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: // either (s1 = ...) or (a1 = ...) or (set = ...) Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : use_simple_repeat_assign< Chris@16: typename proto::result_of::value< Chris@16: typename remove_reference::type::proto_base_expr Chris@16: >::type Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : use_simple_repeat_::type::proto_base_expr, Char> Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: // when complementing a set or an assertion, the purity is that of the set (true) or the assertion Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : use_simple_repeat_::type::proto_base_expr, Char> Chris@16: {}; Chris@16: Chris@16: // The comma is used in list-initialized sets, which are pure Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : mpl::true_ Chris@16: {}; Chris@16: Chris@16: // The subscript operator[] is used for sets, as in set['a' | range('b','h')] Chris@16: // It is also used for actions, which by definition have side-effects and thus are impure Chris@16: template Chris@16: struct use_simple_repeat_subscript Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_subscript Chris@16: : mpl::true_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : use_simple_repeat_subscript::type::proto_base_expr> Chris@16: {}; Chris@16: Chris@16: // Quantified expressions are variable-width and cannot use the simple quantifier Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ > Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ > Chris@16: : use_simple_repeat_::type::proto_base_expr, Char> Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat_ Chris@16: : use_simple_repeat_::type::proto_base_expr, Char> Chris@16: {}; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // use_simple_repeat Chris@16: // Chris@16: template Chris@16: struct use_simple_repeat Chris@16: : use_simple_repeat_ Chris@16: { Chris@16: // should never try to repeat something of 0-width Chris@16: BOOST_MPL_ASSERT_RELATION(0, !=, (width_of::value)); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct use_simple_repeat Chris@16: : use_simple_repeat_ Chris@16: { Chris@16: // should never try to repeat something of 0-width Chris@16: BOOST_MPL_ASSERT_RELATION(0, !=, (width_of::value)); Chris@16: }; Chris@16: Chris@16: }}} // namespace boost::xpressive::detail Chris@16: Chris@16: #endif