--- /dev/null
+#ifndef __PP_ENCLOSED_DOCUMENT_H__
+#define __PP_ENCLOSED_DOCUMENT_H__
+
+#include "pp/LinearDocument.h"
+
+namespace pp
+{
+
+class EnclosedDocument
+{
+public:
+ EnclosedDocument() : _front{}, _back{LinearDocument::Direction::Reverse}
+ {
+ // DO NOTHING
+ }
+
+public:
+ LinearDocument &front(void) { return _front; }
+ const LinearDocument &front(void) const { return _front; }
+
+public:
+ LinearDocument &back(void) { return _back; }
+ const LinearDocument &back(void) const { return _back; }
+
+public:
+ uint32_t lines(void) const;
+ const std::string &line(uint32_t n) const;
+
+private:
+ LinearDocument _front;
+ LinearDocument _back;
+};
+
+} // namespace pp
+
+#endif // __PP_ENCLOSED_DOCUMENT_H__
--- /dev/null
+#include "pp/EnclosedDocument.h"
+
+namespace pp
+{
+
+uint32_t EnclosedDocument::lines(void) const { return _front.lines() + _back.lines(); }
+
+const std::string &EnclosedDocument::line(uint32_t n) const
+{
+ if (n < _front.lines())
+ {
+ return _front.line(n);
+ }
+
+ return _back.line(n - _front.lines());
+}
+
+} // namespace pp
--- /dev/null
+#include "pp/EnclosedDocument.h"
+
+#include <gtest/gtest.h>
+
+TEST(LINEAR_DOCUMENT, lines)
+{
+ pp::EnclosedDocument doc;
+
+ doc.front().append("A");
+ doc.back().append("C");
+ doc.back().append("B");
+
+ ASSERT_EQ(doc.lines(), 3);
+}
+
+TEST(LINEAR_DOCUMENT, line)
+{
+ pp::EnclosedDocument doc;
+
+ doc.front().append("A");
+ doc.front().indent();
+ doc.front().append("B");
+ doc.back().append("C");
+ doc.back().append("B");
+
+ ASSERT_EQ(doc.lines(), 4);
+ ASSERT_EQ(doc.line(0), "A");
+ ASSERT_EQ(doc.line(1), " B");
+ ASSERT_EQ(doc.line(2), "B");
+ ASSERT_EQ(doc.line(3), "C");
+}