blob: a3b98e2702725026078323f5589edc1fc2311c24 [file] [log] [blame]
/*=============================================================================
Copyright (c) 2002 2004 2006 Joel de Guzman
http://spirit.sourceforge.net/
Use, modification and distribution is subject to 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_QUICKBOOK_COLLECTOR_HPP)
#define BOOST_SPIRIT_QUICKBOOK_COLLECTOR_HPP
#include <string>
#include <stack>
#include <boost/ref.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/noncopyable.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/filtering_stream.hpp>
namespace quickbook
{
struct string_stream
{
typedef boost::iostreams::filtering_ostream ostream;
string_stream();
string_stream(string_stream const& other);
string_stream& operator=(string_stream const& other);
std::string const& str() const
{
stream_ptr->flush();
return *buffer_ptr.get();
}
std::ostream& get() const
{
return *stream_ptr.get();
}
void clear()
{
buffer_ptr->clear();
}
void swap(std::string& other)
{
stream_ptr->flush();
std::swap(other, *buffer_ptr.get());
}
void append(std::string const& other)
{
stream_ptr->flush();
*buffer_ptr.get() += other;
}
private:
boost::shared_ptr<std::string> buffer_ptr;
boost::shared_ptr<ostream> stream_ptr;
};
struct collector : boost::noncopyable
{
collector();
collector(string_stream& out);
~collector();
void push();
void pop();
std::ostream& get() const
{
return top.get().get();
}
std::string const& str() const
{
return top.get().str();
}
void clear()
{
top.get().clear();
}
void swap(std::string& other)
{
top.get().swap(other);
}
void append(std::string const& other)
{
top.get().append(other);
}
private:
std::stack<string_stream> streams;
boost::reference_wrapper<string_stream> main;
boost::reference_wrapper<string_stream> top;
string_stream default_;
};
template <typename T>
inline collector&
operator<<(collector& out, T const& val)
{
out.get() << val;
return out;
}
inline collector&
operator<<(collector& out, std::string const& val)
{
out.append(val);
return out;
}
}
#endif // BOOST_SPIRIT_QUICKBOOK_COLLECTOR_HPP