blob: a5ccdfa8ff26ad25528b17ce460bd12acde30bfe [file] [log] [blame]
// 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_STRING_GENERATE_FEB_23_2007_1232PM)
#define BOOST_SPIRIT_KARMA_STRING_GENERATE_FEB_23_2007_1232PM
#if defined(_MSC_VER)
#pragma once
#endif
#include <string>
#include <boost/spirit/home/support/char_class.hpp>
#include <boost/spirit/home/karma/detail/generate_to.hpp>
#include <boost/range/const_iterator.hpp>
namespace boost { namespace spirit { namespace karma { namespace detail
{
///////////////////////////////////////////////////////////////////////////
// pass through character transformation
struct pass_through_filter
{
template <typename Char>
Char operator()(Char ch) const
{
return ch;
}
};
template <typename CharEncoding, typename Tag>
struct encoding_filter
{
template <typename Char>
Char operator()(Char ch) const
{
return spirit::char_class::convert<CharEncoding>::to(Tag(), ch);
}
};
///////////////////////////////////////////////////////////////////////////
// generate a string given by a std::string, applying the given filter
template <typename OutputIterator, typename Char, typename Filter>
inline bool string_generate(OutputIterator& sink, Char const* str
, Filter filter)
{
for (Char ch = *str; ch != 0; ch = *++str)
{
*sink = filter(ch);
++sink;
}
return detail::sink_is_good(sink);
}
template <typename OutputIterator, typename Container, typename Filter>
inline bool string_generate(OutputIterator& sink
, Container const& c, Filter filter)
{
typedef typename traits::container_iterator<Container const>::type
iterator;
iterator end = boost::end(c);
for (iterator it = boost::begin(c); it != end; ++it)
{
*sink = filter(*it);
++sink;
}
return detail::sink_is_good(sink);
}
///////////////////////////////////////////////////////////////////////////
// generate a string without any transformation
template <typename OutputIterator, typename Char>
inline bool string_generate(OutputIterator& sink, Char const* str)
{
return string_generate(sink, str, pass_through_filter());
}
template <typename OutputIterator, typename Char, typename Traits
, typename Allocator>
inline bool string_generate(OutputIterator& sink
, std::basic_string<Char, Traits, Allocator> const& str)
{
return string_generate(sink, str.c_str(), pass_through_filter());
}
template <typename OutputIterator, typename Container>
inline bool string_generate(OutputIterator& sink
, Container const& c)
{
return string_generate(sink, c, pass_through_filter());
}
///////////////////////////////////////////////////////////////////////////
// generate a string given by a pointer, converting according using a
// given character class and case tag
template <typename OutputIterator, typename Char, typename CharEncoding
, typename Tag>
inline bool string_generate(OutputIterator& sink
, Char const* str
, CharEncoding, Tag)
{
return string_generate(sink, str, encoding_filter<CharEncoding, Tag>());
}
template <typename OutputIterator, typename Char
, typename CharEncoding, typename Tag
, typename Traits, typename Allocator>
inline bool string_generate(OutputIterator& sink
, std::basic_string<Char, Traits, Allocator> const& str
, CharEncoding, Tag)
{
return string_generate(sink, str.c_str()
, encoding_filter<CharEncoding, Tag>());
}
template <typename OutputIterator, typename Container
, typename CharEncoding, typename Tag>
inline bool
string_generate(OutputIterator& sink
, Container const& c
, CharEncoding, Tag)
{
return string_generate(sink, c, encoding_filter<CharEncoding, Tag>());
}
///////////////////////////////////////////////////////////////////////////
template <typename OutputIterator, typename Char>
inline bool string_generate(OutputIterator& sink
, Char const* str
, unused_type, unused_type)
{
return string_generate(sink, str, pass_through_filter());
}
template <typename OutputIterator, typename Char, typename Traits
, typename Allocator>
inline bool string_generate(OutputIterator& sink
, std::basic_string<Char, Traits, Allocator> const& str
, unused_type, unused_type)
{
return string_generate(sink, str.c_str(), pass_through_filter());
}
template <typename OutputIterator, typename Container>
inline bool string_generate(OutputIterator& sink
, Container const& c
, unused_type, unused_type)
{
return string_generate(sink, c, pass_through_filter());
}
}}}}
#endif