• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 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
37template<class Types, typename Type>
38struct KTypeListPush
39{
40 typedef KTypeList<typename Types::Head, typename KTypeListPush<typename Types::Tail, Type>::Result> Result;
41};
42
43template<typename Type>
44struct KTypeListPush<KDE::NullType, Type>
45{
46 typedef K_TYPELIST_1(Type) Result;
47};
48
52template<class Types>
53struct KTypeListPop
54{
55 typedef KTypeList<typename Types::Head, typename KTypeListPop<typename Types::Tail>::Result> Result;
56};
57
58template<class Type>
59struct KTypeListPop<K_TYPELIST_1(Type)>
60{
61 typedef KDE::NullType Result;
62};
63
67template<class Types>
68struct KTypeListEnd
69{
70 typedef typename KTypeListEnd<typename Types::Tail>::Result Result;
71};
72
73template<class Type>
74struct KTypeListEnd<K_TYPELIST_1(Type)>
75{
76 typedef Type Result;
77};
78
82template<class List1, class List2>
83struct KTypeListAppend
84{
85 typedef KTypeList<typename List1::Head, typename KTypeListAppend<typename List1::Tail, List2>::Result> Result;
86};
87
88template<class List2>
89struct KTypeListAppend<KDE::NullType, List2>
90{
91 typedef List2 Result;
92};
93
97template<class Types, class Replace>
98struct KTypeListReplaceBegin
99{
100 typedef KTypeList<typename Replace::Head, typename KTypeListReplaceBegin<typename Types::Tail, typename Replace::Tail>::Result> Result;
101};
102
103template<class Types>
104struct KTypeListReplaceBegin<Types, KDE::NullType>
105{
106 typedef Types Result;
107};
108
109template<class Replace>
110struct KTypeListReplaceBegin<KDE::NullType, Replace>
111{
112 typedef KDE::NullType Result;
113};
114
118template<class Types, std::size_t pos>
119struct KTypeListAt
120{
121 typedef typename KTypeListAt<
122 typename Types::Tail, pos - 1>::Result
123 Result;
124};
125
126template<class Types>
127struct KTypeListAt<Types, 0>
128{
129 typedef typename Types::Head Result;
130};
131
132template<std::size_t pos>
133struct KTypeListAt<KDE::NullType, pos>
134{
135};
136
137template<>
138struct KTypeListAt<KDE::NullType, 0>
139{
140};
141
145template<class Types, std::size_t pos, typename Default>
146struct KTypeListAtWithDefault
147{
148 typedef typename KTypeListAt<
149 typename Types::Tail, pos - 1>::Result
150 Result;
151};
152
153template<class Types, typename Default>
154struct KTypeListAtWithDefault<Types, 0, Default>
155{
156 typedef typename Types::Head Result;
157};
158
159template<std::size_t pos, typename Default>
160struct KTypeListAtWithDefault<KDE::NullType, pos, Default>
161{
162 typedef Default Result;
163};
164
165template<typename Default>
166struct KTypeListAtWithDefault<KDE::NullType, 0, Default>
167{
168 typedef Default Result;
169};
170
174template<class Types, template<typename> class Manip>
175class KTypeListForeach
176{
177public:
178 typedef KTypeList<typename Manip<typename Types::Head>::Result, typename KTypeListForeach<typename Types::Tail, Manip>::Result> Result;
179};
180
181template<template<typename> class Manip>
182struct KTypeListForeach<KDE::NullType, Manip>
183{
184 typedef KDE::NullType Result;
185};
186
190template<class Types, typename Type>
191struct KTypeListContains
192{
193 enum { value = KTypeListContains<typename Types::Tail, Type>::value };
194};
195
196template<class Tail, typename Type>
197struct KTypeListContains<KTypeList<Type, Tail>, Type>
198{
199 enum { value = true };
200};
201
202template<typename Type>
203struct KTypeListContains<KDE::NullType, Type>
204{
205 enum { value = false };
206};
207
208namespace KDE
209{
213template<typename T, typename U>
214struct SameTypes
215{
216 enum { value = false };
217};
218
219template<typename T>
220struct 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
236namespace KDE
237{
238template<bool cond, typename T, typename U>
239struct IfThenElse
240{
241 typedef T Result;
242};
243
244template<typename T, typename U>
245struct IfThenElse<false, T, U>
246{
247 typedef U Result;
248};
249
250template<typename First, typename Second, typename Then, typename Else>
251struct IfEqualThenElse
252{
253 typedef Else Result;
254};
255
256template<typename FS, typename Then, typename Else>
257struct 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
273template<class List, template<typename, typename> class Folder, typename Start = KDE::NullType>
274struct KTypeListFold
275{
276 typedef typename KTypeListFold<typename List::Tail, Folder, typename Folder<Start, typename List::Head>::Result>::Result Result;
277};
278
279template<template<typename, typename> class Folder, typename Start>
280struct 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
295template<class List>
296struct KTypeListRevert
297{
298private:
299 template<typename Value, typename Current>
300 struct Impl
301 {
302 typedef KTypeList<Current, Value> Result;
303 };
304public:
305 typedef STATIC_FOLD(List, Impl, KDE::NullType) Result;
306};
307
308template<class List, typename Pivot, template<typename A, typename B> class Comparator>
309class 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 };
316public:
317 typedef STATIC_FOLD(List, Impl, KDE::NullType) Result;
318};
319
320template<class List, typename Pivot, template<typename A, typename B> class Comparator>
321class 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 };
328public:
329 typedef STATIC_FOLD(List, Impl, KDE::NullType) Result;
330};
331
335template<class List, template<typename A, typename B> class Comparator>
336struct 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
357template<template<typename A, typename B> class Comparator>
358struct KTypeListSort<KDE::NullType, Comparator>
359{
360 typedef KDE::NullType Result;
361};
362
363#undef NC
364
365#endif
NullType
This empty class serves as a terminal marker for typelists.
KTypeListAfterPivot
Definition: ktypelistutils.h:310
KTypeListAfterPivot::STATIC_FOLD
typedef STATIC_FOLD(List, Impl, KDE::NullType) Result
KTypeListBeforePivot
Definition: ktypelistutils.h:322
KTypeListBeforePivot::STATIC_FOLD
typedef STATIC_FOLD(List, Impl, KDE::NullType) Result
KTypeListForeach
Definition: ktypelistutils.h:176
KTypeListForeach::Result
KTypeList< typename Manip< typename Types::Head >::Result, typename KTypeListForeach< typename Types::Tail, Manip >::Result > Result
Definition: ktypelistutils.h:178
T
#define T
ktypelist.h
This file defines typelist structures as well as convenience macros to create typelists.
K_TYPELIST_1
#define K_TYPELIST_1(T1)
Definition: ktypelist.h:103
STATIC_IF
#define STATIC_IF(expr, T, U)
If expr: T, else: U.
Definition: ktypelistutils.h:266
NC
#define NC(...)
@File ktypelistutils.h Various templates to handle typelists in meta-programming.
Definition: ktypelistutils.h:32
KDE
Definition: netsupp.cpp:1247
KDE::IfEqualThenElse< FS, FS, Then, Else >::Result
Then Result
Definition: ktypelistutils.h:259
KDE::IfEqualThenElse
Definition: ktypelistutils.h:252
KDE::IfEqualThenElse::Result
Else Result
Definition: ktypelistutils.h:253
KDE::IfThenElse< false, T, U >::Result
U Result
Definition: ktypelistutils.h:247
KDE::IfThenElse
Definition: ktypelistutils.h:240
KDE::IfThenElse::Result
T Result
Definition: ktypelistutils.h:241
KDE::SameTypes
Definition: ktypelistutils.h:215
KDE::SameTypes::value
@ value
Definition: ktypelistutils.h:216
KTypeListAppend< KDE::NullType, List2 >::Result
List2 Result
Definition: ktypelistutils.h:91
KTypeListAppend
Concatenates two typelists.
Definition: ktypelistutils.h:84
KTypeListAppend::Result
KTypeList< typename List1::Head, typename KTypeListAppend< typename List1::Tail, List2 >::Result > Result
Definition: ktypelistutils.h:85
KTypeListAtWithDefault< KDE::NullType, 0, Default >::Result
Default Result
Definition: ktypelistutils.h:168
KTypeListAtWithDefault< KDE::NullType, pos, Default >::Result
Default Result
Definition: ktypelistutils.h:162
KTypeListAtWithDefault< Types, 0, Default >::Result
Types::Head Result
Definition: ktypelistutils.h:156
KTypeListAtWithDefault
Like KTypeListAt.
Definition: ktypelistutils.h:147
KTypeListAtWithDefault::Result
KTypeListAt< typenameTypes::Tail, pos-1 >::Result Result
Definition: ktypelistutils.h:150
KTypeListAt< Types, 0 >::Result
Types::Head Result
Definition: ktypelistutils.h:129
KTypeListAt
Index-Operator.
Definition: ktypelistutils.h:120
KTypeListAt::Result
KTypeListAt< typenameTypes::Tail, pos-1 >::Result Result
Definition: ktypelistutils.h:123
KTypeListContains
Definition: ktypelistutils.h:192
KTypeListContains::value
@ value
Definition: ktypelistutils.h:193
KTypeListEnd< K_TYPELIST_1(Type)>::Result
Type Result
Definition: ktypelistutils.h:76
KTypeListEnd
Get last element.
Definition: ktypelistutils.h:69
KTypeListEnd::Result
KTypeListEnd< typenameTypes::Tail >::Result Result
Definition: ktypelistutils.h:70
KTypeListFold< KDE::NullType, Folder, Start >::Result
Start Result
Definition: ktypelistutils.h:282
KTypeListFold
Definition: ktypelistutils.h:275
KTypeListFold::Result
KTypeListFold< typenameList::Tail, Folder, typenameFolder< Start, typenameList::Head >::Result >::Result Result
Definition: ktypelistutils.h:276
KTypeListForeach< KDE::NullType, Manip >::Result
KDE::NullType Result
Definition: ktypelistutils.h:184
KTypeListPop< K_TYPELIST_1(Type)>::Result
KDE::NullType Result
Definition: ktypelistutils.h:61
KTypeListPop
Pop last element.
Definition: ktypelistutils.h:54
KTypeListPop::Result
KTypeList< typename Types::Head, typename KTypeListPop< typename Types::Tail >::Result > Result
Definition: ktypelistutils.h:55
KTypeListPush< KDE::NullType, Type >::K_TYPELIST_1
typedef K_TYPELIST_1(Type) Result
KTypeListPush
Push Type.
Definition: ktypelistutils.h:39
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
KTypeListReplaceBegin< Types, KDE::NullType >::Result
Types Result
Definition: ktypelistutils.h:106
KTypeListReplaceBegin
Definition: ktypelistutils.h:99
KTypeListReplaceBegin::Result
KTypeList< typename Replace::Head, typename KTypeListReplaceBegin< typename Types::Tail, typename Replace::Tail >::Result > Result
Definition: ktypelistutils.h:100
KTypeListRevert
Definition: ktypelistutils.h:297
KTypeListRevert::STATIC_FOLD
typedef STATIC_FOLD(List, Impl, KDE::NullType) Result
KTypeListSort< KDE::NullType, Comparator >::Result
KDE::NullType Result
Definition: ktypelistutils.h:360
KTypeListSort
Slow Quick-Sort.
Definition: ktypelistutils.h:337
KTypeListSort::Result
KTypeListAppend< typenameKTypeListSort< typenameKTypeListBeforePivot< typenameList::Tail, typenameList::Head, Comparator >::Result, Comparator >::Result, KTypeList< typenameList::Head, typenameKTypeListSort< typenameKTypeListAfterPivot< typenameList::Tail, typenameList::Head, Comparator >::Result, Comparator >::Result > >::Result Result
Definition: ktypelistutils.h:354
KTypeList
The building block of typelists of any length.
Definition: ktypelist.h:454
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 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.38 API Reference

Skip menu "kdelibs-4.14.38 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