|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
4 ** All rights reserved. |
|
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 ** |
|
7 ** This file is part of the QtXmlPatterns module of the Qt Toolkit. |
|
8 ** |
|
9 ** $QT_BEGIN_LICENSE:LGPL$ |
|
10 ** No Commercial Usage |
|
11 ** This file contains pre-release code and may not be distributed. |
|
12 ** You may use this file in accordance with the terms and conditions |
|
13 ** contained in the Technology Preview License Agreement accompanying |
|
14 ** this package. |
|
15 ** |
|
16 ** GNU Lesser General Public License Usage |
|
17 ** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 ** General Public License version 2.1 as published by the Free Software |
|
19 ** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 ** packaging of this file. Please review the following information to |
|
21 ** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 ** |
|
24 ** In addition, as a special exception, Nokia gives you certain additional |
|
25 ** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 ** |
|
28 ** If you have questions regarding the use of this file, please contact |
|
29 ** Nokia at qt-info@nokia.com. |
|
30 ** |
|
31 ** |
|
32 ** |
|
33 ** |
|
34 ** |
|
35 ** |
|
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_AtomicCasters_H |
|
53 #define Patternist_AtomicCasters_H |
|
54 |
|
55 #include "qatomiccaster_p.h" |
|
56 #include "qdecimal_p.h" |
|
57 #include "qderivedinteger_p.h" |
|
58 #include "qderivedstring_p.h" |
|
59 #include "qinteger_p.h" |
|
60 #include "qvalidationerror_p.h" |
|
61 |
|
62 /** |
|
63 * @file |
|
64 * @short Contains classes sub-classing AtomicCaster and which |
|
65 * are responsible of casting an atomic value to another type. |
|
66 */ |
|
67 |
|
68 QT_BEGIN_HEADER |
|
69 |
|
70 QT_BEGIN_NAMESPACE |
|
71 |
|
72 namespace QPatternist |
|
73 { |
|
74 |
|
75 /** |
|
76 * @short Casts any atomic value to @c xs:string. |
|
77 * |
|
78 * This class uses Item::stringValue() for retrieving a string |
|
79 * representation, and thus supports casting from atomic values |
|
80 * of any type. |
|
81 * |
|
82 * @ingroup Patternist_xdm |
|
83 * @author Frans Englich <frans.englich@nokia.com> |
|
84 */ |
|
85 template<TypeOfDerivedString DerivedType> |
|
86 class ToStringCaster : public AtomicCaster |
|
87 { |
|
88 public: |
|
89 virtual Item castFrom(const Item &from, |
|
90 const QExplicitlySharedDataPointer<DynamicContext> &context) const |
|
91 { |
|
92 Q_ASSERT(from); |
|
93 return DerivedString<DerivedType>::fromLexical(context->namePool(), from.stringValue()); |
|
94 } |
|
95 }; |
|
96 |
|
97 /** |
|
98 * @short Casts any atomic value to @c xs:untypedAtomic. |
|
99 * |
|
100 * This class uses Item::stringValue() for retrieving a string |
|
101 * representation, and thus supports casting from atomic values |
|
102 * of any type. The implementation is similar to ToStringCaster. |
|
103 * |
|
104 * @ingroup Patternist_xdm |
|
105 * @author Frans Englich <frans.englich@nokia.com> |
|
106 */ |
|
107 class ToUntypedAtomicCaster : public AtomicCaster |
|
108 { |
|
109 public: |
|
110 virtual Item castFrom(const Item &from, |
|
111 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
112 }; |
|
113 |
|
114 /** |
|
115 * @short Casts a string value to @c xs:anyURI. |
|
116 * |
|
117 * @ingroup Patternist_xdm |
|
118 * @author Frans Englich <frans.englich@nokia.com> |
|
119 */ |
|
120 class ToAnyURICaster : public AtomicCaster |
|
121 { |
|
122 public: |
|
123 virtual Item castFrom(const Item &from, |
|
124 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
125 }; |
|
126 |
|
127 /** |
|
128 * @short Casts a @c xs:hexBinary atomic value to @c xs:base64Binary. |
|
129 * |
|
130 * @ingroup Patternist_xdm |
|
131 * @author Frans Englich <frans.englich@nokia.com> |
|
132 */ |
|
133 class HexBinaryToBase64BinaryCaster : public AtomicCaster |
|
134 { |
|
135 public: |
|
136 virtual Item castFrom(const Item &from, |
|
137 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
138 }; |
|
139 |
|
140 /** |
|
141 * @short Casts a @c xs:base64Binary atomic value to @c xs:hexBinary. |
|
142 * |
|
143 * @ingroup Patternist_xdm |
|
144 * @author Frans Englich <frans.englich@nokia.com> |
|
145 */ |
|
146 class Base64BinaryToHexBinaryCaster : public AtomicCaster |
|
147 { |
|
148 public: |
|
149 virtual Item castFrom(const Item &from, |
|
150 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
151 }; |
|
152 |
|
153 /** |
|
154 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:base64Binary. |
|
155 * |
|
156 * @ingroup Patternist_xdm |
|
157 * @author Frans Englich <frans.englich@nokia.com> |
|
158 */ |
|
159 class StringToBase64BinaryCaster : public AtomicCaster |
|
160 { |
|
161 public: |
|
162 virtual Item castFrom(const Item &from, |
|
163 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
164 }; |
|
165 |
|
166 /** |
|
167 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:hexBinary. |
|
168 * |
|
169 * @ingroup Patternist_xdm |
|
170 * @author Frans Englich <frans.englich@nokia.com> |
|
171 */ |
|
172 class StringToHexBinaryCaster : public AtomicCaster |
|
173 { |
|
174 public: |
|
175 virtual Item castFrom(const Item &from, |
|
176 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
177 }; |
|
178 |
|
179 /** |
|
180 * @short Casts any @c numeric value to @c xs:boolean. |
|
181 * |
|
182 * @ingroup Patternist_xdm |
|
183 * @author Frans Englich <frans.englich@nokia.com> |
|
184 */ |
|
185 class NumericToBooleanCaster : public AtomicCaster |
|
186 { |
|
187 public: |
|
188 virtual Item castFrom(const Item &from, |
|
189 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
190 }; |
|
191 |
|
192 /** |
|
193 * @short Casts any string value, @c xs:string or @c xs:untypedAtomic, to @c xs:boolean. |
|
194 * |
|
195 * @ingroup Patternist_xdm |
|
196 * @author Frans Englich <frans.englich@nokia.com> |
|
197 */ |
|
198 class StringToBooleanCaster : public AtomicCaster |
|
199 { |
|
200 public: |
|
201 virtual Item castFrom(const Item &from, |
|
202 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
203 }; |
|
204 |
|
205 /** |
|
206 * @short Casts a @c numeric value, such as @c xs:double or @c xs:decimal, to @c xs:integer or |
|
207 * @c xs:decimal, depending on IsInteger. |
|
208 * |
|
209 * castFrom() uses Numeric::toInteger() for doing the actual casting. |
|
210 * |
|
211 * @ingroup Patternist_xdm |
|
212 * @author Frans Englich <frans.englich@nokia.com> |
|
213 */ |
|
214 template <const bool IsInteger> |
|
215 class NumericToDecimalCaster : public AtomicCaster |
|
216 { |
|
217 public: |
|
218 /** |
|
219 * Used by NumericToDerivedIntegerCaster in addition to this class. |
|
220 */ |
|
221 static inline QString errorMessage() |
|
222 { |
|
223 return QtXmlPatterns::tr("When casting to %1 from %2, the source value cannot be %3."); |
|
224 } |
|
225 |
|
226 virtual Item castFrom(const Item &from, |
|
227 const QExplicitlySharedDataPointer<DynamicContext> &context) const |
|
228 { |
|
229 const ItemType::Ptr t(from.type()); |
|
230 const Numeric *const num = from.template as<Numeric>(); |
|
231 |
|
232 if(BuiltinTypes::xsDouble->xdtTypeMatches(t) || BuiltinTypes::xsFloat->xdtTypeMatches(t)) |
|
233 { |
|
234 if(num->isInf() || num->isNaN()) |
|
235 { |
|
236 return ValidationError::createError(errorMessage() |
|
237 .arg(formatType(context->namePool(), IsInteger ? BuiltinTypes::xsInteger : BuiltinTypes::xsDecimal)) |
|
238 .arg(formatType(context->namePool(), t)) |
|
239 .arg(formatData(num->stringValue())), |
|
240 ReportContext::FOCA0002); |
|
241 } |
|
242 } |
|
243 |
|
244 if(IsInteger) |
|
245 return Integer::fromValue(num->toInteger()); |
|
246 else |
|
247 return toItem(Decimal::fromValue(num->toDecimal())); |
|
248 } |
|
249 }; |
|
250 |
|
251 /** |
|
252 * @short Casts a string value, @c xs:string or @c xs:untypedAtomic, to @c xs:decimal. |
|
253 * |
|
254 * @ingroup Patternist_xdm |
|
255 * @author Frans Englich <frans.englich@nokia.com> |
|
256 */ |
|
257 class StringToDecimalCaster : public AtomicCaster |
|
258 { |
|
259 public: |
|
260 virtual Item castFrom(const Item &from, |
|
261 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
262 }; |
|
263 |
|
264 /** |
|
265 * @short Casts a string value, @c xs:string or @c xs:untypedAtomic, to @c xs:integer. |
|
266 * |
|
267 * @ingroup Patternist_xdm |
|
268 * @author Frans Englich <frans.englich@nokia.com> |
|
269 */ |
|
270 class StringToIntegerCaster : public AtomicCaster |
|
271 { |
|
272 public: |
|
273 virtual Item castFrom(const Item &from, |
|
274 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
275 }; |
|
276 |
|
277 /** |
|
278 * @short Casts a value of type @c xs:boolean to @c xs:decimal. |
|
279 * |
|
280 * @ingroup Patternist_xdm |
|
281 * @author Frans Englich <frans.englich@nokia.com> |
|
282 */ |
|
283 class BooleanToDecimalCaster : public AtomicCaster |
|
284 { |
|
285 public: |
|
286 virtual Item castFrom(const Item &from, |
|
287 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
288 }; |
|
289 |
|
290 /** |
|
291 * @short Casts a value of type @c xs:boolean to @c xs:integer. |
|
292 * |
|
293 * @ingroup Patternist_xdm |
|
294 * @author Frans Englich <frans.englich@nokia.com> |
|
295 */ |
|
296 class BooleanToIntegerCaster : public AtomicCaster |
|
297 { |
|
298 public: |
|
299 virtual Item castFrom(const Item &from, |
|
300 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
301 }; |
|
302 |
|
303 /** |
|
304 * @short Casts a value to itself. Essentially, this AtomicCaster does nothing. |
|
305 * |
|
306 * Casting a value to the type of itself is defined to be a noop, |
|
307 * no operation. When it can be statically detected that will be done, |
|
308 * CastAs rewrites itself appropriately during compilation, but |
|
309 * in some cases insufficent data is available at compile time and then |
|
310 * is this class need on a case-per-case base at evaluation time. |
|
311 * |
|
312 * @ingroup Patternist_xdm |
|
313 * @author Frans Englich <frans.englich@nokia.com> |
|
314 */ |
|
315 class SelfToSelfCaster : public AtomicCaster |
|
316 { |
|
317 public: |
|
318 |
|
319 /** |
|
320 * This function simply returns @p from. |
|
321 */ |
|
322 virtual Item castFrom(const Item &from, |
|
323 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
324 }; |
|
325 |
|
326 /** |
|
327 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:gYear. |
|
328 * |
|
329 * @ingroup Patternist_xdm |
|
330 * @author Frans Englich <frans.englich@nokia.com> |
|
331 */ |
|
332 class StringToGYearCaster : public AtomicCaster |
|
333 { |
|
334 public: |
|
335 virtual Item castFrom(const Item &from, |
|
336 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
337 }; |
|
338 |
|
339 /** |
|
340 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:gDay. |
|
341 * |
|
342 * @ingroup Patternist_xdm |
|
343 * @author Frans Englich <frans.englich@nokia.com> |
|
344 */ |
|
345 class StringToGDayCaster : public AtomicCaster |
|
346 { |
|
347 public: |
|
348 virtual Item castFrom(const Item &from, |
|
349 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
350 }; |
|
351 |
|
352 /** |
|
353 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:gMonth. |
|
354 * |
|
355 * @ingroup Patternist_xdm |
|
356 * @author Frans Englich <frans.englich@nokia.com> |
|
357 */ |
|
358 class StringToGMonthCaster : public AtomicCaster |
|
359 { |
|
360 public: |
|
361 virtual Item castFrom(const Item &from, |
|
362 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
363 }; |
|
364 |
|
365 /** |
|
366 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:gYearMonth. |
|
367 * |
|
368 * @ingroup Patternist_xdm |
|
369 * @author Frans Englich <frans.englich@nokia.com> |
|
370 */ |
|
371 class StringToGYearMonthCaster : public AtomicCaster |
|
372 { |
|
373 public: |
|
374 virtual Item castFrom(const Item &from, |
|
375 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
376 }; |
|
377 |
|
378 /** |
|
379 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:gYearMonth. |
|
380 * |
|
381 * @ingroup Patternist_xdm |
|
382 * @author Frans Englich <frans.englich@nokia.com> |
|
383 */ |
|
384 class StringToGMonthDayCaster : public AtomicCaster |
|
385 { |
|
386 public: |
|
387 virtual Item castFrom(const Item &from, |
|
388 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
389 }; |
|
390 |
|
391 /** |
|
392 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:dateTime. |
|
393 * |
|
394 * @ingroup Patternist_xdm |
|
395 * @author Frans Englich <frans.englich@nokia.com> |
|
396 */ |
|
397 class StringToDateTimeCaster : public AtomicCaster |
|
398 { |
|
399 public: |
|
400 virtual Item castFrom(const Item &from, |
|
401 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
402 }; |
|
403 |
|
404 /** |
|
405 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:time. |
|
406 * |
|
407 * @ingroup Patternist_xdm |
|
408 * @author Frans Englich <frans.englich@nokia.com> |
|
409 */ |
|
410 class StringToTimeCaster : public AtomicCaster |
|
411 { |
|
412 public: |
|
413 virtual Item castFrom(const Item &from, |
|
414 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
415 }; |
|
416 |
|
417 /** |
|
418 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:date. |
|
419 * |
|
420 * @ingroup Patternist_xdm |
|
421 * @author Frans Englich <frans.englich@nokia.com> |
|
422 */ |
|
423 class StringToDateCaster : public AtomicCaster |
|
424 { |
|
425 public: |
|
426 virtual Item castFrom(const Item &from, |
|
427 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
428 }; |
|
429 |
|
430 /** |
|
431 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:duration. |
|
432 * |
|
433 * @ingroup Patternist_xdm |
|
434 * @author Frans Englich <frans.englich@nokia.com> |
|
435 */ |
|
436 class StringToDurationCaster : public AtomicCaster |
|
437 { |
|
438 public: |
|
439 virtual Item castFrom(const Item &from, |
|
440 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
441 }; |
|
442 |
|
443 /** |
|
444 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:dayTimeDuration. |
|
445 * |
|
446 * @ingroup Patternist_xdm |
|
447 * @author Frans Englich <frans.englich@nokia.com> |
|
448 */ |
|
449 class StringToDayTimeDurationCaster : public AtomicCaster |
|
450 { |
|
451 public: |
|
452 virtual Item castFrom(const Item &from, |
|
453 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
454 }; |
|
455 |
|
456 /** |
|
457 * @short Casts a @c xs:string or @c xs:untypedAtomic atomic value to @c xs:yearMonthDuration. |
|
458 * |
|
459 * @ingroup Patternist_xdm |
|
460 * @author Frans Englich <frans.englich@nokia.com> |
|
461 */ |
|
462 class StringToYearMonthDurationCaster : public AtomicCaster |
|
463 { |
|
464 public: |
|
465 virtual Item castFrom(const Item &from, |
|
466 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
467 }; |
|
468 |
|
469 |
|
470 /** |
|
471 * @short Casts a @c xs:date or @c xs:dateTime atomic value to @c xs:gYear. |
|
472 * |
|
473 * @ingroup Patternist_xdm |
|
474 * @author Frans Englich <frans.englich@nokia.com> |
|
475 */ |
|
476 class AbstractDateTimeToGYearCaster : public AtomicCaster |
|
477 { |
|
478 public: |
|
479 virtual Item castFrom(const Item &from, |
|
480 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
481 }; |
|
482 |
|
483 /** |
|
484 * @short Casts a @c xs:date or @c xs:dateTime atomic value to @c xs:gYearMonth. |
|
485 * |
|
486 * @ingroup Patternist_xdm |
|
487 * @author Frans Englich <frans.englich@nokia.com> |
|
488 */ |
|
489 class AbstractDateTimeToGYearMonthCaster : public AtomicCaster |
|
490 { |
|
491 public: |
|
492 virtual Item castFrom(const Item &from, |
|
493 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
494 }; |
|
495 |
|
496 /** |
|
497 * @short Casts a @c xs:date or @c xs:dateTime atomic value to @c xs:gMonth. |
|
498 * |
|
499 * @ingroup Patternist_xdm |
|
500 * @author Frans Englich <frans.englich@nokia.com> |
|
501 */ |
|
502 class AbstractDateTimeToGMonthCaster : public AtomicCaster |
|
503 { |
|
504 public: |
|
505 virtual Item castFrom(const Item &from, |
|
506 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
507 }; |
|
508 |
|
509 /** |
|
510 * @short Casts a @c xs:date or @c xs:dateTime atomic value to @c xs:gMonthDay. |
|
511 * |
|
512 * @ingroup Patternist_xdm |
|
513 * @author Frans Englich <frans.englich@nokia.com> |
|
514 */ |
|
515 class AbstractDateTimeToGMonthDayCaster : public AtomicCaster |
|
516 { |
|
517 public: |
|
518 virtual Item castFrom(const Item &from, |
|
519 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
520 }; |
|
521 |
|
522 /** |
|
523 * @short Casts a @c xs:date or @c xs:dateTime atomic value to @c xs:gDay. |
|
524 * |
|
525 * @ingroup Patternist_xdm |
|
526 * @author Frans Englich <frans.englich@nokia.com> |
|
527 */ |
|
528 class AbstractDateTimeToGDayCaster : public AtomicCaster |
|
529 { |
|
530 public: |
|
531 virtual Item castFrom(const Item &from, |
|
532 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
533 }; |
|
534 |
|
535 /** |
|
536 * @short Casts an AbstractDateTime instance to DateTime. |
|
537 * |
|
538 * @ingroup Patternist_xdm |
|
539 * @author Frans Englich <frans.englich@nokia.com> |
|
540 */ |
|
541 class AbstractDateTimeToDateTimeCaster : public AtomicCaster |
|
542 { |
|
543 public: |
|
544 virtual Item castFrom(const Item &from, |
|
545 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
546 }; |
|
547 |
|
548 /** |
|
549 * @short Casts an AbstractDateTime instance to SchemaTime. |
|
550 * |
|
551 * @ingroup Patternist_xdm |
|
552 * @author Frans Englich <frans.englich@nokia.com> |
|
553 */ |
|
554 class AbstractDateTimeToDateCaster : public AtomicCaster |
|
555 { |
|
556 public: |
|
557 virtual Item castFrom(const Item &from, |
|
558 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
559 }; |
|
560 |
|
561 /** |
|
562 * @short Casts an AbstractDateTime instance to SchemaTime. |
|
563 * |
|
564 * @ingroup Patternist_xdm |
|
565 * @author Frans Englich <frans.englich@nokia.com> |
|
566 */ |
|
567 class AbstractDateTimeToTimeCaster : public AtomicCaster |
|
568 { |
|
569 public: |
|
570 virtual Item castFrom(const Item &from, |
|
571 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
572 }; |
|
573 |
|
574 /** |
|
575 * @short Casts an AbstractDuration instance to Duration. |
|
576 * |
|
577 * @ingroup Patternist_xdm |
|
578 * @author Frans Englich <frans.englich@nokia.com> |
|
579 */ |
|
580 class AbstractDurationToDurationCaster : public AtomicCaster |
|
581 { |
|
582 public: |
|
583 virtual Item castFrom(const Item &from, |
|
584 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
585 }; |
|
586 |
|
587 /** |
|
588 * @short Casts an AbstractDuration instance to DayTimeDuration. |
|
589 * |
|
590 * @ingroup Patternist_xdm |
|
591 * @author Frans Englich <frans.englich@nokia.com> |
|
592 */ |
|
593 class AbstractDurationToDayTimeDurationCaster : public AtomicCaster |
|
594 { |
|
595 public: |
|
596 virtual Item castFrom(const Item &from, |
|
597 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
598 }; |
|
599 |
|
600 /** |
|
601 * @short Casts an AbstractDuration instance to YearMonthDuration. |
|
602 * |
|
603 * @ingroup Patternist_xdm |
|
604 * @author Frans Englich <frans.englich@nokia.com> |
|
605 */ |
|
606 class AbstractDurationToYearMonthDurationCaster : public AtomicCaster |
|
607 { |
|
608 public: |
|
609 virtual Item castFrom(const Item &from, |
|
610 const QExplicitlySharedDataPointer<DynamicContext> &context) const; |
|
611 }; |
|
612 |
|
613 /** |
|
614 * @short Casts an @c xs:string instance to a derived type of @c xs:integer. |
|
615 * |
|
616 * @ingroup Patternist_xdm |
|
617 * @author Frans Englich <frans.englich@nokia.com> |
|
618 */ |
|
619 template<TypeOfDerivedInteger type> |
|
620 class StringToDerivedIntegerCaster : public AtomicCaster |
|
621 { |
|
622 public: |
|
623 virtual Item |
|
624 castFrom(const Item &from, |
|
625 const QExplicitlySharedDataPointer<DynamicContext> &context) const |
|
626 { |
|
627 return DerivedInteger<type>::fromLexical(context->namePool(), from.stringValue()); |
|
628 } |
|
629 }; |
|
630 |
|
631 /** |
|
632 * @short Casts an @c xs:boolean instance to a derived type of @c xs:integer. |
|
633 * |
|
634 * @ingroup Patternist_xdm |
|
635 * @author Frans Englich <frans.englich@nokia.com> |
|
636 */ |
|
637 template<TypeOfDerivedInteger type> |
|
638 class BooleanToDerivedIntegerCaster : public AtomicCaster |
|
639 { |
|
640 public: |
|
641 virtual Item |
|
642 castFrom(const Item &from, |
|
643 const QExplicitlySharedDataPointer<DynamicContext> &context) const |
|
644 { |
|
645 return DerivedInteger<type>::fromValue(context->namePool(), from.template as<AtomicValue>()->evaluateEBV(context) ? 1 : 0); |
|
646 } |
|
647 }; |
|
648 |
|
649 /** |
|
650 * @short Casts an @c xs:boolean instance to a derived type of @c xs:integer. |
|
651 * |
|
652 * @ingroup Patternist_xdm |
|
653 * @author Frans Englich <frans.englich@nokia.com> |
|
654 */ |
|
655 template<TypeOfDerivedString type> |
|
656 class AnyToDerivedStringCaster : public AtomicCaster |
|
657 { |
|
658 public: |
|
659 virtual Item |
|
660 castFrom(const Item &from, |
|
661 const QExplicitlySharedDataPointer<DynamicContext> &context) const |
|
662 { |
|
663 return DerivedString<type>::fromLexical(context->namePool(), from.stringValue()); |
|
664 } |
|
665 }; |
|
666 |
|
667 /** |
|
668 * @short Casts any @c numeric instance to a derived type of @c xs:integer. |
|
669 * |
|
670 * @ingroup Patternist_xdm |
|
671 * @author Frans Englich <frans.englich@nokia.com> |
|
672 */ |
|
673 template<TypeOfDerivedInteger type> |
|
674 class NumericToDerivedIntegerCaster : public AtomicCaster |
|
675 { |
|
676 public: |
|
677 virtual Item |
|
678 castFrom(const Item &from, |
|
679 const QExplicitlySharedDataPointer<DynamicContext> &context) const |
|
680 { |
|
681 const ItemType::Ptr t(from.type()); |
|
682 const Numeric *const num = from.template as<Numeric>(); |
|
683 |
|
684 if(BuiltinTypes::xsDouble->xdtTypeMatches(t) || BuiltinTypes::xsFloat->xdtTypeMatches(t)) |
|
685 { |
|
686 if(num->isInf() || num->isNaN()) |
|
687 { |
|
688 return ValidationError::createError(NumericToDecimalCaster<false>::errorMessage() |
|
689 .arg(formatType(context->namePool(), DerivedInteger<type>::itemType())) |
|
690 .arg(formatType(context->namePool(), t)) |
|
691 .arg(formatData(num->stringValue())), |
|
692 ReportContext::FOCA0002); |
|
693 } |
|
694 } |
|
695 |
|
696 return toItem(DerivedInteger<type>::fromValue(context->namePool(), from.template as<Numeric>()->toInteger())); |
|
697 } |
|
698 }; |
|
699 } |
|
700 |
|
701 QT_END_NAMESPACE |
|
702 |
|
703 QT_END_HEADER |
|
704 |
|
705 #endif |