c++17: Refactor with template class type deduction
authorSangwan Kwon <sangwan.kwon@samsung.com>
Thu, 30 Jan 2020 05:53:14 +0000 (14:53 +0900)
committerSangwan Kwon <sangwan.kwon@samsung.com>
Thu, 30 Jan 2020 05:53:14 +0000 (14:53 +0900)
Signed-off-by: Sangwan Kwon <sangwan.kwon@samsung.com>
src/vist/client/virtual-table.cpp
src/vist/policy/policy-storage.cpp
src/vist/query-builder/column.hpp
src/vist/query-builder/database.hpp
src/vist/query-builder/table.hpp
src/vist/query-builder/tests/query-builder.cpp

index 19df7c6d100e38a87417459056bdb09a1657eada..f845a58ca57fe6d81f0c39648a93686252657e3c 100644 (file)
@@ -33,32 +33,28 @@ namespace {
 using namespace vist::tsqb;
 using namespace vist::schema;
 
-auto time = make_table("time",
-                                          make_column("hour", &Time::hour),
-                                          make_column("minutes", &Time::minutes),
-                                          make_column("seconds", &Time::seconds));
-
-auto processes = make_table("processes",
-                                                       make_column("pid", &Processes::pid),
-                                                       make_column("name", &Processes::name),
-                                                       make_column("path", &Processes::path),
-                                                       make_column("cmdline", &Processes::cmdline),
-                                                       make_column("uid", &Processes::uid),
-                                                       make_column("gid", &Processes::gid),
-                                                       make_column("euid", &Processes::euid),
-                                                       make_column("egid", &Processes::egid),
-                                                       make_column("on_disk", &Processes::on_disk),
-                                                       make_column("parent", &Processes::parent));
-
-auto policyInt = make_table("policy",
-                                                make_column("name", &Policy<int>::name),
-                                                make_column("value", &Policy<int>::value));
-
-auto policyStr = make_table("policy",
-                                                       make_column("name", &Policy<std::string>::name),
-                                                       make_column("value", &Policy<std::string>::value));
-
-auto metaDB = make_database("db", time, processes, policyInt, policyStr);
+Table time { "time", Column("hour", &Time::hour),
+                                        Column("minutes", &Time::minutes),
+                                        Column("seconds", &Time::seconds) };
+
+Table processes { "processes", Column("pid", &Processes::pid),
+                                                          Column("name", &Processes::name),
+                                                          Column("path", &Processes::path),
+                                                          Column("cmdline", &Processes::cmdline),
+                                                          Column("uid", &Processes::uid),
+                                                          Column("gid", &Processes::gid),
+                                                          Column("euid", &Processes::euid),
+                                                          Column("egid", &Processes::egid),
+                                                          Column("on_disk", &Processes::on_disk),
+                                                          Column("parent", &Processes::parent) };
+
+Table policyInt { "policy", Column("name", &Policy<int>::name),
+                                                       Column("value", &Policy<int>::value) };
+
+Table policyStr { "policy", Column("name", &Policy<std::string>::name),
+                                                       Column("value", &Policy<std::string>::value) };
+
+Database metaDB { "db", time, processes, policyInt, policyStr };
 
 } // anonymous namespace
 
