Chris@16: // Copyright (c) 2001-2011 Hartmut Kaiser Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #if !defined(BOOST_SPIRIT_KARMA_STRING_GENERATE_FEB_23_2007_1232PM) Chris@16: #define BOOST_SPIRIT_KARMA_STRING_GENERATE_FEB_23_2007_1232PM Chris@16: Chris@16: #if defined(_MSC_VER) Chris@16: #pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace spirit { namespace karma { namespace detail Chris@16: { Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // pass through character transformation Chris@16: struct pass_through_filter Chris@16: { Chris@16: template Chris@16: Char operator()(Char ch) const Chris@16: { Chris@16: return ch; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct encoding_filter Chris@16: { Chris@16: template Chris@16: Char operator()(Char ch) const Chris@16: { Chris@16: return spirit::char_class::convert::to(Tag(), ch); Chris@16: } Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // generate a string given by a std::string, applying the given filter Chris@16: template Chris@16: inline bool string_generate(OutputIterator& sink, Char const* str Chris@16: , Filter filter) Chris@16: { Chris@16: for (Char ch = *str; ch != 0; ch = *++str) Chris@16: { Chris@16: *sink = filter(ch); Chris@16: ++sink; Chris@16: } Chris@16: return detail::sink_is_good(sink); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool string_generate(OutputIterator& sink Chris@16: , Container const& c, Filter filter) Chris@16: { Chris@16: typedef typename traits::container_iterator::type Chris@16: iterator; Chris@16: Chris@16: iterator end = boost::end(c); Chris@16: for (iterator it = boost::begin(c); it != end; ++it) Chris@16: { Chris@16: *sink = filter(*it); Chris@16: ++sink; Chris@16: } Chris@16: return detail::sink_is_good(sink); Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // generate a string without any transformation Chris@16: template Chris@16: inline bool string_generate(OutputIterator& sink, Char const* str) Chris@16: { Chris@16: return string_generate(sink, str, pass_through_filter()); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool string_generate(OutputIterator& sink Chris@16: , std::basic_string const& str) Chris@16: { Chris@16: return string_generate(sink, str.c_str(), pass_through_filter()); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool string_generate(OutputIterator& sink Chris@16: , Container const& c) Chris@16: { Chris@16: return string_generate(sink, c, pass_through_filter()); Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // generate a string given by a pointer, converting according using a Chris@16: // given character class and case tag Chris@16: template Chris@16: inline bool string_generate(OutputIterator& sink Chris@16: , Char const* str Chris@16: , CharEncoding, Tag) Chris@16: { Chris@16: return string_generate(sink, str, encoding_filter()); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool string_generate(OutputIterator& sink Chris@16: , std::basic_string const& str Chris@16: , CharEncoding, Tag) Chris@16: { Chris@16: return string_generate(sink, str.c_str() Chris@16: , encoding_filter()); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool Chris@16: string_generate(OutputIterator& sink Chris@16: , Container const& c Chris@16: , CharEncoding, Tag) Chris@16: { Chris@16: return string_generate(sink, c, encoding_filter()); Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: inline bool string_generate(OutputIterator& sink Chris@16: , Char const* str Chris@16: , unused_type, unused_type) Chris@16: { Chris@16: return string_generate(sink, str, pass_through_filter()); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool string_generate(OutputIterator& sink Chris@16: , std::basic_string const& str Chris@16: , unused_type, unused_type) Chris@16: { Chris@16: return string_generate(sink, str.c_str(), pass_through_filter()); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool string_generate(OutputIterator& sink Chris@16: , Container const& c Chris@16: , unused_type, unused_type) Chris@16: { Chris@16: return string_generate(sink, c, pass_through_filter()); Chris@16: } Chris@16: Chris@16: }}}} Chris@16: Chris@16: #endif