Change copyrights from Nokia to Digia
[profile/ivi/qtxmlpatterns.git] / src / xmlpatterns / data / qatomicmathematicians_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_AtomicMathematicians_H
53 #define Patternist_AtomicMathematicians_H
54
55 #include <private/qatomicmathematician_p.h>
56 #include <private/qsourcelocationreflection_p.h>
57
58 /**
59  * @file
60  * @short Contains classes performing arithemetic operations between atomic values, such as
61  * subtracting two dates.
62  */
63
64 QT_BEGIN_HEADER
65
66 QT_BEGIN_NAMESPACE
67
68 namespace QPatternist
69 {
70     /**
71      *
72      * @ingroup Patternist_xdm
73      * @author Frans Englich <frans.englich@nokia.com>
74      */
75     class DecimalMathematician : public AtomicMathematician
76                                , public DelegatingSourceLocationReflection
77     {
78     public:
79         inline DecimalMathematician(const SourceLocationReflection *const r) : DelegatingSourceLocationReflection(r)
80         {
81         }
82
83         virtual Item calculate(const Item &o1,
84                                const Operator op,
85                                const Item &o2,
86                                const QExplicitlySharedDataPointer<DynamicContext> &context) const;
87     };
88
89     /**
90      * @short Performs arithmetics between Integer values.
91      *
92      * @ingroup Patternist_xdm
93      * @author Frans Englich <frans.englich@nokia.com>
94      */
95     class IntegerMathematician : public AtomicMathematician
96                                , public DelegatingSourceLocationReflection
97     {
98     public:
99         inline IntegerMathematician(const SourceLocationReflection *const r) : DelegatingSourceLocationReflection(r)
100         {
101         }
102
103         virtual Item calculate(const Item &o1,
104                                const Operator op,
105                                const Item &o2,
106                                const QExplicitlySharedDataPointer<DynamicContext> &context) const;
107     };
108
109     /**
110      * @short Performs division or multiplication between either DayTimeDuration or YearMonthDuration
111      * and Double values.
112      *
113      * @ingroup Patternist_xdm
114      * @author Frans Englich <frans.englich@nokia.com>
115      */
116     class DurationNumericMathematician : public AtomicMathematician
117                                        , public DelegatingSourceLocationReflection
118     {
119     public:
120         inline DurationNumericMathematician(const SourceLocationReflection *const r) : DelegatingSourceLocationReflection(r)
121         {
122         }
123
124         virtual Item calculate(const Item &o1,
125                                const Operator op,
126                                const Item &o2,
127                                const QExplicitlySharedDataPointer<DynamicContext> &context) const;
128     };
129
130     /**
131      * @short Performs division between DayTimeDuration and DayTimeDuration, or
132      * YearMonthDuration and YearMonthDuration.
133      *
134      * @ingroup Patternist_xdm
135      * @author Frans Englich <frans.englich@nokia.com>
136      */
137     class DurationDurationDivisor : public AtomicMathematician
138     {
139     public:
140         virtual Item calculate(const Item &o1,
141                                const Operator op,
142                                const Item &o2,
143                                const QExplicitlySharedDataPointer<DynamicContext> &context) const;
144     };
145
146     /**
147      * @short Performs arithmetics between DayTimeDuration and DayTimeDuration, or
148      * YearMonthDuration and YearMonthDuration.
149      *
150      * @ingroup Patternist_xdm
151      * @author Frans Englich <frans.englich@nokia.com>
152      */
153     class DurationDurationMathematician : public AtomicMathematician
154     {
155     public:
156         virtual Item calculate(const Item &o1,
157                                const Operator op,
158                                const Item &o2,
159                                const QExplicitlySharedDataPointer<DynamicContext> &context) const;
160     };
161
162     /**
163      * @short Delegates an AtomicMathematician and switches its operands.
164      *
165      * Switches the operands of the call to a call to the calculate()
166      * on an AtomicMathematician such that the left operand becomes the right, and
167      * vice versa.
168      *
169      * Its constructor takes an AtomicMathematician instance which this OperandSwitcherMathematician
170      * should act as as a middle-man for, having the role of switching the two operands. Thus,
171      * OperandSwitcherMathematician can be described as a proxy or delegator class.
172      *
173      * This class is used for implementing operator combinations such as
174      * <tt>numeric * xs:yearMonthDuration</tt> and
175      * <tt>xs:yearMonthDuration * numeric</tt>.
176      *
177      * @ingroup Patternist_xdm
178      * @author Frans Englich <frans.englich@nokia.com>
179      */
180     class OperandSwitcherMathematician : public AtomicMathematician
181     {
182     public:
183         /**
184          * Creates an OperandSwitcherMathematician.
185          *
186          * @param mathematician the AtomicMathematician this OperandSwitcherMathematician
187          * should switch the operands for. Must be a non @c null, valid pointer.
188          */
189         OperandSwitcherMathematician(const AtomicMathematician::Ptr &mathematician);
190
191         /**
192          * Switch @p o1 and @p o2, and returns the value from the AtomicMathematician
193          * this OperandSwitcherMathematician represents.
194          */
195         virtual Item calculate(const Item &o1,
196                                const Operator op,
197                                const Item &o2,
198                                const QExplicitlySharedDataPointer<DynamicContext> &context) const;
199     private:
200         const AtomicMathematician::Ptr m_mather;
201     };
202
203     /**
204      * @short Performs arithmetics between an AbstractDateTime value and
205      * an AbstractDuration value.
206      *
207      * @ingroup Patternist_xdm
208      * @author Frans Englich <frans.englich@nokia.com>
209      */
210     class DateTimeDurationMathematician : public AtomicMathematician
211                                         , public DelegatingSourceLocationReflection
212     {
213     public:
214
215         inline DateTimeDurationMathematician(const SourceLocationReflection *const r) : DelegatingSourceLocationReflection(r)
216         {
217         }
218
219         /**
220          * @p o1 is an AbstractDateTime and @p o2 is an AbstractDuration.
221          *
222          */
223         virtual Item calculate(const Item &o1,
224                                const Operator op,
225                                const Item &o2,
226                                const QExplicitlySharedDataPointer<DynamicContext> &context) const;
227     };
228
229     /**
230      * @short Performs arithmetics between two AbstractDateTime values.
231      *
232      * @ingroup Patternist_xdm
233      * @author Frans Englich <frans.englich@nokia.com>
234      */
235     class AbstractDateTimeMathematician : public AtomicMathematician
236     {
237     public:
238         virtual Item calculate(const Item &o1,
239                                const Operator op,
240                                const Item &o2,
241                                const QExplicitlySharedDataPointer<DynamicContext> &context) const;
242     };
243 }
244
245 QT_END_NAMESPACE
246
247 QT_END_HEADER
248
249 #endif