summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/domain/applicationdomaintype_p.h45
-rw-r--r--common/storage/entitystore.cpp21
2 files changed, 52 insertions, 14 deletions
diff --git a/common/domain/applicationdomaintype_p.h b/common/domain/applicationdomaintype_p.h
new file mode 100644
index 0000000..aedf21f
--- /dev/null
+++ b/common/domain/applicationdomaintype_p.h
@@ -0,0 +1,45 @@
1/*
2 * Copyright (C) 2014 Christian Mollekopf <chrigi_1@fastmail.fm>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) version 3, or any
8 * later version accepted by the membership of KDE e.V. (or its
9 * successor approved by the membership of KDE e.V.), which shall
10 * act as a proxy defined in Section 6 of version 3 of the license.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
19 */
20#pragma once
21
22#include "applicationdomaintype.h"
23
24template <template<typename> class Func>
25struct TypeHelper {
26 const QByteArray type;
27 TypeHelper(const QByteArray &type_)
28 : type(type_)
29 {
30
31 }
32
33 template <typename R, typename ...Args>
34 R operator()(Args && ... args) const {
35 if (type == Sink::ApplicationDomain::getTypeName<Sink::ApplicationDomain::Folder>()) {
36 return Func<Sink::ApplicationDomain::Folder>{}(std::forward<Args...>(args...));
37 } else if (type == Sink::ApplicationDomain::getTypeName<Sink::ApplicationDomain::Mail>()) {
38 return Func<Sink::ApplicationDomain::Mail>{}(std::forward<Args...>(args...));
39 } else if (type == Sink::ApplicationDomain::getTypeName<Sink::ApplicationDomain::Event>()) {
40 return Func<Sink::ApplicationDomain::Event>{}(std::forward<Args...>(args...));
41 } else {
42 Q_ASSERT(false);
43 }
44 }
45};
diff --git a/common/storage/entitystore.cpp b/common/storage/entitystore.cpp
index f6b8f43..b6251b6 100644
--- a/common/storage/entitystore.cpp
+++ b/common/storage/entitystore.cpp
@@ -27,6 +27,7 @@
27#include "index.h" 27#include "index.h"
28#include "bufferutils.h" 28#include "bufferutils.h"
29#include "entity_generated.h" 29#include "entity_generated.h"
30#include "applicationdomaintype_p.h"
30 31
31#include "mail.h" 32#include "mail.h"
32#include "folder.h" 33#include "folder.h"
@@ -57,20 +58,12 @@ public:
57 return transaction; 58 return transaction;
58 } 59 }
59 60
60 template<typename ...Args> 61 template <class T>
61 void configure(const QByteArray &type, Args && ... args) 62 struct ConfigureHelper {
62 { 63 void operator()(TypeIndex &arg) const {
63 if (type == ApplicationDomain::getTypeName<ApplicationDomain::Folder>()) { 64 ApplicationDomain::TypeImplementation<T>::configure(arg);
64 ApplicationDomain::TypeImplementation<ApplicationDomain::Folder>::configure(std::forward<Args...>(args...));
65 } else if (type == ApplicationDomain::getTypeName<ApplicationDomain::Mail>()) {
66 ApplicationDomain::TypeImplementation<ApplicationDomain::Mail>::configure(std::forward<Args...>(args...));
67 } else if (type == ApplicationDomain::getTypeName<ApplicationDomain::Event>()) {
68 ApplicationDomain::TypeImplementation<ApplicationDomain::Event>::configure(std::forward<Args...>(args...));
69 } else {
70 Q_ASSERT(false);
71 SinkError() << "Unkonwn type " << type;
72 } 65 }
73 } 66 };
74 67
75 TypeIndex &cachedIndex(const QByteArray &type) 68 TypeIndex &cachedIndex(const QByteArray &type)
76 { 69 {
@@ -78,7 +71,7 @@ public:
78 return *indexByType.value(type); 71 return *indexByType.value(type);
79 } 72 }
80 auto index = QSharedPointer<TypeIndex>::create(type); 73 auto index = QSharedPointer<TypeIndex>::create(type);
81 configure(type, *index); 74 TypeHelper<ConfigureHelper>{type}.template operator()<void>(*index);
82 indexByType.insert(type, index); 75 indexByType.insert(type, index);
83 return *index; 76 return *index;
84 77