118 lines
5.2 KiB
C++
118 lines
5.2 KiB
C++
|
// Copyright (c) 2001-2011 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_KARMA_BOOL_POLICIES_SEP_28_2009_1203PM)
|
||
|
#define BOOST_SPIRIT_KARMA_BOOL_POLICIES_SEP_28_2009_1203PM
|
||
|
|
||
|
#if defined(_MSC_VER)
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include <boost/spirit/home/support/char_class.hpp>
|
||
|
#include <boost/spirit/home/karma/generator.hpp>
|
||
|
#include <boost/spirit/home/karma/char.hpp>
|
||
|
#include <boost/spirit/home/karma/numeric/detail/numeric_utils.hpp>
|
||
|
|
||
|
namespace boost { namespace spirit { namespace karma
|
||
|
{
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// bool_policies, if you need special handling of your boolean output
|
||
|
// just overload this policy class and use it as a template
|
||
|
// parameter to the karma::bool_generator boolean generator
|
||
|
//
|
||
|
// struct special_bool_policy : karma::bool_policies<>
|
||
|
// {
|
||
|
// // we want to spell the names of false as eurt (true backwards)
|
||
|
// template <typename CharEncoding, typename Tag
|
||
|
// , typename OutputIterator>
|
||
|
// static bool generate_false(OutputIterator& sink, bool)
|
||
|
// {
|
||
|
// return string_inserter<CharEncoding, Tag>::call(sink, "eurt");
|
||
|
// }
|
||
|
// };
|
||
|
//
|
||
|
// typedef karma::bool_generator<special_bool_policy> backwards_bool;
|
||
|
//
|
||
|
// karma::generate(sink, backwards_bool(), false); // will output: eurt
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
template <typename T = bool>
|
||
|
struct bool_policies
|
||
|
{
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
// Expose the data type the generator is targeted at
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
typedef T value_type;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
// By default the policy doesn't require any special iterator
|
||
|
// functionality. The boolean generator exposes its properties
|
||
|
// from here, so this needs to be updated in case other properties
|
||
|
// need to be implemented.
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
typedef mpl::int_<generator_properties::no_properties> properties;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
// This is the main function used to generate the output for a
|
||
|
// boolean. It is called by the boolean generator in order
|
||
|
// to perform the conversion. In theory all of the work can be
|
||
|
// implemented here, but it is the easiest to use existing
|
||
|
// functionality provided by the type specified by the template
|
||
|
// parameter `Inserter`.
|
||
|
//
|
||
|
// sink: the output iterator to use for generation
|
||
|
// n: the floating point number to convert
|
||
|
// p: the instance of the policy type used to instantiate this
|
||
|
// floating point generator.
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
template <typename Inserter, typename OutputIterator, typename Policies>
|
||
|
static bool
|
||
|
call (OutputIterator& sink, T n, Policies const& p)
|
||
|
{
|
||
|
return Inserter::call_n(sink, n, p);
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
// Print the textual representations of a true boolean value
|
||
|
//
|
||
|
// sink The output iterator to use for generation
|
||
|
// b The boolean value to convert.
|
||
|
//
|
||
|
// The CharEncoding and Tag template parameters are either of the type
|
||
|
// unused_type or describes the character class and conversion to be
|
||
|
// applied to any output possibly influenced by either the lower[...]
|
||
|
// or upper[...] directives.
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
template <typename CharEncoding, typename Tag, typename OutputIterator>
|
||
|
static bool generate_true(OutputIterator& sink, T)
|
||
|
{
|
||
|
return string_inserter<CharEncoding, Tag>::call(sink, "true");
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
// Print the textual representations of a false boolean value
|
||
|
//
|
||
|
// sink The output iterator to use for generation
|
||
|
// b The boolean value to convert.
|
||
|
//
|
||
|
// The CharEncoding and Tag template parameters are either of the type
|
||
|
// unused_type or describes the character class and conversion to be
|
||
|
// applied to any output possibly influenced by either the lower[...]
|
||
|
// or upper[...] directives.
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////
|
||
|
template <typename CharEncoding, typename Tag, typename OutputIterator>
|
||
|
static bool generate_false(OutputIterator& sink, T)
|
||
|
{
|
||
|
return string_inserter<CharEncoding, Tag>::call(sink, "false");
|
||
|
}
|
||
|
};
|
||
|
|
||
|
}}}
|
||
|
|
||
|
#endif
|