• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.14 API Reference
  • KDE Home
  • Contact Us
 

KDECore

  • kdecore
  • util
ktypelistutils.h
Go to the documentation of this file.
1 /* This file is part of the KDE libraries
2  Copyright (C) 2009 Jonathan Schmidt-DominĂ© <devel@the-user.org>
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Library General Public
6  License version 2 as published by the Free Software Foundation,
7  or - at your option - any later version.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Library General Public License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to
16  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  Boston, MA 02110-1301, USA.
18 */
19 
25 #ifndef KTYPELISTUTILS_H
26 #define KTYPELISTUTILS_H
27 
28 #include "ktypelist.h"
29 #include <cstdlib>
30 
31 // NO CODE (ignore some preprocessor stuff)
32 #define NC(...) __VA_ARGS__
33 
37 template<class Types, typename Type>
38 struct KTypeListPush
39 {
40  typedef KTypeList<typename Types::Head, typename KTypeListPush<typename Types::Tail, Type>::Result> Result;
41 };
42 
43 template<typename Type>
44 struct KTypeListPush<KDE::NullType, Type>
45 {
46  typedef K_TYPELIST_1(Type) Result;
47 };
48 
52 template<class Types>
53 struct KTypeListPop
54 {
55  typedef KTypeList<typename Types::Head, typename KTypeListPop<typename Types::Tail>::Result> Result;
56 };
57 
58 template<class Type>
59 struct KTypeListPop<K_TYPELIST_1(Type)>
60 {
61  typedef KDE::NullType Result;
62 };
63 
67 template<class Types>
68 struct KTypeListEnd
69 {
70  typedef typename KTypeListEnd<typename Types::Tail>::Result Result;
71 };
72 
73 template<class Type>
74 struct KTypeListEnd<K_TYPELIST_1(Type)>
75 {
76  typedef Type Result;
77 };
78 
82 template<class List1, class List2>
83 struct KTypeListAppend
84 {
85  typedef KTypeList<typename List1::Head, typename KTypeListAppend<typename List1::Tail, List2>::Result> Result;
86 };
87 
88 template<class List2>
89 struct KTypeListAppend<KDE::NullType, List2>
90 {
91  typedef List2 Result;
92 };
93 
97 template<class Types, class Replace>
98 struct KTypeListReplaceBegin
99 {
100  typedef KTypeList<typename Replace::Head, typename KTypeListReplaceBegin<typename Types::Tail, typename Replace::Tail>::Result> Result;
101 };
102 
103 template<class Types>
104 struct KTypeListReplaceBegin<Types, KDE::NullType>
105 {
106  typedef Types Result;
107 };
108 
109 template<class Replace>
110 struct KTypeListReplaceBegin<KDE::NullType, Replace>
111 {
112  typedef KDE::NullType Result;
113 };
114 
118 template<class Types, std::size_t pos>
119 struct KTypeListAt
120 {
121  typedef typename KTypeListAt<
122  typename Types::Tail, pos - 1>::Result
123  Result;
124 };
125 
126 template<class Types>
127 struct KTypeListAt<Types, 0>
128 {
129  typedef typename Types::Head Result;
130 };
131 
132 template<std::size_t pos>
133 struct KTypeListAt<KDE::NullType, pos>
134 {
135 };
136 
137 template<>
138 struct KTypeListAt<KDE::NullType, 0>
139 {
140 };
141 
145 template<class Types, std::size_t pos, typename Default>
146 struct KTypeListAtWithDefault
147 {
148  typedef typename KTypeListAt<
149  typename Types::Tail, pos - 1>::Result
150  Result;
151 };
152 
153 template<class Types, typename Default>
154 struct KTypeListAtWithDefault<Types, 0, Default>
155 {
156  typedef typename Types::Head Result;
157 };
158 
159 template<std::size_t pos, typename Default>
160 struct KTypeListAtWithDefault<KDE::NullType, pos, Default>
161 {
162  typedef Default Result;
163 };
164 
165 template<typename Default>
166 struct KTypeListAtWithDefault<KDE::NullType, 0, Default>
167 {
168  typedef Default Result;
169 };
170 
174 template<class Types, template<typename> class Manip>
175 class KTypeListForeach
176 {
177 public:
178  typedef KTypeList<typename Manip<typename Types::Head>::Result, typename KTypeListForeach<typename Types::Tail, Manip>::Result> Result;
179 };
180 
181 template<template<typename> class Manip>
182 struct KTypeListForeach<KDE::NullType, Manip>
183 {
184  typedef KDE::NullType Result;
185 };
186 
190 template<class Types, typename Type>
191 struct KTypeListContains
192 {
193  enum { value = KTypeListContains<typename Types::Tail, Type>::value };
194 };
195 
196 template<class Tail, typename Type>
197 struct KTypeListContains<KTypeList<Type, Tail>, Type>
198 {
199  enum { value = true };
200 };
201 
202 template<typename Type>
203 struct KTypeListContains<KDE::NullType, Type>
204 {
205  enum { value = false };
206 };
207 
208 namespace KDE
209 {
213 template<typename T, typename U>
214 struct SameTypes
215 {
216  enum { value = false };
217 };
218 
219 template<typename T>
220 struct SameTypes<T, T>
221 {
222  enum { value = true };
223 };
224 }
225 
229 #define STATIC_EQUAL(type1, type2) KDE::SameTypes<type1, type2>::value
230 
234 #define STATIC_FOREACH(list, modifier) typename KTypeListForeach<list, modifier>::Result
235 
236 namespace KDE
237 {
238 template<bool cond, typename T, typename U>
239 struct IfThenElse
240 {
241  typedef T Result;
242 };
243 
244 template<typename T, typename U>
245 struct IfThenElse<false, T, U>
246 {
247  typedef U Result;
248 };
249 
250 template<typename First, typename Second, typename Then, typename Else>
251 struct IfEqualThenElse
252 {
253  typedef Else Result;
254 };
255 
256 template<typename FS, typename Then, typename Else>
257 struct IfEqualThenElse<FS, FS, Then, Else>
258 {
259  typedef Then Result;
260 };
261 }
262 
266 #define STATIC_IF(expr, T, U) typename KDE::IfThenElse<expr, T, U>::Result
267 
271 #define STATIC_IF_EQUAL(T, U, V, W) typename KDE::IfEqualThenElse<T, U, V, W>::Result
272 
273 template<class List, template<typename, typename> class Folder, typename Start = KDE::NullType>
274 struct KTypeListFold
275 {
276  typedef typename KTypeListFold<typename List::Tail, Folder, typename Folder<Start, typename List::Head>::Result>::Result Result;
277 };
278 
279 template<template<typename, typename> class Folder, typename Start>
280 struct KTypeListFold<KDE::NullType, Folder, Start>
281 {
282  typedef Start Result;
283 };
284 
290 #define STATIC_FOLD(List, Modifier, Start) typename KTypeListFold<List, Modifier, Start>::Result
291 
295 template<class List>
296 struct KTypeListRevert
297 {
298 private:
299  template<typename Value, typename Current>
300  struct Impl
301  {
302  typedef KTypeList<Current, Value> Result;
303  };
304 public:
305  typedef STATIC_FOLD(List, Impl, KDE::NullType) Result;
306 };
307 
308 template<class List, typename Pivot, template<typename A, typename B> class Comparator>
309 class KTypeListAfterPivot
310 {
311  template<typename Value, typename Current>
312  struct Impl
313  {
314  typedef STATIC_IF(NC(Comparator<Pivot, Current>::result), NC(KTypeList<Current, Value>), Value) Result;
315  };
316 public:
317  typedef STATIC_FOLD(List, Impl, KDE::NullType) Result;
318 };
319 
320 template<class List, typename Pivot, template<typename A, typename B> class Comparator>
321 class KTypeListBeforePivot
322 {
323  template<typename Value, typename Current>
324  struct Impl
325  {
326  typedef STATIC_IF(NC(Comparator<Pivot, Current>::result), Value, NC(KTypeList<Current, Value>)) Result;
327  };
328 public:
329  typedef STATIC_FOLD(List, Impl, KDE::NullType) Result;
330 };
331 
335 template<class List, template<typename A, typename B> class Comparator>
336 struct KTypeListSort
337 {
338  typedef typename KTypeListAppend<
339  typename KTypeListSort<
340  typename KTypeListBeforePivot<
341  typename List::Tail,
342  typename List::Head,
343  Comparator>::Result,
344  Comparator>::Result,
345  KTypeList<
346  typename List::Head,
347  typename KTypeListSort<
348  typename KTypeListAfterPivot<
349  typename List::Tail,
350  typename List::Head,
351  Comparator>::Result,
352  Comparator>::Result
353  >
354  >::Result Result;
355 };
356 
357 template<template<typename A, typename B> class Comparator>
358 struct KTypeListSort<KDE::NullType, Comparator>
359 {
360  typedef KDE::NullType Result;
361 };
362 
363 #undef NC
364 
365 #endif
KTypeListAt::Result
KTypeListAt< typename Types::Tail, pos-1 >::Result Result
Definition: ktypelistutils.h:123
KTypeListAt< Types, 0 >::Result
Types::Head Result
Definition: ktypelistutils.h:129
KTypeListSort< KDE::NullType, Comparator >::Result
KDE::NullType Result
Definition: ktypelistutils.h:360
ktypelist.h
This file defines typelist structures as well as convenience macros to create typelists.
KFileSystemType::Type
Type
Definition: kfilesystemtype_p.h:28
KDE::IfEqualThenElse
Definition: ktypelistutils.h:251
KTypeListRevert
Definition: ktypelistutils.h:296
KTypeListAfterPivot::STATIC_FOLD
typedef STATIC_FOLD(List, Impl, KDE::NullType) Result
T
#define T
KTypeListEnd< K_TYPELIST_1(Type)>::Result
Type Result
Definition: ktypelistutils.h:76
STATIC_IF
#define STATIC_IF(expr, T, U)
If expr: T, else: U.
Definition: ktypelistutils.h:266
KDE::SameTypes::value
Definition: ktypelistutils.h:216
KTypeListFold< KDE::NullType, Folder, Start >::Result
Start Result
Definition: ktypelistutils.h:282
KTypeListForeach::Result
KTypeList< typename Manip< typename Types::Head >::Result, typename KTypeListForeach< typename Types::Tail, Manip >::Result > Result
Definition: ktypelistutils.h:178
KTypeListFold::Result
KTypeListFold< typename List::Tail, Folder, typename Folder< Start, typename List::Head >::Result >::Result Result
Definition: ktypelistutils.h:276
KDE::IfThenElse::Result
T Result
Definition: ktypelistutils.h:241
KTypeListAppend
Concatenates two typelists.
Definition: ktypelistutils.h:83
KTypeListReplaceBegin
Definition: ktypelistutils.h:98
KTypeListAtWithDefault< Types, 0, Default >::Result
Types::Head Result
Definition: ktypelistutils.h:156
KTypeListAppend< KDE::NullType, List2 >::Result
List2 Result
Definition: ktypelistutils.h:91
KDE::IfThenElse< false, T, U >::Result
U Result
Definition: ktypelistutils.h:247
KTypeListAtWithDefault< KDE::NullType, pos, Default >::Result
Default Result
Definition: ktypelistutils.h:162
KTypeListFold
Definition: ktypelistutils.h:274
K_TYPELIST_1
#define K_TYPELIST_1(T1)
Definition: ktypelist.h:103
KDE::IfEqualThenElse::Result
Else Result
Definition: ktypelistutils.h:253
KDE::NullType
This empty class serves as a terminal marker for typelists.
KTypeListForeach
Definition: ktypelistutils.h:175
KTypeList
The building block of typelists of any length.
Definition: ktypelist.h:453
KDE::SameTypes
Definition: ktypelistutils.h:214
KTypeListAfterPivot
Definition: ktypelistutils.h:309
KTypeListPop
Pop last element.
Definition: ktypelistutils.h:53
KTypeListPop< K_TYPELIST_1(Type)>::Result
KDE::NullType Result
Definition: ktypelistutils.h:61
KDE::IfEqualThenElse< FS, FS, Then, Else >::Result
Then Result
Definition: ktypelistutils.h:259
NC
#define NC(...)
ktypelistutils.h Various templates to handle typelists in meta-programming.
Definition: ktypelistutils.h:32
KTypeListAtWithDefault::Result
KTypeListAt< typename Types::Tail, pos-1 >::Result Result
Definition: ktypelistutils.h:150
KTypeListAtWithDefault
Like KTypeListAt.
Definition: ktypelistutils.h:146
KTypeListContains
Definition: ktypelistutils.h:191
KDE
Definition: netsupp.cpp:1246
KTypeListEnd::Result
KTypeListEnd< typename Types::Tail >::Result Result
Definition: ktypelistutils.h:70
KTypeListAtWithDefault< KDE::NullType, 0, Default >::Result
Default Result
Definition: ktypelistutils.h:168
KTypeListBeforePivot::STATIC_FOLD
typedef STATIC_FOLD(List, Impl, KDE::NullType) Result
KTypeListReplaceBegin< Types, KDE::NullType >::Result
Types Result
Definition: ktypelistutils.h:106
KTypeListPush
Push Type.
Definition: ktypelistutils.h:38
KTypeListEnd
Get last element.
Definition: ktypelistutils.h:68
KTypeListAppend::Result
KTypeList< typename List1::Head, typename KTypeListAppend< typename List1::Tail, List2 >::Result > Result
Definition: ktypelistutils.h:85
KTypeListPush::Result
KTypeList< typename Types::Head, typename KTypeListPush< typename Types::Tail, Type >::Result > Result
Definition: ktypelistutils.h:40
KTypeListReplaceBegin< KDE::NullType, Replace >::Result
KDE::NullType Result
Definition: ktypelistutils.h:112
KTypeListPop::Result
KTypeList< typename Types::Head, typename KTypeListPop< typename Types::Tail >::Result > Result
Definition: ktypelistutils.h:55
KTypeListAt
Index-Operator.
Definition: ktypelistutils.h:119
KTypeListBeforePivot
Definition: ktypelistutils.h:321
Kuit::Tag::List
Definition: kuitsemantics.cpp:84
KDE::IfThenElse
Definition: ktypelistutils.h:239
KTypeListSort
Slow Quick-Sort.
Definition: ktypelistutils.h:336
KTypeListReplaceBegin::Result
KTypeList< typename Replace::Head, typename KTypeListReplaceBegin< typename Types::Tail, typename Replace::Tail >::Result > Result
Definition: ktypelistutils.h:100
KTypeListRevert::STATIC_FOLD
typedef STATIC_FOLD(List, Impl, KDE::NullType) Result
KTypeListContains::value
Definition: ktypelistutils.h:193
KTypeListForeach< KDE::NullType, Manip >::Result
KDE::NullType Result
Definition: ktypelistutils.h:184
KTypeListSort::Result
KTypeListAppend< typename KTypeListSort< typename KTypeListBeforePivot< typename List::Tail, typename List::Head, Comparator >::Result, Comparator >::Result, KTypeList< typename List::Head, typename KTypeListSort< typename KTypeListAfterPivot< typename List::Tail, typename List::Head, Comparator >::Result, Comparator >::Result > >::Result Result
Definition: ktypelistutils.h:354
This file is part of the KDE documentation.
Documentation copyright © 1996-2016 The KDE developers.
Generated on Thu Feb 18 2016 12:19:41 by doxygen 1.8.10 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDECore

Skip menu "KDECore"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs-4.14.14 API Reference

Skip menu "kdelibs-4.14.14 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal