3446916f1fe32499f9f2f768b296b13d25f860fd
[profile/ivi/qtxmlpatterns.git] / src / xmlpatterns / data / qyearmonthduration.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the QtXmlPatterns module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
20 **
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
28 **
29 ** Other Usage
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include "qbuiltintypes_p.h"
43 #include "qcommonvalues_p.h"
44
45 #include "qyearmonthduration_p.h"
46
47 QT_BEGIN_NAMESPACE
48
49 using namespace QPatternist;
50
51 YearMonthDuration::YearMonthDuration(const bool isPositiveP,
52                                      const YearProperty yearsP,
53                                      const MonthProperty monthsP) : AbstractDuration(isPositiveP),
54                                                                     m_years(yearsP),
55                                                                     m_months(monthsP)
56 {
57     Q_ASSERT(monthsP < 32 && monthsP > -32);
58 }
59
60 YearMonthDuration::Ptr YearMonthDuration::fromLexical(const QString &lexical)
61 {
62     static const CaptureTable captureTable(
63         /* The extra paranthesis is a build fix for GCC 3.3. */
64         (QRegExp(QLatin1String(
65                 "^\\s*"         /* Any preceding whitespace. */
66                 "(-)?"          /* Sign, if any. */
67                 "P"             /* Delimiter. */
68                 "(?:(\\d+)Y)?"  /* The years part. */
69                 "(?:(\\d+)M)?"  /* The months part. */
70                 "\\s*$"         /* Any terminating whitespace. */))),
71         2,                      /* yearP. */
72         3                       /* monthP. */);
73
74     YearProperty years = 0;
75     MonthProperty months = 0;
76     bool isPos;
77
78     const AtomicValue::Ptr err(create(captureTable, lexical, &isPos, &years,
79                                       &months, 0, 0, 0, 0, 0));
80
81     return err ? err : YearMonthDuration::Ptr(new YearMonthDuration(isPos, years, months));
82 }
83
84 YearMonthDuration::Ptr YearMonthDuration::fromComponents(const bool isPositive,
85                                                          const YearProperty years,
86                                                          const MonthProperty months)
87 {
88     return YearMonthDuration::Ptr(new YearMonthDuration(isPositive, years, months));
89 }
90
91 QString YearMonthDuration::stringValue() const
92 {
93     QString retval;
94
95     if(!m_isPositive)
96         retval.append(QLatin1Char('-'));
97
98     retval.append(QLatin1Char('P'));
99
100     /* When years == 0 and months == 0, we get "P0M", which
101      * is the correct canonical form. */
102     if(m_years)
103     {
104         retval.append(QString::number(m_years));
105         retval.append(QLatin1Char('Y'));
106
107         if(m_months)
108         {
109             retval.append(QString::number(m_months));
110             retval.append(QLatin1Char('M'));
111         }
112     }
113     else
114     {
115         if(m_months)
116         {
117             retval.append(QString::number(m_months));
118             retval.append(QLatin1Char('M'));
119         }
120         else
121             return QLatin1String("P0M"); /* Ensure the canonical form. */
122     }
123
124     return retval;
125 }
126
127 AbstractDuration::Value YearMonthDuration::value() const
128 {
129     return (m_years * 12 + m_months) * (m_isPositive ? 1 : -1);
130 }
131
132 Item YearMonthDuration::fromValue(const Value val) const
133 {
134     if(val == 0)
135         return toItem(CommonValues::YearMonthDurationZero);
136     else
137     {
138         const Value absValue = qAbs(val);
139         return toItem(YearMonthDuration::fromComponents(val >= 0,
140                                                         absValue / 12,
141                                                         absValue % 12));
142     }
143 }
144
145 ItemType::Ptr YearMonthDuration::type() const
146 {
147     return BuiltinTypes::xsYearMonthDuration;
148 }
149
150 YearProperty YearMonthDuration::years() const
151 {
152     return m_years;
153 }
154
155 MonthProperty YearMonthDuration::months() const
156 {
157     return m_months;
158 }
159
160 DayCountProperty YearMonthDuration::days() const
161 {
162     return 0;
163 }
164
165 HourProperty YearMonthDuration::hours() const
166 {
167     return 0;
168 }
169
170 MinuteProperty YearMonthDuration::minutes() const
171 {
172     return 0;
173 }
174
175 SecondProperty YearMonthDuration::seconds() const
176 {
177     return 0;
178 }
179
180 MSecondProperty YearMonthDuration::mseconds() const
181 {
182     return 0;
183 }
184
185
186 QT_END_NAMESPACE