blob: a43b124141700c2cd9bf9f86d25d1ee957518b61 [file] [log] [blame]
// Copyright (c) 2001-2009 Hartmut Kaiser
//
// 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)
#if !defined(BOOST_SPIRIT_LEX_IN_STATE_OCT_09_2007_0748PM)
#define BOOST_SPIRIT_LEX_IN_STATE_OCT_09_2007_0748PM
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once // MS compatible compilers support #pragma once
#endif
#include <boost/proto/core.hpp>
///////////////////////////////////////////////////////////////////////////////
namespace boost { namespace spirit { namespace qi
{
///////////////////////////////////////////////////////////////////////////
// This is the tag returned by the in_state function
template <typename String>
struct in_state_tag
{
String name;
};
///////////////////////////////////////////////////////////////////////////
// These are the different overloads allowed for the in_state(...)
// construct
///////////////////////////////////////////////////////////////////////////
inline proto::terminal<in_state_tag<char const*> >::type
in_state(char const *s)
{
proto::terminal<in_state_tag<char const*> >::type that = {{s}};
return that;
}
inline proto::terminal<in_state_tag<wchar_t const*> >::type
in_state(wchar_t const *s)
{
proto::terminal<in_state_tag<wchar_t const*> >::type that = {{s}};
return that;
}
template <typename Char, typename Traits, typename Allocator>
inline typename proto::terminal<in_state_tag<Char const*> >::type
in_state(std::basic_string<Char, Traits, Allocator> const& s)
{
typedef std::basic_string<Char, Traits, Allocator> string_type;
typename proto::terminal<in_state_tag<string_type> >::type that;
that.s = s;
return that;
}
///////////////////////////////////////////////////////////////////////////
// The following is a helper template allowing to use the in_state()[] as
// a skip parser
///////////////////////////////////////////////////////////////////////////
template <typename Skipper, typename String = char const*>
struct in_state_skipper;
template <typename Skipper>
struct in_state_skipper<Skipper, char const*>
: proto::subscript<
typename proto::terminal<in_state_tag<char const*> >::type,
Skipper
>::type
{};
template <typename Skipper>
struct in_state_skipper<Skipper, wchar_t const*>
: proto::subscript<
typename proto::terminal<in_state_tag<wchar_t const*> >::type,
Skipper
>::type
{};
template <typename Skipper, typename Char, typename Traits, typename Allocator>
struct in_state_skipper<Skipper, std::basic_string<Char, Traits, Allocator> >
: proto::subscript<
typename proto::terminal<in_state_tag<Char const*> >::type,
Skipper
>::type
{};
}}}
#endif