From 8815d4be6ab3f2dc18571fa18eaaa60c4b397006 Mon Sep 17 00:00:00 2001 From: Sangwan Kwon Date: Fri, 31 Jan 2020 13:41:06 +0900 Subject: [PATCH] c++17: Use fold expression with std::apply Signed-off-by: Sangwan Kwon --- src/vist/query-builder/database.hpp | 37 ++++++++++++------ src/vist/query-builder/table.hpp | 22 +++++++---- src/vist/query-builder/tuple-helper.hpp | 52 ------------------------- 3 files changed, 39 insertions(+), 72 deletions(-) delete mode 100644 src/vist/query-builder/tuple-helper.hpp diff --git a/src/vist/query-builder/database.hpp b/src/vist/query-builder/database.hpp index 57dbac6..7cdf8ba 100644 --- a/src/vist/query-builder/database.hpp +++ b/src/vist/query-builder/database.hpp @@ -20,7 +20,6 @@ #include "condition.hpp" #include "crud.hpp" #include "expression.hpp" -#include "tuple-helper.hpp" #include "util.hpp" #include @@ -118,7 +117,7 @@ std::vector Database::getTableNames(Cs&& ...columns) con { std::set names; - auto closure = [this, &names](const auto& type) { + auto predicate = [this, &names](const auto& type) { Column anonymous("anonymous", type); using TableType = typename decltype(anonymous)::Table; auto name = this->getTableName(TableType()); @@ -126,8 +125,11 @@ std::vector Database::getTableNames(Cs&& ...columns) con names.emplace(name); }; - auto tuple = std::tuple(columns...); - tuple_helper::for_each(tuple, closure); + auto closure = [&predicate](const auto&... iter) { + (predicate(iter), ...); + }; + + std::apply(closure, std::tuple(columns...)); return std::vector(names.begin(), names.end()); } @@ -137,14 +139,17 @@ template std::vector Database::getColumnNames(Cs&& ...columns) const noexcept { std::vector names; - auto closure = [this, &names](const auto& iter) { + auto predicate = [this, &names](const auto& iter) { auto name = this->getColumnName(iter); if (!name.empty()) names.emplace_back(name); }; - auto tuple = std::tuple(columns...); - tuple_helper::for_each(tuple, closure); + auto closure = [&predicate](const auto&... iter) { + (predicate(iter), ...); + }; + + std::apply(closure, std::tuple(columns...)); return names; } @@ -154,12 +159,16 @@ template std::string Database::getTableName(Table&& table) const noexcept { std::string name; - auto predicate = [&name, &table](const auto& iter) { - if (iter.compare(table)) - name = iter.name; + auto predicate = [&name, &table](const auto& type) { + if (type.compare(table)) + name = type.name; }; - tuple_helper::for_each(this->tables, predicate); + auto closure = [&predicate](const auto&... iter) { + (predicate(iter), ...); + }; + + std::apply(closure, this->tables); return name; } @@ -180,7 +189,11 @@ std::string Database::getColumnName(ColumnType&& column) const noexce } }; - tuple_helper::for_each(this->tables, predicate); + auto closure = [&predicate](const auto&... iter) { + (predicate(iter), ...); + }; + + std::apply(closure, this->tables); return name; } diff --git a/src/vist/query-builder/table.hpp b/src/vist/query-builder/table.hpp index c50e05c..92d2a31 100644 --- a/src/vist/query-builder/table.hpp +++ b/src/vist/query-builder/table.hpp @@ -18,7 +18,6 @@ #include "column.hpp" #include "crud.hpp" -#include "tuple-helper.hpp" #include "type.hpp" #include "util.hpp" @@ -85,14 +84,17 @@ template std::vector Table::getColumnNames(Cs&& ...columns) const noexcept { std::vector names; - auto closure = [this, &names](auto type) { + auto predicate = [this, &names](const auto& type) { auto name = this->getColumnName(type); if (!name.empty()) names.emplace_back(name); }; - auto tuple = std::tuple(columns...); - tuple_helper::for_each(tuple, closure); + auto closure = [&predicate](const auto&... iter) { + (predicate(iter), ...); + }; + + std::apply(closure, std::tuple(columns...)); return names; } @@ -108,11 +110,11 @@ template std::vector Table::getColumnNames(void) const noexcept { std::vector names; - auto closure = [&names](const auto& iter) { - names.push_back(iter.name); + auto closure = [&names](const auto&... iter) { + (names.push_back(iter.name), ...); }; - tuple_helper::for_each(this->columns, closure); + std::apply(closure, this->columns); return names; } @@ -127,7 +129,11 @@ std::string Table::getColumnName(const Column& column) const noexcep name = iter.name; }; - tuple_helper::for_each(this->columns, predicate); + auto closure = [&predicate](const auto&... iter) { + (predicate(iter), ...); + }; + + std::apply(closure, this->columns); return name; } diff --git a/src/vist/query-builder/tuple-helper.hpp b/src/vist/query-builder/tuple-helper.hpp deleted file mode 100644 index 23e2558..0000000 --- a/src/vist/query-builder/tuple-helper.hpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2017-present 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 - */ - -#pragma once - -#include - -namespace vist { -namespace tsqb { -namespace tuple_helper { -namespace internal { - -template -class Iterator { -public: - Iterator(const T& tuple, C&& closure) { - Iterator iter(tuple, std::forward(closure)); - closure(std::get(tuple)); - } -}; - -template -class Iterator<0, T, C> { -public: - Iterator(const T&, C&&) {} -}; - -} // namespace internal - -template -void for_each(const T& tuple, C&& closure) -{ - using Iter = internal::Iterator::value, T, C>; - Iter iter(tuple, std::forward(closure)); -} - -} // namspace tuple-hepler -} // namspace tsqb -} // namspace vist -- 2.34.1