88 lines
2.6 KiB
C++
88 lines
2.6 KiB
C++
// Copyright (c) 2001-2008 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_SUPPORT_CONFIX_AUG_19_2008_1103AM)
|
|
#define BOOST_SPIRIT_SUPPORT_CONFIX_AUG_19_2008_1103AM
|
|
|
|
#include <boost/spirit/home/support/placeholders.hpp>
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
namespace boost { namespace spirit { namespace tag
|
|
{
|
|
// This is the tag returned by the confix() function
|
|
template <typename Prefix, typename Suffix>
|
|
struct confix_tag
|
|
{
|
|
Prefix prefix;
|
|
Suffix suffix;
|
|
};
|
|
|
|
}}}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
namespace boost { namespace spirit
|
|
{
|
|
///////////////////////////////////////////////////////////////////////////
|
|
template <typename Prefix, typename Suffix = Prefix>
|
|
struct confix_spec
|
|
: proto::terminal<tag::confix_tag<Prefix, Suffix> >::type
|
|
{
|
|
private:
|
|
typedef typename
|
|
proto::terminal<tag::confix_tag<Prefix, Suffix> >::type
|
|
base_type;
|
|
|
|
base_type make_tag(Prefix const& prefix, Suffix const& suffix) const
|
|
{
|
|
base_type xpr = {{prefix, suffix}};
|
|
return xpr;
|
|
}
|
|
|
|
public:
|
|
confix_spec(Prefix const& prefix, Suffix const& suffix)
|
|
: base_type(make_tag(prefix, suffix))
|
|
{}
|
|
};
|
|
|
|
namespace detail
|
|
{
|
|
struct confix_extractor
|
|
{
|
|
template <typename Prefix, typename Suffix>
|
|
static Prefix const& prefix(tag::confix_tag<Prefix, Suffix> const& c)
|
|
{ return c.prefix; }
|
|
|
|
template <typename Prefix, typename Suffix>
|
|
static Suffix const& suffix(tag::confix_tag<Prefix, Suffix> const& c)
|
|
{ return c.suffix; }
|
|
};
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// construct a confix component
|
|
///////////////////////////////////////////////////////////////////////////
|
|
inline confix_spec<char const*>
|
|
confix(char const* prefix, char const* suffix)
|
|
{
|
|
return confix_spec<char const*>(prefix, suffix);
|
|
}
|
|
|
|
inline confix_spec<wchar_t const*>
|
|
confix(wchar_t const* prefix, wchar_t const* suffix)
|
|
{
|
|
return confix_spec<wchar_t const*>(prefix, suffix);
|
|
}
|
|
|
|
template <typename Prefix, typename Suffix>
|
|
inline confix_spec<Prefix, Suffix>
|
|
confix(Prefix const& prefix, Suffix const& suffix)
|
|
{
|
|
return confix_spec<Prefix, Suffix>(prefix, suffix);
|
|
}
|
|
|
|
}}
|
|
|
|
#endif
|