Change copyrights from Nokia to Digia
[profile/ivi/qtxmlpatterns.git] / src / xmlpatterns / functions / qabstractfunctionfactory_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_AbstractFunctionFactory_H
53 #define Patternist_AbstractFunctionFactory_H
54
55 #include <private/qcommonnamespaces_p.h>
56 #include <private/qfunctionfactory_p.h>
57 #include <private/qfunctionsignature_p.h>
58
59 QT_BEGIN_HEADER
60
61 QT_BEGIN_NAMESPACE
62
63 namespace QPatternist
64 {
65
66     /**
67      * @short Supplies convenience code for the function factories.
68      *
69      * @ingroup Patternist_functions
70      * @see XPath10CoreFunctions
71      * @see XPath20CoreFunctions
72      * @see XSLT10CoreFunctions
73      * @author Vincent Ricard <magic@magicninja.org>
74      */
75     class AbstractFunctionFactory : public FunctionFactory
76     {
77     public:
78         virtual Expression::Ptr createFunctionCall(const QXmlName name,
79                                                    const Expression::List &arguments,
80                                                    const StaticContext::Ptr &context,
81                                                    const SourceLocationReflection *const r);
82
83         virtual FunctionSignature::Hash functionSignatures() const;
84
85     protected:
86         /**
87          * This function is responsible for creating the actual Expression, corresponding
88          * to @p localName and the function signature @p sign. It is called by
89          * createFunctionCall(), once it have been determined the function actually
90          * exists and have the correct arity.
91          *
92          * This function will only be called for names in the @c fn namespace.
93          */
94         virtual Expression::Ptr retrieveExpression(const QXmlName name,
95                                                    const Expression::List &args,
96                                                    const FunctionSignature::Ptr &sign) const = 0;
97
98         inline
99         FunctionSignature::Ptr addFunction(const QXmlName::LocalNameCode localName,
100                                            const FunctionSignature::Arity minArgs,
101                                            const FunctionSignature::Arity maxArgs,
102                                            const SequenceType::Ptr &returnType,
103                                            const Expression::Properties props)
104         {
105             return addFunction(localName,
106                                minArgs,
107                                maxArgs,
108                                returnType,
109                                Expression::IDIgnorableExpression,
110                                props);
111         }
112
113         FunctionSignature::Ptr addFunction(const QXmlName::LocalNameCode &localName,
114                                            const FunctionSignature::Arity minArgs,
115                                            const FunctionSignature::Arity maxArgs,
116                                            const SequenceType::Ptr &returnType,
117                                            const Expression::ID id = Expression::IDIgnorableExpression,
118                                            const Expression::Properties props = Expression::Properties(),
119                                            const StandardNamespaces::ID ns = StandardNamespaces::fn)
120         {
121             const QXmlName name(ns, localName);
122
123             const FunctionSignature::Ptr s(new FunctionSignature(name, minArgs, maxArgs,
124                                                                  returnType, props, id));
125
126             m_signatures.insert(name, s);
127             return s;
128         }
129
130         static inline QXmlName::LocalNameCode argument(const NamePool::Ptr &np, const char *const name)
131         {
132             return np->allocateLocalName(QLatin1String(name));
133         }
134
135         FunctionSignature::Hash m_signatures;
136
137     private:
138         /**
139          * @short Determines whether @p arity is a valid number of
140          * arguments for the function with signature @p sign.
141          *
142          * If it is not, a static error with error code ReportContext::XPST0017
143          * is issued via @p context.
144          */
145         void verifyArity(const FunctionSignature::Ptr &sign,
146                          const StaticContext::Ptr &context,
147                          const xsInteger arity,
148                          const SourceLocationReflection *const r) const;
149
150     };
151 }
152
153 QT_END_NAMESPACE
154
155 QT_END_HEADER
156
157 #endif