From: 박종현/On-Device Lab(SR)/Staff Engineer/삼성전자 Date: Wed, 31 Jul 2019 07:43:29 +0000 (+0900) Subject: [pepper-str] Initial commit (#6056) X-Git-Tag: submit/tizen/20190809.050447~297 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=453bb8ca17c8a39ab088d92b75393bc55d181604;p=platform%2Fcore%2Fml%2Fnnfw.git [pepper-str] Initial commit (#6056) 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 --- diff --git a/compiler/pepper-str/CMakeLists.txt b/compiler/pepper-str/CMakeLists.txt new file mode 100644 index 0000000..1e7e8de --- /dev/null +++ b/compiler/pepper-str/CMakeLists.txt @@ -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 index 0000000..ee99383 --- /dev/null +++ b/compiler/pepper-str/README.md @@ -0,0 +1,15 @@ +# pepper-str + +Let us simulate string interpolation in C++! + +## HOW TO USE + +```cxx +#include + +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 index 0000000..d4ea7c1 --- /dev/null +++ b/compiler/pepper-str/include/pepper/str.h @@ -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 +#include + +#include + +namespace pepper +{ +namespace details +{ + +template void str_impl(std::ostream &os, Arg &&... args); + +template <> void str_impl(std::ostream &os) +{ + // DO NOTHING + return; +} + +template void str_impl(std::ostream &os, Arg &&arg) { os << std::forward(arg); } + +template +void str_impl(std::ostream &os, Arg &&arg, Args &&... args) +{ + str_impl(os, std::forward(arg)); + str_impl(os, std::forward(args)...); +} + +} // namesapce details +} // namespace pepper + +namespace pepper +{ + +template static inline std::string str(Args &&... args) +{ + std::stringstream ss; + details::str_impl(ss, std::forward(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 index 0000000..222c371 --- /dev/null +++ b/compiler/pepper-str/test.cpp @@ -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 + +#include + +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"); +}