initial code repo
[stor4nfv.git] / src / ceph / src / tools / rbd / IndentStream.h
diff --git a/src/ceph/src/tools/rbd/IndentStream.h b/src/ceph/src/tools/rbd/IndentStream.h
new file mode 100644 (file)
index 0000000..85ccc85
--- /dev/null
@@ -0,0 +1,60 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_RBD_INDENT_STREAM_H
+#define CEPH_RBD_INDENT_STREAM_H
+
+#include "include/int_types.h"
+#include <iostream>
+#include <streambuf>
+#include <iomanip>
+
+namespace rbd {
+
+class IndentBuffer : public std::streambuf {
+public:
+  IndentBuffer(size_t indent, size_t initial_offset, size_t line_length,
+               std::streambuf *streambuf)
+    : m_indent(indent), m_initial_offset(initial_offset),
+      m_line_length(line_length), m_streambuf(streambuf),
+      m_delim(" "), m_indent_prefix(m_indent, ' ') {
+  }
+
+  void set_delimiter(const std::string &delim) {
+    m_delim = delim;
+  }
+
+protected:
+  int overflow (int c) override;
+
+private:
+  size_t m_indent;
+  size_t m_initial_offset;
+  size_t m_line_length;
+  std::streambuf *m_streambuf;
+
+  std::string m_delim;
+  std::string m_indent_prefix;
+  std::string m_buffer;
+
+  void flush_line();
+};
+
+class IndentStream : public std::ostream {
+public:
+  IndentStream(size_t indent, size_t initial_offset, size_t line_length,
+               std::ostream &os)
+    : std::ostream(&m_indent_buffer),
+      m_indent_buffer(indent, initial_offset, line_length, os.rdbuf()) {
+  }
+
+  void set_delimiter(const std::string &delim) {
+    m_indent_buffer.set_delimiter(delim);
+  }
+private:
+  IndentBuffer m_indent_buffer;
+};
+
+} // namespace rbd
+
+#endif // CEPH_RBD_INDENT_STREAM_ITERATOR_H