From: 박종현/On-Device Lab(SR)/Staff Engineer/삼성전자 Date: Fri, 6 Sep 2019 08:29:06 +0000 (+0900) Subject: Introduce bino (#7247) X-Git-Tag: accepted/tizen/unified/20190911.111615~62 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=198fa86d7ac4568bcd0534cc5aeb0bff9760d6a9;p=platform%2Fcore%2Fml%2Fnnfw.git Introduce bino (#7247) This commit introduces bino, a library that facilitates std::pair manipulation. Signed-off-by: Jonghyun Park --- diff --git a/compiler/bino/CMakeLists.txt b/compiler/bino/CMakeLists.txt new file mode 100644 index 0000000..2416c0f --- /dev/null +++ b/compiler/bino/CMakeLists.txt @@ -0,0 +1,14 @@ +add_library(bino INTERFACE) +target_include_directories(bino INTERFACE include) + +if(NOT ENABLE_TEST) + return() +endif(NOT ENABLE_TEST) + +# Google Test is mandatory for internal testing +nncc_find_package(GTest REQUIRED) + +file(GLOB_RECURSE TESTS "tests/*.cpp") + +GTest_AddTest(bino_test ${TESTS}) +target_link_libraries(bino_test bino) diff --git a/compiler/bino/README.md b/compiler/bino/README.md new file mode 100644 index 0000000..9d58c72 --- /dev/null +++ b/compiler/bino/README.md @@ -0,0 +1,5 @@ +# bino + +Let's manipulate std::pair values with UNIX pipe-like syntax. + +**NOTE** The _bino_ originates from a binocular telescope. diff --git a/compiler/bino/include/bino.h b/compiler/bino/include/bino.h new file mode 100644 index 0000000..1ebe141 --- /dev/null +++ b/compiler/bino/include/bino.h @@ -0,0 +1,63 @@ +/* + * 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 __BINO_H__ +#define __BINO_H__ + +#include + +namespace bino +{ + +template class UniformTransform +{ +public: + UniformTransform(Callable &&cb) : f{std::forward(cb)} + { + // DO NOTHING + } + +public: + template + auto operator()(const std::pair &p) const + -> decltype(std::make_pair(std::declval()(p.first), + std::declval()(p.second))) + { + return std::make_pair(f(p.first), f(p.second)); + } + +private: + Callable f; +}; + +template UniformTransform transform_both(Callable &&f) +{ + return UniformTransform{std::forward(f)}; +} + +// TODO Implement transform_both(f, g) +// TODO Implement transform_first(f) +// TODO Implement transform_second(f) + +} // namespace bino + +template +auto operator|(const std::pair &p, Callable &&f) -> decltype(f(p)) +{ + return std::forward(f)(p); +} + +#endif // __BINO_H__ diff --git a/compiler/bino/tests/Functional.tests.cpp b/compiler/bino/tests/Functional.tests.cpp new file mode 100644 index 0000000..3200dd9 --- /dev/null +++ b/compiler/bino/tests/Functional.tests.cpp @@ -0,0 +1,34 @@ +/* + * 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. + */ + +/** + * Let's test functionals in "bino". + * + * NOTE The tests in this file assume that operator overloading works well. + */ + +#include "bino.h" + +#include + +TEST(FunctionalTests, transform_both_uniform) +{ + auto inc = [](int n) { return n + 1; }; + auto res = std::make_pair(1, 3) | bino::transform_both(inc); + + ASSERT_EQ(res.first, 2); + ASSERT_EQ(res.second, 4); +} diff --git a/compiler/bino/tests/OperatorOverloading.test.cpp b/compiler/bino/tests/OperatorOverloading.test.cpp new file mode 100644 index 0000000..53526d3 --- /dev/null +++ b/compiler/bino/tests/OperatorOverloading.test.cpp @@ -0,0 +1,27 @@ +/* + * 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 "bino.h" + +#include + +TEST(OperatorOverloadingTests, reduce_sum) +{ + auto pair = std::make_pair(1, 3); + auto reduce_sum = [](const std::pair &p) { return p.first + p.second; }; + + ASSERT_EQ(pair | reduce_sum, 4); +}