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_GenericPredicate_H
51#define Patternist_GenericPredicate_H
52
53#include <private/qpaircontainer_p.h>
54
55QT_BEGIN_NAMESPACE
56
57namespace QPatternist
58{
59 /**
60 * @short A predicate that can handle all kinds of predicates and
61 * is therefore not very efficient, but can cope with all the tricky scenarios.
62 *
63 * @see FirstItemPredicate
64 * @see TruthPredicate
65 * @author Frans Englich <frans.englich@nokia.com>
66 * @ingroup Patternist_expressions
67 */
68 class GenericPredicate : public PairContainer
69 {
70 public:
71
72 /**
73 * Creates a predicate expression that filters the items gained
74 * from evaluating @p sourceExpression through the filter @p predicateExpression.
75 *
76 * This function performs type analyzis on the passed expressions, and may
77 * return more specialized expressions depending on the analyzis.
78 *
79 * If @p predicateExpression is an invalid predicate, an error is issued
80 * via the @p context.
81 */
82 static Expression::Ptr create(const Expression::Ptr &sourceExpression,
83 const Expression::Ptr &predicateExpression,
84 const StaticContext::Ptr &context,
85 const QSourceLocation &location);
86
87 static Expression::Ptr createFirstItem(const Expression::Ptr &sourceExpression);
88
89 /**
90 * Creates a source iterator which is passed to the ItemMappingIterator
91 * and the Focus. The ItemMappingIterator modifies it with
92 * its QAbstractXmlForwardIterator::next() calls, and since the Focus references the same QAbstractXmlForwardIterator,
93 * the focus is automatically moved.
94 */
95 virtual Item::Iterator::Ptr evaluateSequence(const DynamicContext::Ptr &context) const;
96
97 /**
98 * Doesn't return the first item from calling evaluateSequence(), but does the mapping
99 * manually. This avoid allocating an ItemMappingIterator.
100 */
101 virtual Item evaluateSingleton(const DynamicContext::Ptr &context) const;
102
103 inline Item mapToItem(const Item &subject,
104 const DynamicContext::Ptr &) const;
105
106 virtual SequenceType::List expectedOperandTypes() const;
107 virtual SequenceType::Ptr staticType() const;
108 virtual ExpressionVisitorResult::Ptr accept(const ExpressionVisitor::Ptr &visitor) const;
109 virtual ID id() const;
110
111 /**
112 * @returns always CreatesFocusForLast.
113 */
114 virtual Properties properties() const;
115
116 virtual QString description() const;
117
118 protected:
119
120 /**
121 * Creates a GenericPredicate which filters the items from the @p sourceExpression
122 * through @p predicate.
123 *
124 * This constructor is protected. The proper way to create predicates is via the static
125 * create() function.
126 */
127 GenericPredicate(const Expression::Ptr &sourceExpression,
128 const Expression::Ptr &predicate);
129
130 /**
131 * @returns the ItemType of the first operand's staticType().
132 */
133 virtual ItemType::Ptr newFocusType() const;
134
135 private:
136 typedef QExplicitlySharedDataPointer<const GenericPredicate> ConstPtr;
137 };
138}
139
140QT_END_NAMESPACE
141
142#endif
143

source code of qtxmlpatterns/src/xmlpatterns/expr/qgenericpredicate_p.h