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_AbstractDuration_H 51 #define Patternist_AbstractDuration_H 52 53 #include <QRegExp> 54 55 #include <private/qitem_p.h> 56 57 QT_BEGIN_NAMESPACE 58 59 namespace QPatternist 60 { 61 /** 62 * @short Base class for classes implementing durations. 63 * 64 * @see <a href="http://www.w3.org/TR/xmlschema-2/#duration">XML Schema Part 65 * 2: Datatypes Second Edition, 3.2.6 duration</a> 66 * @see <a href="http://www.w3.org/TR/xpath-datamodel/#dates-and-times">XQuery 67 * 1.0 and XPath 2.0 Data Model (XDM), 3.3.2 Dates and Times</a> 68 * @author Frans Englich <frans.englich@nokia.com> 69 * @ingroup Patternist_xdm 70 * @todo Documentation is missing/incomplete 71 */ 72 class AbstractDuration : public AtomicValue 73 { 74 public: 75 typedef QExplicitlySharedDataPointer<AbstractDuration> Ptr; 76 77 /** 78 * @short The amount in milli seconds. 79 */ 80 typedef qint64 Value; 81 82 /** 83 * @short Acts as a mapping table for AbstractDuration::create() 84 * and describes where certain fields in a QRegExp pattern can be found 85 * for a particular W3C XML Schema duration type. 86 * 87 * @author Frans Englich <frans.englich@nokia.com> 88 * @ingroup Patternist_xdm 89 */ 90 class CaptureTable 91 { 92 public: 93 CaptureTable(const QRegExp &exp, 94 const qint8 yearP, 95 const qint8 monthP, 96 const qint8 dayP = -1, 97 const qint8 tDelimiterP = -1, 98 const qint8 hourP = -1, 99 const qint8 minutesP = -1, 100 const qint8 secondsP = -1, regExp(exp)101 const qint8 msecondsP = -1) : regExp(exp), 102 year(yearP), 103 month(monthP), 104 day(dayP), 105 tDelimiter(tDelimiterP), 106 hour(hourP), 107 minutes(minutesP), 108 seconds(secondsP), 109 mseconds(msecondsP) 110 { 111 Q_ASSERT(exp.isValid()); 112 Q_ASSERT(yearP == -1 || yearP == 2); 113 } 114 115 QRegExp regExp; 116 const qint8 year; 117 const qint8 month; 118 const qint8 day; 119 const qint8 tDelimiter; 120 const qint8 hour; 121 const qint8 minutes; 122 const qint8 seconds; 123 const qint8 mseconds; 124 }; 125 126 /** 127 * Determines whether this Duration is equal to @p other. 128 * 129 * @note Do not re-implement this function. It uses getters such as years() and 130 * mseconds() for determining its truth value. 131 */ 132 bool operator==(const AbstractDuration &other) const; 133 134 virtual YearProperty years() const = 0; 135 virtual MonthProperty months() const = 0; 136 virtual DayCountProperty days() const = 0; 137 virtual HourProperty hours() const = 0; 138 virtual MinuteProperty minutes() const = 0; 139 virtual SecondProperty seconds() const = 0; 140 virtual MSecondProperty mseconds() const = 0; 141 142 /** 143 * @returns the value of this AbstractDuration. For example, 144 * in the case of xs:yearMonthDuration, that is YearMonthDuration, 145 * years times twelve plus the months is returned. 146 */ 147 virtual Value value() const = 0; 148 149 /** 150 * A polymorphic factory function that returns instances of the 151 * sub-class with the value @p val. 152 */ 153 virtual Item fromValue(const Value val) const = 0; 154 155 /** 156 * Determines whether this AbstractDuration is positive. For example, 157 * "P10H" is positive, while "-P10H" is not. 158 * 159 * @note Do not re-implement this function. Use the constructor, AbstractDuration(), 160 * for changing the value. 161 * @returns @c true if this AbstractDuration is positive, otherwise @c false. 162 */ 163 bool isPositive() const; 164 165 protected: 166 167 AbstractDuration(const bool isPos); 168 169 static QString serializeMSeconds(const MSecondProperty mseconds); 170 static AtomicValue::Ptr create(const CaptureTable &captTable, 171 const QString &lexical, 172 bool *isPositive, 173 YearProperty *years, 174 MonthProperty *months, 175 DayCountProperty *days, 176 HourProperty *hours, 177 MinuteProperty *minutes, 178 SecondProperty *seconds, 179 MSecondProperty *mseconds); 180 const bool m_isPositive; 181 }; 182 } 183 184 QT_END_NAMESPACE 185 186 #endif 187