[pepper-str] Initial commit (#6056)
author박종현/On-Device Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Wed, 31 Jul 2019 07:43:29 +0000 (16:43 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Wed, 31 Jul 2019 07:43:29 +0000 (16:43 +0900)
This commit adds pepper-str module. "pepper-str" provides "str" helper
which allows users to simulate string interpolation in C++.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
compiler/pepper-str/CMakeLists.txt [new file with mode: 0644]
compiler/pepper-str/README.md [new file with mode: 0644]
compiler/pepper-str/include/pepper/str.h [new file with mode: 0644]
compiler/pepper-str/test.cpp [new file with mode: 0644]

diff --git a/compiler/pepper-str/CMakeLists.txt b/compiler/pepper-str/CMakeLists.txt
new file mode 100644 (file)
index 0000000..1e7e8de
--- /dev/null
@@ -0,0 +1,12 @@
+add_library(pepper_str INTERFACE)
+target_include_directories(pepper_str INTERFACE include)
+
+if(NOT ENABLE_TEST)
+  return()
+endif(NOT ENABLE_TEST)
+
+# Google Test is mandatory for test
+nncc_find_package(GTest REQUIRED)
+
+GTest_AddTest(pepper_str_test test.cpp)
+target_link_libraries(pepper_str_test pepper_str)
diff --git a/compiler/pepper-str/README.md b/compiler/pepper-str/README.md
new file mode 100644 (file)
index 0000000..ee99383
--- /dev/null
@@ -0,0 +1,15 @@
+# pepper-str
+
+Let us simulate string interpolation in C++!
+
+## HOW TO USE
+
+```cxx
+#include <pepper/str.h>
+
+int main(int argc, char **argv)
+{
+  std::cout << pepper::str("There are ", argc, " arguments") << std::endl;
+  return 0;
+}
+```
diff --git a/compiler/pepper-str/include/pepper/str.h b/compiler/pepper-str/include/pepper/str.h
new file mode 100644 (file)
index 0000000..d4ea7c1
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PEPPER_STR_H__
+#define __PEPPER_STR_H__
+
+#include <ostream>
+#include <sstream>
+
+#include <string>
+
+namespace pepper
+{
+namespace details
+{
+
+template <typename... Arg> void str_impl(std::ostream &os, Arg &&... args);
+
+template <> void str_impl(std::ostream &os)
+{
+  // DO NOTHING
+  return;
+}
+
+template <typename Arg> void str_impl(std::ostream &os, Arg &&arg) { os << std::forward<Arg>(arg); }
+
+template <typename Arg, typename... Args>
+void str_impl(std::ostream &os, Arg &&arg, Args &&... args)
+{
+  str_impl(os, std::forward<Arg>(arg));
+  str_impl(os, std::forward<Args>(args)...);
+}
+
+} // namesapce details
+} // namespace pepper
+
+namespace pepper
+{
+
+template <typename... Args> static inline std::string str(Args &&... args)
+{
+  std::stringstream ss;
+  details::str_impl(ss, std::forward<Args>(args)...);
+  return ss.str();
+}
+
+} // namespace pepper
+
+#endif // __PEPPER_STR_H__
diff --git a/compiler/pepper-str/test.cpp b/compiler/pepper-str/test.cpp
new file mode 100644 (file)
index 0000000..222c371
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "pepper/str.h"
+
+#include <iostream>
+
+#include <gtest/gtest.h>
+
+TEST(StrTests, README)
+{
+  // Let us check whether the example in README.md works!
+  int argc = 4;
+
+  std::cout << pepper::str("There are ", argc, " arguments") << std::endl;
+
+  SUCCEED();
+}
+
+TEST(StrTests, Empty)
+{
+  // pepper::str() returns an empty string
+  ASSERT_EQ(pepper::str(), "");
+}
+
+TEST(StrTests, Single_Int)
+{
+  // Convert a single "int" value as a string
+  ASSERT_EQ(pepper::str(3), "3");
+}
+
+TEST(StrTests, Concat_000)
+{
+  const int n = 3;
+  const int m = 4;
+
+  ASSERT_EQ(pepper::str(n, "+", m, "=", n + m), "3+4=7");
+}