#define __PP_ENCLOSED_DOCUMENT_H__
#include "pp/LinearDocument.h"
+#include "pp/MultiLineText.h"
namespace pp
{
-class EnclosedDocument
+class EnclosedDocument final : public MultiLineText
{
public:
EnclosedDocument() : _front{}, _back{LinearDocument::Direction::Reverse}
const LinearDocument &back(void) const { return _back; }
public:
- uint32_t lines(void) const;
- const std::string &line(uint32_t n) const;
+ uint32_t lines(void) const override;
+ const std::string &line(uint32_t n) const override;
private:
LinearDocument _front;
#include "pp/Format.h"
#include "pp/IndentedStringBuilder.h"
+#include "pp/MultiLineText.h"
#include <vector>
#include <string>
namespace pp
{
-class LinearDocument
+class LinearDocument final : public MultiLineText
{
public:
enum class Direction
void append(const LinearDocument &doc);
public:
- uint32_t lines(void) const { return _lines.size(); }
+ uint32_t lines(void) const override { return _lines.size(); }
public:
- const std::string &line(uint32_t n) const;
+ const std::string &line(uint32_t n) const override;
private:
Direction const _direction;
--- /dev/null
+#ifndef __PP_MULTI_LINE_TEXT_H__
+#define __PP_MULTI_LINE_TEXT_H__
+
+#include <string>
+
+#include <cstdint>
+
+namespace pp
+{
+
+struct MultiLineText
+{
+ virtual ~MultiLineText() = default;
+
+ virtual uint32_t lines(void) const = 0;
+ virtual const std::string &line(uint32_t n) const = 0;
+};
+
+} // namespace pp
+
+#endif // __PP_MULTI_LINE_TEXT_H__
--- /dev/null
+#ifndef __PP_MULTI_LINE_TEXT_UTILS_H__
+#define __PP_MULTI_LINE_TEXT_UTILS_H__
+
+#include "pp/MultiLineText.h"
+
+#include <ostream>
+
+std::ostream &operator<<(std::ostream &os, const pp::MultiLineText &txt);
+
+#endif // __PP_MULTI_LINE_TEXT_UTILS_H__
--- /dev/null
+#include "pp/MultiLineTextUtils.h"
+
+std::ostream &operator<<(std::ostream &os, const pp::MultiLineText &txt)
+{
+ if (txt.lines() > 0)
+ {
+ os << txt.line(0);
+
+ for (uint32_t n = 1; n < txt.lines(); ++n)
+ {
+ os << std::endl << txt.line(n);
+ }
+ }
+
+ return os;
+}
--- /dev/null
+#include "pp/MultiLineTextUtils.h"
+
+#include <sstream>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+struct DummyMultiLineText final : public pp::MultiLineText
+{
+ std::vector<std::string> content;
+
+ uint32_t lines(void) const override { return content.size(); }
+ const std::string &line(uint32_t n) const override { return content.at(n); }
+};
+
+TEST(MUILTI_LINE_TEXT_UTILS, operator_shift)
+{
+ DummyMultiLineText txt;
+
+ txt.content.emplace_back("A");
+ txt.content.emplace_back(" B");
+ txt.content.emplace_back(" C");
+
+ const char *expected = "A\n"
+ " B\n"
+ " C\n";
+
+ std::stringstream ss;
+
+ ss << txt << std::endl;
+
+ ASSERT_EQ(ss.str(), expected);
+}