/usr/include/boost/spirit/home/karma/string
Edit: /usr/include/boost/spirit/home/karma/string/lit.hpp (12686B)
// Copyright (c) 2001-2011 Hartmut Kaiser
// Copyright (c) 2010 Bryce Lelbach
//
// 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_KARMA_LIT_FEB_22_2007_0534PM)
#define BOOST_SPIRIT_KARMA_LIT_FEB_22_2007_0534PM
#if defined(_MSC_VER)
#pragma once
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
///////////////////////////////////////////////////////////////////////////////
namespace boost { namespace spirit
{
///////////////////////////////////////////////////////////////////////////
// Enablers
///////////////////////////////////////////////////////////////////////////
template
struct use_terminal > // enables string
: mpl::true_ {};
template
struct use_terminal >::type> // enables string literals
: mpl::true_ {};
template
struct use_terminal // enables string(str)
, fusion::vector1 >
> : traits::is_string {};
template // enables string(f)
struct use_lazy_terminal<
karma::domain
, tag::char_code
, 1 /*arity*/
> : mpl::true_ {};
// enables lit(str)
template
struct use_terminal >
, typename enable_if >::type>
: mpl::true_ {};
}}
///////////////////////////////////////////////////////////////////////////////
namespace boost { namespace spirit { namespace karma
{
#ifndef BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
using spirit::lit;
#endif
using spirit::lit_type;
///////////////////////////////////////////////////////////////////////////
// generate literal strings from a given parameter
///////////////////////////////////////////////////////////////////////////
template
struct any_string
: primitive_generator >
{
typedef typename CharEncoding::char_type char_type;
typedef CharEncoding char_encoding;
template
struct attribute
{
typedef std::basic_string type;
};
// lit has an attached attribute
template
static bool
generate(OutputIterator& sink, Context& context, Delimiter const& d,
Attribute const& attr)
{
if (!traits::has_optional_value(attr))
return false;
typedef typename attribute::type attribute_type;
return
karma::detail::string_generate(sink
, traits::extract_from(attr, context)
, char_encoding(), Tag()) &&
karma::delimit_out(sink, d); // always do post-delimiting
}
// this lit has no attribute attached, it needs to have been
// initialized from a direct literal
template
static bool generate(OutputIterator&, Context&, Delimiter const&,
unused_type const&)
{
// It is not possible (doesn't make sense) to use string without
// providing any attribute, as the generator doesn't 'know' what
// character to output. The following assertion fires if this
// situation is detected in your code.
BOOST_SPIRIT_ASSERT_FAIL(OutputIterator, string_not_usable_without_attribute, ());
return false;
}
template
static info what(Context const& /*context*/)
{
return info("any-string");
}
};
///////////////////////////////////////////////////////////////////////////
// generate literal strings
///////////////////////////////////////////////////////////////////////////
template
struct literal_string
: primitive_generator >
{
typedef CharEncoding char_encoding;
typedef typename
remove_const::type>::type
char_type;
typedef std::basic_string string_type;
template
struct attribute
: mpl::if_c
{};
literal_string(typename add_reference::type str)
: str_(str)
{}
// A string("...") which additionally has an associated attribute emits
// its immediate literal only if it matches the attribute, otherwise
// it fails.
template <
typename OutputIterator, typename Context, typename Delimiter
, typename Attribute>
bool generate(OutputIterator& sink, Context& context
, Delimiter const& d, Attribute const& attr) const
{
if (!traits::has_optional_value(attr))
return false;
// fail if attribute isn't matched by immediate literal
typedef typename attribute::type attribute_type;
using spirit::traits::get_c_string;
if (!detail::string_compare(
get_c_string(
traits::extract_from(attr, context))
, get_c_string(str_), char_encoding(), Tag()))
{
return false;
}
return detail::string_generate(sink, str_, char_encoding(), Tag()) &&
karma::delimit_out(sink, d); // always do post-delimiting
}
// A string("...") without any associated attribute just emits its
// immediate literal
template
bool generate(OutputIterator& sink, Context&, Delimiter const& d
, unused_type) const
{
return detail::string_generate(sink, str_, char_encoding(), Tag()) &&
karma::delimit_out(sink, d); // always do post-delimiting
}
template
info what(Context const& /*context*/) const
{
return info("literal-string", str_);
}
string_type str_;
};
///////////////////////////////////////////////////////////////////////////
// Generator generators: make_xxx function (objects)
///////////////////////////////////////////////////////////////////////////
// string
template
struct make_primitive<
tag::char_code
, Modifiers>
{
static bool const lower =
has_modifier >::value;
static bool const upper =
has_modifier >::value;
typedef any_string<
typename spirit::detail::get_encoding_with_case<
Modifiers, CharEncoding, lower || upper>::type
, typename detail::get_casetag::type
> result_type;
result_type operator()(unused_type, unused_type) const
{
return result_type();
}
};
// string literal
template
struct make_primitive >::type>
{
static bool const lower =
has_modifier >::value;
static bool const upper =
has_modifier >::value;
typedef typename add_const::type const_string;
typedef literal_string<
const_string
, typename spirit::detail::get_encoding_with_case<
Modifiers, unused_type, lower || upper>::type
, typename detail::get_casetag::type
, true
> result_type;
result_type operator()(
typename add_reference::type str, unused_type) const
{
return result_type(str);
}
};
///////////////////////////////////////////////////////////////////////////
namespace detail
{
template
struct make_string_direct
{
static bool const lower =
has_modifier >::value;
static bool const upper =
has_modifier >::value;
typedef typename add_const::type const_string;
typedef literal_string<
const_string
, typename spirit::detail::get_encoding_with_case<
Modifiers, unused_type, lower || upper>::type
, typename detail::get_casetag::type
, no_attribute
> result_type;
template
result_type operator()(Terminal const& term, unused_type) const
{
return result_type(fusion::at_c<0>(term.args));
}
};
}
// string("..."), lit("...")
template
struct make_primitive<
terminal_ex<
tag::char_code
, fusion::vector1 >
, Modifiers>
: detail::make_string_direct
{};
template
struct make_primitive<
terminal_ex >
, Modifiers
, typename enable_if >::type>
: detail::make_string_direct<
typename traits::char_encoding_from_char<
typename traits::char_type_of::type>::type
, Modifiers, A0, true>
{};
}}} // namespace boost::spirit::karma
namespace boost { namespace spirit { namespace traits
{
///////////////////////////////////////////////////////////////////////////
template
struct handles_container, Attribute
, Context, Iterator>
: mpl::false_ {};
template
struct handles_container, Attribute, Context, Iterator>
: mpl::false_ {};
}}}
#endif