49 lines
1.0 KiB
C++
49 lines
1.0 KiB
C++
#ifndef UTIL_STRING_STREAM_H
|
|
#define UTIL_STRING_STREAM_H
|
|
|
|
#include "util/fake_ostream.hh"
|
|
|
|
#include <cassert>
|
|
#include <string>
|
|
|
|
namespace util {
|
|
|
|
class StringStream : public FakeOStream<StringStream> {
|
|
public:
|
|
StringStream() {}
|
|
|
|
StringStream &flush() { return *this; }
|
|
|
|
StringStream &write(const void *data, std::size_t length) {
|
|
out_.append(static_cast<const char*>(data), length);
|
|
return *this;
|
|
}
|
|
|
|
const std::string &str() const { return out_; }
|
|
|
|
void str(const std::string &val) { out_ = val; }
|
|
|
|
void swap(std::string &str) { std::swap(out_, str); }
|
|
|
|
protected:
|
|
friend class FakeOStream<StringStream>;
|
|
char *Ensure(std::size_t amount) {
|
|
std::size_t current = out_.size();
|
|
out_.resize(out_.size() + amount);
|
|
return &out_[current];
|
|
}
|
|
|
|
void AdvanceTo(char *to) {
|
|
assert(to <= &*out_.end());
|
|
assert(to >= &*out_.begin());
|
|
out_.resize(to - &*out_.begin());
|
|
}
|
|
|
|
private:
|
|
std::string out_;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
#endif // UTIL_STRING_STREAM_H
|