1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtXmlPatterns module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 //
41 //  W A R N I N G
42 //  -------------
43 //
44 // This file is not part of the Qt API.  It exists purely as an
45 // implementation detail.  This header file may change from version to
46 // version without notice, or even be removed.
47 //
48 // We mean it.
49 
50 #ifndef Patternist_AtomicTypeDispatch_H
51 #define Patternist_AtomicTypeDispatch_H
52 
53 #include <QSharedData>
54 
55 
56 QT_BEGIN_NAMESPACE
57 
58 namespace QPatternist
59 {
60     class AnyAtomicType;
61     class AnyURIType;
62     class Base64BinaryType;
63     class BooleanType;
64     class DateTimeType;
65     class DateType;
66     class DayTimeDurationType;
67     class DecimalType;
68     class DoubleType;
69     class DurationType;
70     class FloatType;
71     class GDayType;
72     class GMonthDayType;
73     class GMonthType;
74     class GYearMonthType;
75     class GYearType;
76     class HexBinaryType;
77     class IntegerType;
78     class NOTATIONType;
79     class QNameType;
80     class SourceLocationReflection;
81     class StringType;
82     class SchemaTimeType;
83     class UntypedAtomicType;
84     class YearMonthDurationType;
85 
86     enum TypeOfDerivedInteger
87     {
88         TypeByte,
89         TypeInt,
90         TypeLong,
91         TypeNegativeInteger,
92         TypeNonNegativeInteger,
93         TypeNonPositiveInteger,
94         TypePositiveInteger,
95         TypeShort,
96         TypeUnsignedByte,
97         TypeUnsignedInt,
98         TypeUnsignedLong,
99         TypeUnsignedShort
100     };
101 
102     template<TypeOfDerivedInteger DerivedType> class DerivedIntegerType;
103 
104     enum TypeOfDerivedString
105     {
106         TypeString,
107         TypeNormalizedString,
108         TypeToken,
109         TypeLanguage,
110         TypeNMTOKEN,
111         TypeName,
112         TypeNCName,
113         TypeID,
114         TypeIDREF,
115         TypeENTITY
116     };
117 
118     template<TypeOfDerivedString DerivedType> class DerivedStringType;
119 
120     /**
121      * @todo Documentation's missing:
122      * - Add link to wikipedia's "multiple dispatch" and "visitor" page.
123      * - Add link to http://www.eptacom.net/pubblicazioni/pub_eng/mdisp.html
124      *
125      * @defgroup Patternist_types_dispatch Atomic Type Dispatching
126      */
127 
128     /**
129      * @todo Docs missing
130      *
131      * @ingroup Patternist_types_dispatch
132      * @author Frans Englich <frans.englich@nokia.com>
133      */
134     class AtomicTypeVisitorResult : public QSharedData
135     {
136     public:
137         typedef QExplicitlySharedDataPointer<AtomicTypeVisitorResult> Ptr;
AtomicTypeVisitorResult()138         AtomicTypeVisitorResult() {}
~AtomicTypeVisitorResult()139         virtual ~AtomicTypeVisitorResult() {}
140     };
141 
142     /**
143      * @todo Docs missing
144      *
145      * @see ParameterizedAtomicTypeVisitor
146      * @ingroup Patternist_types_dispatch
147      * @author Frans Englich <frans.englich@nokia.com>
148      */
149     class AtomicTypeVisitor : public QSharedData
150     {
151     public:
152         typedef QExplicitlySharedDataPointer<AtomicTypeVisitor> Ptr;
~AtomicTypeVisitor()153         virtual ~AtomicTypeVisitor() {}
154 
155         virtual AtomicTypeVisitorResult::Ptr visit(const AnyAtomicType *,
156                                                    const SourceLocationReflection *const reflection) const = 0;
157         virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *,
158                                                    const SourceLocationReflection *const reflection) const = 0;
159         virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *,
160                                                    const SourceLocationReflection *const reflection) const = 0;
161         virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *,
162                                                    const SourceLocationReflection *const reflection) const = 0;
163         virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *,
164                                                    const SourceLocationReflection *const reflection) const = 0;
165         virtual AtomicTypeVisitorResult::Ptr visit(const DateType *,
166                                                    const SourceLocationReflection *const reflection) const = 0;
167         virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *,
168                                                    const SourceLocationReflection *const reflection) const = 0;
169         virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *,
170                                                    const SourceLocationReflection *const reflection) const = 0;
171         virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *,
172                                                    const SourceLocationReflection *const reflection) const = 0;
173         virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *,
174                                                    const SourceLocationReflection *const reflection) const = 0;
175         virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *,
176                                                    const SourceLocationReflection *const reflection) const = 0;
177         virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *,
178                                                    const SourceLocationReflection *const reflection) const = 0;
179         virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *,
180                                                    const SourceLocationReflection *const reflection) const = 0;
181         virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *,
182                                                    const SourceLocationReflection *const reflection) const = 0;
183         virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *,
184                                                    const SourceLocationReflection *const reflection) const = 0;
185         virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *,
186                                                    const SourceLocationReflection *const reflection) const = 0;
187         virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *,
188                                                    const SourceLocationReflection *const reflection) const = 0;
189         virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *,
190                                                    const SourceLocationReflection *const reflection) const = 0;
191         virtual AtomicTypeVisitorResult::Ptr visit(const NOTATIONType *,
192                                                    const SourceLocationReflection *const reflection) const = 0;
193         virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *,
194                                                    const SourceLocationReflection *const reflection) const = 0;
195         virtual AtomicTypeVisitorResult::Ptr visit(const StringType *,
196                                                    const SourceLocationReflection *const reflection) const = 0;
197         virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *,
198                                                    const SourceLocationReflection *const reflection) const = 0;
199         virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *,
200                                                    const SourceLocationReflection *const reflection) const = 0;
201         virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *,
202                                                    const SourceLocationReflection *const reflection) const = 0;
203     };
204 
205     /**
206      * @todo Docs missing
207      *
208      * @see AtomicTypeVisitor
209      * @ingroup Patternist_types_dispatch
210      * @author Frans Englich <frans.englich@nokia.com>
211      */
212     class ParameterizedAtomicTypeVisitor : public QSharedData
213     {
214     public:
215         typedef QExplicitlySharedDataPointer<ParameterizedAtomicTypeVisitor> Ptr;
~ParameterizedAtomicTypeVisitor()216         virtual ~ParameterizedAtomicTypeVisitor() {}
217 
218         virtual AtomicTypeVisitorResult::Ptr visit(const AnyAtomicType *, const qint16 param,
219                                                    const SourceLocationReflection *const reflection) const = 0;
220         virtual AtomicTypeVisitorResult::Ptr visit(const AnyURIType *, const qint16 param,
221                                                    const SourceLocationReflection *const reflection) const = 0;
222         virtual AtomicTypeVisitorResult::Ptr visit(const Base64BinaryType *, const qint16 param,
223                                                    const SourceLocationReflection *const reflection) const = 0;
224         virtual AtomicTypeVisitorResult::Ptr visit(const BooleanType *, const qint16 param,
225                                                    const SourceLocationReflection *const reflection) const = 0;
226         virtual AtomicTypeVisitorResult::Ptr visit(const DateTimeType *, const qint16 param,
227                                                    const SourceLocationReflection *const reflection) const = 0;
228         virtual AtomicTypeVisitorResult::Ptr visit(const DateType *, const qint16 param,
229                                                    const SourceLocationReflection *const reflection) const = 0;
230         virtual AtomicTypeVisitorResult::Ptr visit(const DayTimeDurationType *, const qint16 param,
231                                                    const SourceLocationReflection *const reflection) const = 0;
232         virtual AtomicTypeVisitorResult::Ptr visit(const DecimalType *, const qint16 param,
233                                                    const SourceLocationReflection *const reflection) const = 0;
234         virtual AtomicTypeVisitorResult::Ptr visit(const DoubleType *, const qint16 param,
235                                                    const SourceLocationReflection *const reflection) const = 0;
236         virtual AtomicTypeVisitorResult::Ptr visit(const DurationType *, const qint16 param,
237                                                    const SourceLocationReflection *const reflection) const = 0;
238         virtual AtomicTypeVisitorResult::Ptr visit(const FloatType *, const qint16 param,
239                                                    const SourceLocationReflection *const reflection) const = 0;
240         virtual AtomicTypeVisitorResult::Ptr visit(const GDayType *, const qint16 param,
241                                                    const SourceLocationReflection *const reflection) const = 0;
242         virtual AtomicTypeVisitorResult::Ptr visit(const GMonthDayType *, const qint16 param,
243                                                    const SourceLocationReflection *const reflection) const = 0;
244         virtual AtomicTypeVisitorResult::Ptr visit(const GMonthType *, const qint16 param,
245                                                    const SourceLocationReflection *const reflection) const = 0;
246         virtual AtomicTypeVisitorResult::Ptr visit(const GYearMonthType *, const qint16 param,
247                                                    const SourceLocationReflection *const reflection) const = 0;
248         virtual AtomicTypeVisitorResult::Ptr visit(const GYearType *, const qint16 param,
249                                                    const SourceLocationReflection *const reflection) const = 0;
250         virtual AtomicTypeVisitorResult::Ptr visit(const HexBinaryType *, const qint16 param,
251                                                    const SourceLocationReflection *const reflection) const = 0;
252         virtual AtomicTypeVisitorResult::Ptr visit(const IntegerType *, const qint16 param,
253                                                    const SourceLocationReflection *const reflection) const = 0;
254         virtual AtomicTypeVisitorResult::Ptr visit(const NOTATIONType *, const qint16 param,
255                                                    const SourceLocationReflection *const reflection) const = 0;
256         virtual AtomicTypeVisitorResult::Ptr visit(const QNameType *, const qint16 param,
257                                                    const SourceLocationReflection *const reflection) const = 0;
258         virtual AtomicTypeVisitorResult::Ptr visit(const StringType *, const qint16 param,
259                                                    const SourceLocationReflection *const reflection) const = 0;
260         virtual AtomicTypeVisitorResult::Ptr visit(const SchemaTimeType *, const qint16 param,
261                                                    const SourceLocationReflection *const reflection) const = 0;
262         virtual AtomicTypeVisitorResult::Ptr visit(const UntypedAtomicType *, const qint16 param,
263                                                    const SourceLocationReflection *const reflection) const = 0;
264         virtual AtomicTypeVisitorResult::Ptr visit(const YearMonthDurationType *, const qint16 param,
265                                                    const SourceLocationReflection *const reflection) const = 0;
266     };
267 }
268 
269 QT_END_NAMESPACE
270 
271 #endif
272