diff options
-rw-r--r-- | common/domain/applicationdomaintype_p.h | 45 | ||||
-rw-r--r-- | common/storage/entitystore.cpp | 21 |
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 | |||
24 | template <template<typename> class Func> | ||
25 | struct 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 | ||