source: trunk/src/xmlpatterns/functions/qfunctionsignature_p.h@ 447

Last change on this file since 447 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 8.3 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the QtXmlPatterns module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
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_FunctionSignature_H
53#define Patternist_FunctionSignature_H
54
55template<typename Key, typename Value> class QHash;
56template<typename T> class QList;
57
58#include <QSharedData>
59
60#include "qcalltargetdescription_p.h"
61#include "qexpression_p.h"
62#include "qfunctionargument_p.h"
63#include "qpatternistlocale_p.h"
64#include "qprimitives_p.h"
65
66QT_BEGIN_HEADER
67
68QT_BEGIN_NAMESPACE
69
70namespace QPatternist
71{
72
73 /**
74 * @short Represents the signature of an XPath function.
75 *
76 * FunctionSignature represents and allows inspection of a function signature,
77 * such as <tt>fn:string-join($arg1 as xs:string*, $arg2 as xs:string) as xs:string</tt>.
78 * No XPath related languages allows polymorphism on the type of the arguments, only the
79 * amount(arity) of the arguments. For example, <tt>fn:string() as xs:string</tt> and
80 * <tt>fn:string($arg as item()?) as xs:string</tt> can happily co-exist, but
81 * <tt>fn:string($arg as item()?) as xs:string</tt> and
82 * <tt>fn:string($arg as xs:anyAtomicType?) as xs:string</tt> would be an error. This
83 * fact is reflected by FunctionSignature that if minimumArguments() and maximumArguments()
84 * are not equal, it means that this FunctionSignature represents several
85 * function signatures.
86 *
87 * @ingroup Patternist_functions
88 * @see <a href="http://www.w3.org/TR/xpath-functions/#func-signatures">XQuery 1.0 and
89 * XPath 2.0 Functions and Operators, 1.4 Function Signatures and Descriptions</a>
90 * @see <a href="http://en.wikipedia.org/wiki/Arity">Wikipedia, the free encyclopedia, Arity</a>
91 * @author Frans Englich <[email protected]>
92 */
93 class Q_AUTOTEST_EXPORT FunctionSignature : public CallTargetDescription
94 {
95 public:
96 enum
97 {
98 /**
99 * Flags the function as allowing an unlimited amount of arguments.
100 */
101 UnlimitedArity = -1
102 };
103
104 typedef QExplicitlySharedDataPointer<FunctionSignature> Ptr;
105 typedef QHash<QXmlName, FunctionSignature::Ptr> Hash;
106 typedef QList<FunctionSignature::Ptr> List;
107
108 /**
109 * A number which tells the amount of arguments a function has.
110 */
111 typedef qint16 Arity;
112
113 FunctionSignature(const QXmlName name,
114 const Arity minArgs,
115 const Arity maxArgs,
116 const SequenceType::Ptr &returnType,
117 const Expression::Properties chars = Expression::Properties(),
118 const Expression::ID id = Expression::IDIgnorableExpression);
119
120 void setArguments(const FunctionArgument::List &args);
121 FunctionArgument::List arguments() const;
122
123 /**
124 * This is a convenience function. Calling this once, is equal to
125 * calling setArguments() with a list containing a FunctionsArgument with name @p name
126 * and type @p type.
127 */
128 void appendArgument(const QXmlName::LocalNameCode name,
129 const SequenceType::Ptr &type);
130
131 /**
132 * Checks whether @p arity is within the range of allowed count of arguments. For example,
133 * when the minimum arguments is 1 and maximum arguments 2, @c false will be returned for
134 * passing 0 while @c true will be returned when 2 is passed.
135 */
136 bool isArityValid(const xsInteger arity) const;
137
138 Arity minimumArguments() const;
139 Arity maximumArguments() const;
140
141 /**
142 * The return type of this function signature. For example, if the represented function
143 * signature is <tt>fn:string() as xs:string</tt>, the return type is <tt>xs:string</tt>.
144 */
145 SequenceType::Ptr returnType() const;
146
147 /**
148 * The properties that the corresponding FunctionCall instance should return in
149 * Expression::properties().
150 */
151 Expression::Properties properties() const;
152
153 /**
154 * Determines whether this FunctionSignature is equal to @p other, taking
155 * into account XPath's function polymorphism. @p other is equal to this
156 * FunctionSignature if their name() instances are equal, and that the maximumArguments()
157 * and minimumArguments() arguments of @p other are allowed, as per isArityValid().
158 *
159 * In other words, this equalness operator can return @c true for different
160 * signatures, but it do make sense since a FunctionSignature can represent
161 * multiple signatures.
162 *
163 * @returns @c true if this FunctionSignature is equal to @p other, otherwise @c false
164 */
165 bool operator==(const FunctionSignature &other) const;
166
167 /**
168 * Builds a string representation for this function signature. The syntax
169 * used is the one used in the XQuery. It looks like this:
170 *
171 * <tt>prefix:function-name($parameter-name as parameter-type, ...) as return-type</tt>
172 *
173 * The prefix used for the name is conventional. For example, for constructor functions
174 * is @c xs used.
175 *
176 * @see <a href="http://www.w3.org/TR/xpath-functions/#func-signatures">XQuery 1.0 and
177 * XPath 2.0 Functions and Operators, 1.4 Function Signatures and Descriptions</a>
178 */
179 QString displayName(const NamePool::Ptr &np) const;
180
181 /**
182 * The ID that the corresponding FunctionCall instance should return in
183 * Expression::id().
184 */
185 Expression::ID id() const;
186
187 private:
188 Q_DISABLE_COPY(FunctionSignature)
189
190 const Arity m_minArgs;
191 const Arity m_maxArgs;
192 const SequenceType::Ptr m_returnType;
193 FunctionArgument::List m_arguments;
194 const Expression::Properties m_props;
195 const Expression::ID m_id;
196 };
197
198 /**
199 * @short Formats FunctionSignature.
200 */
201 static inline QString formatFunction(const NamePool::Ptr &np, const FunctionSignature::Ptr &func)
202 {
203 return QLatin1String("<span class='XQuery-function'>") +
204 escape(func->displayName(np)) +
205 QLatin1String("</span>");
206 }
207}
208
209QT_END_NAMESPACE
210
211QT_END_HEADER
212
213#endif
Note: See TracBrowser for help on using the repository browser.