00001 #ifndef UTIL_STRING_STREAM_H
00002 #define UTIL_STRING_STREAM_H
00003
00004 #include "util/fake_ostream.hh"
00005
00006 #include <cassert>
00007 #include <string>
00008
00009 namespace util {
00010
00011 class StringStream : public FakeOStream<StringStream> {
00012 public:
00013 StringStream() {}
00014
00015 StringStream &flush() { return *this; }
00016
00017 StringStream &write(const void *data, std::size_t length) {
00018 out_.append(static_cast<const char*>(data), length);
00019 return *this;
00020 }
00021
00022 const std::string &str() const { return out_; }
00023
00024 void str(const std::string &val) { out_ = val; }
00025
00026 void swap(std::string &str) { std::swap(out_, str); }
00027
00028 protected:
00029 friend class FakeOStream<StringStream>;
00030 char *Ensure(std::size_t amount) {
00031 std::size_t current = out_.size();
00032 out_.resize(out_.size() + amount);
00033 return &out_[current];
00034 }
00035
00036 void AdvanceTo(char *to) {
00037 assert(to <= &*out_.end());
00038 assert(to >= &*out_.begin());
00039 out_.resize(to - &*out_.begin());
00040 }
00041
00042 private:
00043 std::string out_;
00044 };
00045
00046 }
00047
00048 #endif // UTIL_STRING_STREAM_H