1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the QtXmlPatterns module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
46 // This file is not part of the Qt API. It exists purely as an
47 // implementation detail. This header file may change from version to
48 // version without notice, or even be removed.
52 #ifndef Patternist_AtomicTypeDispatch_H
53 #define Patternist_AtomicTypeDispatch_H
55 #include <QSharedData>
66 class Base64BinaryType;
70 class DayTimeDurationType;
84 class SourceLocationReflection;
87 class UntypedAtomicType;
88 class YearMonthDurationType;
90 enum TypeOfDerivedInteger
96 TypeNonNegativeInteger,
97 TypeNonPositiveInteger,
106 template<TypeOfDerivedInteger DerivedType> class DerivedIntegerType;
108 enum TypeOfDerivedString
111 TypeNormalizedString,
122 template<TypeOfDerivedString DerivedType> class DerivedStringType;
125 * @todo Documentation's missing:
126 * - Add link to wikipedia's "multiple dispatch" and "visitor" page.
127 * - Add link to http://www.eptacom.net/pubblicazioni/pub_eng/mdisp.html
129 * @defgroup Patternist_types_dispatch Atomic Type Dispatching
135 * @ingroup Patternist_types_dispatch
136 * @author Frans Englich <frans.englich@nokia.com>
138 class AtomicTypeVisitorResult : public QSharedData
141 typedef QExplicitlySharedDataPointer<AtomicTypeVisitorResult> Ptr;
142 AtomicTypeVisitorResult() {}
143 virtual ~AtomicTypeVisitorResult() {}
149 * @see ParameterizedAtomicTypeVisitor
150 * @ingroup Patternist_types_dispatch
151 * @author Frans Englich <frans.englich@nokia.com>
153 class AtomicTypeVisitor : public QSharedData
156 typedef QExplicitlySharedDataPointer<AtomicTypeVisitor> Ptr;
157 virtual ~AtomicTypeVisitor() {}
159 virtual AtomicTypeVisitorResult::Ptr visit(const AnyAtomicType *,
160 const SourceLocationReflection *const reflection) const = 0;
161 virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *,
162 const SourceLocationReflection *const reflection) const = 0;
163 virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *,
164 const SourceLocationReflection *const reflection) const = 0;
165 virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *,
166 const SourceLocationReflection *const reflection) const = 0;
167 virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *,
168 const SourceLocationReflection *const reflection) const = 0;
169 virtual AtomicTypeVisitorResult::Ptr visit(const DateType *,
170 const SourceLocationReflection *const reflection) const = 0;
171 virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *,
172 const SourceLocationReflection *const reflection) const = 0;
173 virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *,
174 const SourceLocationReflection *const reflection) const = 0;
175 virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *,
176 const SourceLocationReflection *const reflection) const = 0;
177 virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *,
178 const SourceLocationReflection *const reflection) const = 0;
179 virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *,
180 const SourceLocationReflection *const reflection) const = 0;
181 virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *,
182 const SourceLocationReflection *const reflection) const = 0;
183 virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *,
184 const SourceLocationReflection *const reflection) const = 0;
185 virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *,
186 const SourceLocationReflection *const reflection) const = 0;
187 virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *,
188 const SourceLocationReflection *const reflection) const = 0;
189 virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *,
190 const SourceLocationReflection *const reflection) const = 0;
191 virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *,
192 const SourceLocationReflection *const reflection) const = 0;
193 virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *,
194 const SourceLocationReflection *const reflection) const = 0;
195 virtual AtomicTypeVisitorResult::Ptr visit(const NOTATIONType *,
196 const SourceLocationReflection *const reflection) const = 0;
197 virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *,
198 const SourceLocationReflection *const reflection) const = 0;
199 virtual AtomicTypeVisitorResult::Ptr visit(const StringType *,
200 const SourceLocationReflection *const reflection) const = 0;
201 virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *,
202 const SourceLocationReflection *const reflection) const = 0;
203 virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *,
204 const SourceLocationReflection *const reflection) const = 0;
205 virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *,
206 const SourceLocationReflection *const reflection) const = 0;
212 * @see AtomicTypeVisitor
213 * @ingroup Patternist_types_dispatch
214 * @author Frans Englich <frans.englich@nokia.com>
216 class ParameterizedAtomicTypeVisitor : public QSharedData
219 typedef QExplicitlySharedDataPointer<ParameterizedAtomicTypeVisitor> Ptr;
220 virtual ~ParameterizedAtomicTypeVisitor() {}
222 virtual AtomicTypeVisitorResult::Ptr visit(const AnyAtomicType *, const qint16 param,
223 const SourceLocationReflection *const reflection) const = 0;
224 virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, const qint16 param,
225 const SourceLocationReflection *const reflection) const = 0;
226 virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *, const qint16 param,
227 const SourceLocationReflection *const reflection) const = 0;
228 virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, const qint16 param,
229 const SourceLocationReflection *const reflection) const = 0;
230 virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, const qint16 param,
231 const SourceLocationReflection *const reflection) const = 0;
232 virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, const qint16 param,
233 const SourceLocationReflection *const reflection) const = 0;
234 virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, const qint16 param,
235 const SourceLocationReflection *const reflection) const = 0;
236 virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, const qint16 param,
237 const SourceLocationReflection *const reflection) const = 0;
238 virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, const qint16 param,
239 const SourceLocationReflection *const reflection) const = 0;
240 virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, const qint16 param,
241 const SourceLocationReflection *const reflection) const = 0;
242 virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, const qint16 param,
243 const SourceLocationReflection *const reflection) const = 0;
244 virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *, const qint16 param,
245 const SourceLocationReflection *const reflection) const = 0;
246 virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *, const qint16 param,
247 const SourceLocationReflection *const reflection) const = 0;
248 virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *, const qint16 param,
249 const SourceLocationReflection *const reflection) const = 0;
250 virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *, const qint16 param,
251 const SourceLocationReflection *const reflection) const = 0;
252 virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *, const qint16 param,
253 const SourceLocationReflection *const reflection) const = 0;
254 virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *, const qint16 param,
255 const SourceLocationReflection *const reflection) const = 0;
256 virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, const qint16 param,
257 const SourceLocationReflection *const reflection) const = 0;
258 virtual AtomicTypeVisitorResult::Ptr visit(const NOTATIONType *, const qint16 param,
259 const SourceLocationReflection *const reflection) const = 0;
260 virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *, const qint16 param,
261 const SourceLocationReflection *const reflection) const = 0;
262 virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, const qint16 param,
263 const SourceLocationReflection *const reflection) const = 0;
264 virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, const qint16 param,
265 const SourceLocationReflection *const reflection) const = 0;
266 virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, const qint16 param,
267 const SourceLocationReflection *const reflection) const = 0;
268 virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, const qint16 param,
269 const SourceLocationReflection *const reflection) const = 0;