Change copyrights from Nokia to Digia
[profile/ivi/qtxmlpatterns.git] / src / xmlpatterns / functions / qpatternplatform_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
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 Digia.  For licensing terms and
14 ** conditions see http://qt.digia.com/licensing.  For further information
15 ** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights.  These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file.  Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 //
43 //  W A R N I N G
44 //  -------------
45 //
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.
49 //
50 // We mean it.
51
52 #ifndef Patternist_PatternPlatform_H
53 #define Patternist_PatternPlatform_H
54
55 #include <QFlags>
56 #include <QRegExp>
57
58 #include <private/qfunctioncall_p.h>
59
60 QT_BEGIN_HEADER
61
62 QT_BEGIN_NAMESPACE
63
64 namespace QPatternist
65 {
66     /**
67      * @short Contains functionality for functions and expressions that
68      * uses regular expressions.
69      *
70      * @ingroup Patternist_utils
71      * @author Frans Englich <frans.englich@nokia.com>
72      */
73     class PatternPlatform : public FunctionCall
74     {
75     public:
76         /**
77          * @see <a href="http://www.w3.org/TR/xpath-functions/#flags">XQuery 1.0 and
78          * XPath 2.0 Functions and Operators, 7.6.1.1 Flags</a>
79          */
80         enum Flag
81         {
82             /**
83              * No flags are set. Default behavior is used.
84              */
85             NoFlags             = 0,
86
87             /**
88              * Flag @c s
89              */
90             DotAllMode          = 1,
91
92             /**
93              * Flag @c m
94              */
95             MultiLineMode       = 2,
96
97             /**
98              * Flag @c i
99              */
100             CaseInsensitive     = 4,
101
102             /**
103              * Flag @c x
104              */
105             SimplifyWhitespace  = 8
106         };
107         typedef QFlags<Flag> Flags;
108
109         virtual Expression::Ptr compress(const StaticContext::Ptr &context);
110
111         /**
112          * Retrieves the pattern supplied in the arguments, taking care of compiling it,
113          * settings its flags, and everything else required for getting it ready to use. If an error
114          * occurs, an appropriate error is raised via @p context.
115          */
116         QRegExp pattern(const DynamicContext::Ptr &context) const;
117
118         /**
119          * @returns the number of captures, also called parenthesized sub-expressions, the pattern has.
120          *
121          * If the pattern isn't precompiled, -1 is returned.
122          */
123         inline int captureCount() const;
124
125         /**
126          * @short Parses pattern 
127          */
128         static QRegExp parsePattern(const QString &pattern,
129                                     const ReportContext::Ptr &context,
130                                     const SourceLocationReflection *const location);
131
132
133     protected:
134         /**
135          * @short This constructor is protected, because this class is supposed to be sub-classed.
136          *
137          * @param flagsPosition an index position specifying the operand containing the pattern
138          * flags.
139          */
140         PatternPlatform(const qint8 flagsPosition);
141
142     private:
143         /**
144          * Enum telling whether the flags, pattern, or both
145          * have been compiled at compile time.
146          */
147         enum PreCompiledPart
148         {
149             NoPart          = 0,
150             PatternPrecompiled     = 1,
151             FlagsPrecompiled       = 2,
152             FlagsAndPattern = PatternPrecompiled | FlagsPrecompiled
153
154         };
155         typedef QFlags<PreCompiledPart> PreCompiledParts;
156
157         /**
158          * @short Calls the public parsePattern() function and passes in @c
159          * this as the location.
160          */
161         inline QRegExp parsePattern(const QString &pattern,
162                                     const ReportContext::Ptr &context) const;
163
164         Q_DISABLE_COPY(PatternPlatform)
165
166         Flags parseFlags(const QString &flags,
167                          const DynamicContext::Ptr &context) const;
168
169         static void applyFlags(const Flags flags, QRegExp &pattern);
170
171         /**
172          * The parts that have been pre-compiled at compile time.
173          */
174         PreCompiledParts    m_compiledParts;
175         Flags               m_flags;
176         QRegExp             m_pattern;
177         const qint8         m_flagsPosition;
178     };
179
180     inline int PatternPlatform::captureCount() const
181     {
182         if(m_compiledParts.testFlag(PatternPrecompiled))
183             return m_pattern.captureCount();
184         else
185             return -1;
186     }
187
188     Q_DECLARE_OPERATORS_FOR_FLAGS(PatternPlatform::Flags)
189 }
190
191 QT_END_NAMESPACE
192
193 QT_END_HEADER
194
195 #endif