index ba1ba20326de48f90c14f32b2f0a9d0e4fddaa53..081385ea1f980b06cdbd95cfa1b276eef2e810b4 100644 (file)
@@ -30,17 +30,15 @@ using namespace vist::policy::schema;
 
 namespace {
 
-auto adminTable = make_table("ADMIN", make_column("name", &Admin::name),
-                                                                         make_column("activated", &Admin::activated));
+Table adminTable { "ADMIN", Column("name", &Admin::name),
+                                                       Column("activated", &Admin::activated) };
 
-auto polManagedTable = make_table("POLICY_MANAGED",
-                                                                       make_column("admin", &PolicyManaged::admin),
-                                                                       make_column("policy", &PolicyManaged::policy),
-                                                                       make_column("value", &PolicyManaged::value));
+Table polManagedTable { "POLICY_MANAGED", Column("admin", &PolicyManaged::admin),
+                                                                                 Column("policy", &PolicyManaged::policy),
+                                                                                 Column("value", &PolicyManaged::value) };
 
-auto polDefinitionTable = make_table("POLICY_DEFINITION",
-                                                                        make_column("name", &PolicyDefinition::name),
-                                                                        make_column("ivalue", &PolicyDefinition::ivalue));
+Table polDefinitionTable { "POLICY_DEFINITION", Column("name", &PolicyDefinition::name),
+                                                                                               Column("ivalue", &PolicyDefinition::ivalue) };
 
 const std::string SCRIPT_BASE = SCRIPT_INSTALL_DIR;
 const std::string SCRIPT_CREATE_SCHEMA  = "create-schema";
index aeabdf19debb507a7f471872c5b1d9d53333c4ef..a89482fcece3de2a487e06e7e9bff8b744d9bb72 100644 (file)
@@ -36,12 +36,6 @@ struct Column final {
        Type type;
 };
 
-template<typename O, typename F>
-Column<O, F> make_column(const std::string& name, F O::*field)
-{
-       return {name, field};
-}
-
 template<typename Type>
 struct Distinct {
        Type value;
@@ -50,7 +44,7 @@ struct Distinct {
 template<typename... Args>
 auto distinct(Args&&... args) -> decltype(Distinct<std::tuple<Args...>>())
 {
-       return {std::make_tuple(std::forward<Args>(args)...)};
+       return {std::tuple(args...)};
 }
 
 } // namespace tsqb
index a61413003612a0637fb28b4a77721c807114d259..57dbac635a724ce9f858116cf3fe1dfe0be26f41 100644 (file)
@@ -66,18 +66,9 @@ public: // CRTP(Curiously Recurring Template Pattern) for CRUD
        std::vector<std::string> cache;
 
 private:
-       template<typename ...Ts>
-       friend Database<Ts...> make_database(const std::string& name, Ts&& ...tables);
-
        std::tuple<Tables...> tables;
 };
 
-template<typename ...Tables>
-Database<Tables...> make_database(const std::string& name, Tables&& ...tables)
-{
-       return Database<Tables...>(name, std::forward<Tables>(tables)...);
-}
-
 template<typename... Tables>
 template<typename Table>
 Database<Tables...>& Database<Tables...>::join(condition::Join type)
@@ -128,8 +119,8 @@ std::vector<std::string> Database<Tables...>::getTableNames(Cs&& ...columns) con
        std::set<std::string> names;
 
        auto closure = [this, &names](const auto& type) {
-               auto column = make_column("anonymous", type);
-               using TableType = typename decltype(column)::Table;
+               Column anonymous("anonymous", type);
+               using TableType = typename decltype(anonymous)::Table;
                auto name = this->getTableName(TableType());
                if (!name.empty())
                                names.emplace(name);
index ed2e27f0e73cc51a0f947320025f827a8acbcec7..c50e05c0ee36b74ff0486b3584ebf44b6825202d 100644 (file)
@@ -64,18 +64,9 @@ public: // CRTP(Curiously Recurring Template Pattern) for CRUD
        std::vector<std::string> cache;
 
 private:
-       template<typename ...Cs>
-       friend Table<Cs...> make_table(const std::string& name, Cs&& ...columns);
-
        std::tuple<Columns...> columns;
 };
 
-template<typename ...Columns>
-Table<Columns...> make_table(const std::string& name, Columns&& ...cs)
-{
-       return Table<Columns...>(name, std::forward<Columns>(cs)...);
-}
-
 template<typename... Columns>
 std::string Table<Columns...>::getName() const noexcept
 {
index ae6f75ed56384b13a61a47d1a63a47c37a0e1569..65ae466ecb604dfaadbf2ea5a1b1237b6de9841b 100644 (file)
@@ -42,25 +42,23 @@ struct PolicyDefinition {
        int ivalue;
 };
 
-auto admin = make_table("admin", make_column("id", &Admin::id),
-                                                                make_column("pkg", &Admin::pkg),
-                                                                make_column("uid", &Admin::uid),
-                                                                make_column("key", &Admin::key),
-                                                                make_column("removable", &Admin::removable));
-
-auto managedPolicy = make_table("managed_policy",
-                                                                make_column("id", &ManagedPolicy::id),
-                                                                make_column("aid", &ManagedPolicy::aid),
-                                                                make_column("pid", &ManagedPolicy::pid),
-                                                                make_column("value", &ManagedPolicy::value));
-
-auto policyDefinition = make_table("policy_definition",
-                                                                  make_column("id", &PolicyDefinition::id),
-                                                                  make_column("scope", &PolicyDefinition::scope),
-                                                                  make_column("name", &PolicyDefinition::name),
-                                                                  make_column("ivalue", &PolicyDefinition::ivalue));
-
-auto db = make_database("dpm", admin, managedPolicy, policyDefinition);
+Table admin { "admin", Column("id", &Admin::id),
+                                          Column("pkg", &Admin::pkg),
+                                          Column("uid", &Admin::uid),
+                                          Column("key", &Admin::key),
+                                          Column("removable", &Admin::removable) };
+
+Table managedPolicy { "managed_policy", Column("id", &ManagedPolicy::id),
+                                                                               Column("aid", &ManagedPolicy::aid),
+                                                                               Column("pid", &ManagedPolicy::pid),
+                                                                               Column("value", &ManagedPolicy::value) };
+
+Table policyDefinition { "policy_definition", Column("id", &PolicyDefinition::id),
+                                                                                         Column("scope", &PolicyDefinition::scope),
+                                                                                         Column("name", &PolicyDefinition::name),
+                                                                                         Column("ivalue", &PolicyDefinition::ivalue) };
+
+Database db { "dpm", admin, managedPolicy, policyDefinition };
 
 class TsqbTests : public testing::Test {};