You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
155 lines
5.0 KiB
155 lines
5.0 KiB
// 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
|
|
|