[pp] Add 'MultiLineText' interface (#571)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Tue, 10 Jul 2018 07:33:01 +0000 (16:33 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Tue, 10 Jul 2018 07:33:01 +0000 (16:33 +0900)
This commit adds 'MultiLineText' interfaces, and revises
'LinearDocument' and 'EnclosedDocument' to inherit this interface.

In addition, this commit introduces MultiLineTextUtils
(which will includes utilities over MultiLineText interface).

Currently, it includes '<<' operator overload.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/pp/include/pp/EnclosedDocument.h
contrib/pp/include/pp/LinearDocument.h
contrib/pp/include/pp/MultiLineText.h [new file with mode: 0644]
contrib/pp/include/pp/MultiLineTextUtils.h [new file with mode: 0644]
contrib/pp/src/MultiLineTextUtils.cpp [new file with mode: 0644]
contrib/pp/src/MultiLineTextUtils.test.cpp [new file with mode: 0644]

index b1824f7..425e989 100644 (file)
@@ -2,11 +2,12 @@
 #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}
@@ -23,8 +24,8 @@ public:
   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;
index 1c471f6..3eb1d6a 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "pp/Format.h"
 #include "pp/IndentedStringBuilder.h"
+#include "pp/MultiLineText.h"
 
 #include <vector>
 #include <string>
@@ -10,7 +11,7 @@
 namespace pp
 {
 
-class LinearDocument
+class LinearDocument final : public MultiLineText
 {
 public:
   enum class Direction
@@ -46,10 +47,10 @@ public:
   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;
diff --git a/contrib/pp/include/pp/MultiLineText.h b/contrib/pp/include/pp/MultiLineText.h
new file mode 100644 (file)
index 0000000..8148cee
--- /dev/null
@@ -0,0 +1,21 @@
+#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__
diff --git a/contrib/pp/include/pp/MultiLineTextUtils.h b/contrib/pp/include/pp/MultiLineTextUtils.h
new file mode 100644 (file)
index 0000000..d13c9f8
--- /dev/null
@@ -0,0 +1,10 @@
+#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__
diff --git a/contrib/pp/src/MultiLineTextUtils.cpp b/contrib/pp/src/MultiLineTextUtils.cpp
new file mode 100644 (file)
index 0000000..789c974
--- /dev/null
@@ -0,0 +1,16 @@
+#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;
+}
diff --git a/contrib/pp/src/MultiLineTextUtils.test.cpp b/contrib/pp/src/MultiLineTextUtils.test.cpp
new file mode 100644 (file)
index 0000000..992c80b
--- /dev/null
@@ -0,0 +1,33 @@
+#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);
+}