Merge lp:~paul-lucas/zorba/bug-1090089 into lp:zorba

Proposed by Paul J. Lucas on 2013-04-25
Status: Merged
Approved by: Matthias Brantner on 2013-05-08
Approved revision: 11447
Merged at revision: 11443
Proposed branch: lp:~paul-lucas/zorba/bug-1090089
Merge into: lp:zorba
Diff against target: 5153 lines (+1559/-1216)
91 files modified
ChangeLog (+1/-0)
src/api/dynamiccontextimpl.cpp (+1/-0)
src/api/item.cpp (+3/-1)
src/api/itemfactoryimpl.cpp (+6/-3)
src/api/serialization/serializer.cpp (+1/-0)
src/capi/csequence.cpp (+4/-3)
src/common/shared_types.h (+12/-10)
src/compiler/expression/expr.cpp (+3/-0)
src/compiler/expression/expr_manager.cpp (+10/-8)
src/compiler/parser/jsoniq_parser.cpp (+5/-6)
src/compiler/parser/parser_helpers.h (+2/-0)
src/compiler/parser/parser_y_includes.h (+6/-6)
src/compiler/parser/symbol_table.cpp (+3/-0)
src/compiler/parser/xquery_parser.cpp (+5/-6)
src/compiler/parsetree/parsenode_print_xml_visitor.cpp (+5/-2)
src/compiler/parsetree/parsenodes.cpp (+1/-0)
src/compiler/parsetree/parsenodes.h (+3/-0)
src/compiler/rewriter/rules/flwor_rules.cpp (+5/-3)
src/compiler/rewriter/rules/fold_rules.cpp (+2/-0)
src/compiler/translator/translator.cpp (+7/-4)
src/functions/udf.cpp (+1/-0)
src/runtime/base/plan_iterator.cpp (+4/-8)
src/runtime/booleans/BooleanImpl.cpp (+1/-0)
src/runtime/collections/collections_base.h (+1/-0)
src/runtime/collections/collections_impl.cpp (+6/-7)
src/runtime/core/arithmetic_impl.cpp (+1/-0)
src/runtime/core/var_iterators.h (+1/-1)
src/runtime/durations_dates_times/durations_dates_times_impl.cpp (+2/-0)
src/runtime/full_text/ft_module_impl.cpp (+1/-0)
src/runtime/full_text/ft_util.cpp (+1/-0)
src/runtime/full_text/ftcontains_visitor.cpp (+1/-2)
src/runtime/hof/dynamic_fncall_iterator.cpp (+1/-0)
src/runtime/hof/fn_hof_functions_impl.cpp (+1/-0)
src/runtime/indexing/index_ddl.cpp (+13/-11)
src/runtime/introspection/sctx_impl.cpp (+1/-0)
src/runtime/item/item_impl.cpp (+1/-0)
src/runtime/json/jsoniq_functions_impl.cpp (+1/-0)
src/runtime/maths/pregenerated/maths.cpp (+4/-4)
src/runtime/maths/pregenerated/maths.h (+1/-0)
src/runtime/numerics/NumericsImpl.cpp (+9/-7)
src/runtime/numerics/format_integer.cpp (+1/-0)
src/runtime/numerics/format_number.cpp (+3/-2)
src/runtime/numerics/numerics_impl.cpp (+5/-3)
src/runtime/random/pregenerated/random.h (+1/-0)
src/runtime/sequences/pregenerated/sequences.cpp (+14/-14)
src/runtime/sequences/pregenerated/sequences.h (+1/-0)
src/runtime/sequences/sequences_impl.cpp (+12/-8)
src/runtime/spec/maths/maths.xml (+3/-2)
src/runtime/spec/random/random.xml (+4/-0)
src/runtime/spec/sequences/sequences.xml (+8/-7)
src/runtime/store/maps_impl.cpp (+1/-0)
src/runtime/strings/strings_impl.cpp (+7/-2)
src/store/api/collection.h (+1/-1)
src/store/api/iterator.h (+1/-1)
src/store/naive/atomic_items.cpp (+1/-1)
src/store/naive/atomic_items.h (+4/-1)
src/store/naive/collection.h (+1/-0)
src/store/naive/collection_tree_info.h (+1/-0)
src/store/naive/pul_primitives.cpp (+1/-1)
src/store/naive/simple_collection.cpp (+2/-2)
src/store/naive/simple_index_value.h (+1/-0)
src/store/naive/simple_lazy_temp_seq.cpp (+2/-2)
src/store/naive/simple_pul.cpp (+3/-6)
src/store/naive/simple_temp_seq.cpp (+1/-0)
src/system/globalenv.cpp (+1/-0)
src/types/casting.cpp (+33/-19)
src/types/schema/XercesParseUtils.cpp (+7/-4)
src/util/stl_util.h (+18/-0)
src/zorbaserialization/serialize_basic_types.cpp (+1/-0)
src/zorbaserialization/serialize_zorba_types.cpp (+15/-20)
src/zorbaserialization/serialize_zorba_types.h (+7/-18)
src/zorbatypes/CMakeLists.txt (+1/-0)
src/zorbatypes/datetime.h (+3/-4)
src/zorbatypes/datetime/datetimetype.cpp (+9/-8)
src/zorbatypes/datetime/duration.cpp (+8/-4)
src/zorbatypes/datetime/timezone.cpp (+1/-0)
src/zorbatypes/decimal.cpp (+63/-79)
src/zorbatypes/decimal.h (+24/-36)
src/zorbatypes/duration.h (+6/-6)
src/zorbatypes/floatimpl.cpp (+91/-116)
src/zorbatypes/floatimpl.h (+21/-36)
src/zorbatypes/integer.cpp (+253/-192)
src/zorbatypes/integer.h (+553/-483)
src/zorbatypes/numconversions.cpp (+8/-1)
src/zorbatypes/numconversions.h (+2/-0)
src/zorbatypes/numeric_types.cpp (+82/-0)
src/zorbatypes/numeric_types.h (+106/-0)
src/zorbatypes/schema_types.h (+26/-25)
src/zorbatypes/timezone.h (+1/-1)
src/zorbatypes/zorbatypes_decl.h (+1/-17)
test/fots/CMakeLists.txt (+2/-2)
To merge this branch: bzr merge lp:~paul-lucas/zorba/bug-1090089
Reviewer Review Type Date Requested Status
Matthias Brantner 2013-05-05 Approve on 2013-05-08
Paul J. Lucas Approve on 2013-04-25
Review via email: mp+160962@code.launchpad.net

Commit message

Completely reworked the implementation of Integer so that it now correctly handles xs:integer, xs:negativeInteger, xs:nonNegativeInteger, and xs:positiveInteger.

Also cleaned-up #includes for Zorba classes so as to reduce uncessary #includes.

This is an intermediate merge proposal just go get all of the above changes in. The actual fix for distinct-values() will come later depending on the outcome of the thread posted to zorba-dev.

Description of the change

Completely reworked the implementation of Integer so that it now correctly handles xs:integer, xs:negativeInteger, xs:nonNegativeInteger, and xs:positiveInteger.

Also cleaned-up #includes for Zorba classes so as to reduce uncessary #includes.

This is an intermediate merge proposal just go get all of the above changes in. The actual fix for distinct-values() will come later depending on the outcome of the thread posted to zorba-dev.

To post a comment you must log in.
Paul J. Lucas (paul-lucas) :
review: Approve
Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~paul-lucas/zorba/bug-1090089 into lp:zorba failed. Below is the output from the failed tests.

CMake Error at /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake:275 (message):
  Validation queue job bug-1090089-2013-04-30T14-52-16.682Z is finished. The
  final status was:

  No tests were run - build or configure step must have failed.

  Not commiting changes.

Error in read script: /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake

Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~paul-lucas/zorba/bug-1090089 into lp:zorba failed. Below is the output from the failed tests.

CMake Error at /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake:275 (message):
  Validation queue job bug-1090089-2013-04-30T15-05-58.851Z is finished. The
  final status was:

  No tests were run - build or configure step must have failed.

  Not commiting changes.

Error in read script: /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake

Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~paul-lucas/zorba/bug-1090089 into lp:zorba failed. Below is the output from the failed tests.

CMake Error at /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake:275 (message):
  Validation queue job bug-1090089-2013-04-30T17-37-58.355Z is finished. The
  final status was:

  25 tests did not succeed - changes not commited.

Error in read script: /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake

Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~paul-lucas/zorba/bug-1090089 into lp:zorba failed. Below is the output from the failed tests.

CMake Error at /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake:275 (message):
  Validation queue job bug-1090089-2013-04-30T23-29-18.17Z is finished. The
  final status was:

  25 tests did not succeed - changes not commited.

Error in read script: /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake

Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~paul-lucas/zorba/bug-1090089 into lp:zorba failed. Below is the output from the failed tests.

CMake Error at /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake:275 (message):
  Validation queue job bug-1090089-2013-05-01T04-39-58.887Z is finished. The
  final status was:

  8 tests did not succeed - changes not commited.

Error in read script: /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake

Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~paul-lucas/zorba/bug-1090089 into lp:zorba failed. Below is the output from the failed tests.

CMake Error at /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake:275 (message):
  Validation queue job bug-1090089-2013-05-04T00-48-32.868Z is finished. The
  final status was:

  3 tests did not succeed - changes not commited.

Error in read script: /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake

Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~paul-lucas/zorba/bug-1090089 into lp:zorba failed. Below is the output from the failed tests.

CMake Error at /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake:275 (message):
  Validation queue job bug-1090089-2013-05-04T17-34-09.498Z is finished. The
  final status was:

  2 tests did not succeed - changes not commited.

Error in read script: /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake

Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~paul-lucas/zorba/bug-1090089 into lp:zorba failed. Below is the output from the failed tests.

CMake Error at /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake:275 (message):
  Validation queue job bug-1090089-2013-05-05T03-23-20.786Z is finished. The
  final status was:

  1 tests did not succeed - changes not commited.

Error in read script: /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake

Zorba Build Bot (zorba-buildbot) wrote :

Validation queue job bug-1090089-2013-05-05T03-55-20.658Z is finished. The final status was:

All tests succeeded!

Zorba Build Bot (zorba-buildbot) wrote :

Voting does not meet specified criteria. Required: Approve > 1, Disapprove < 1, Needs Fixing < 1, Pending < 1, Needs Information < 1, Resubmit < 1. Got: 1 Approve.

lp:~paul-lucas/zorba/bug-1090089 updated on 2013-05-08
11442. By Paul J. Lucas on 2013-05-06

Merge from trunk.

11443. By Paul J. Lucas on 2013-05-06

Cosmetic change.

11444. By Paul J. Lucas on 2013-05-07

Now always returning Integer for binary operators.

11445. By Paul J. Lucas on 2013-05-08

Merge from trunk.

11446. By Paul J. Lucas on 2013-05-08

Updated ChangeLog.

11447. By Paul J. Lucas on 2013-05-08

Undid change.

review: Approve
review: Approve
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue job bug-1090089-2013-05-08T19-45-21.587Z is finished. The final status was:

All tests succeeded!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'ChangeLog'
2--- ChangeLog 2013-05-08 03:22:27 +0000
3+++ ChangeLog 2013-05-08 15:05:31 +0000
4@@ -1,5 +1,6 @@
5 Zorba - The XQuery Processor
6
7+
8 version 2.9
9
10 New Features:
11
12=== modified file 'src/api/dynamiccontextimpl.cpp'
13--- src/api/dynamiccontextimpl.cpp 2013-05-08 03:19:57 +0000
14+++ src/api/dynamiccontextimpl.cpp 2013-05-08 15:05:31 +0000
15@@ -27,6 +27,7 @@
16 #include "types/typemanager.h"
17 #include "types/root_typemanager.h"
18 #include "types/schema/validate.h"
19+#include "zorbatypes/integer.h"
20
21 #include "api/unmarshaller.h"
22 #include "api/zorbaimpl.h"
23
24=== modified file 'src/api/item.cpp'
25--- src/api/item.cpp 2013-02-26 04:12:43 +0000
26+++ src/api/item.cpp 2013-05-08 15:05:31 +0000
27@@ -38,7 +38,9 @@
28 #include "store/api/iterator.h"
29 #include "store/api/collection.h"
30
31-#include <zorbatypes/numconversions.h>
32+#include "zorbatypes/floatimpl.h"
33+#include "zorbatypes/integer.h"
34+#include "zorbatypes/numconversions.h"
35
36 namespace zorba {
37
38
39=== modified file 'src/api/itemfactoryimpl.cpp'
40--- src/api/itemfactoryimpl.cpp 2013-03-27 03:30:14 +0000
41+++ src/api/itemfactoryimpl.cpp 2013-05-08 15:05:31 +0000
42@@ -25,14 +25,17 @@
43
44 #include "api/itemfactoryimpl.h"
45
46-#include "zorbatypes/duration.h"
47+#include "zorbatypes/decimal.h"
48+#include "zorbatypes/floatimpl.h"
49+#include "zorbatypes/integer.h"
50+#include "zorbatypes/schema_types.h"
51
52 #include "system/globalenv.h"
53
54+#include "store/api/copymode.h"
55+#include "store/api/item.h"
56 #include "store/api/item_factory.h"
57 #include "store/api/store.h"
58-#include "store/api/copymode.h"
59-#include "store/api/item.h"
60
61 #include "api/unmarshaller.h"
62
63
64=== modified file 'src/api/serialization/serializer.cpp'
65--- src/api/serialization/serializer.cpp 2013-04-25 02:05:20 +0000
66+++ src/api/serialization/serializer.cpp 2013-05-08 15:05:31 +0000
67@@ -39,6 +39,7 @@
68
69 #include "system/globalenv.h"
70 #include "zorbamisc/ns_consts.h"
71+#include "zorbatypes/integer.h"
72 #include "zorbatypes/numconversions.h"
73
74 #include "store/api/iterator.h"
75
76=== modified file 'src/capi/csequence.cpp'
77--- src/capi/csequence.cpp 2013-02-07 17:24:36 +0000
78+++ src/capi/csequence.cpp 2013-05-08 15:05:31 +0000
79@@ -18,16 +18,17 @@
80 #include "capi/csequence.h"
81
82 #include <cassert>
83-#include <string.h>
84+#include <cstring>
85
86 #include <zorba/zorba.h>
87 #include <zorba/diagnostic_list.h>
88 #include <zorba/iterator.h>
89 #include <zorba/store_consts.h>
90-#include <zorbamisc/ns_consts.h>
91-#include <zorbatypes/numconversions.h>
92
93 #include "util/string_util.h"
94+#include "zorbamisc/ns_consts.h"
95+#include "zorbatypes/floatimpl.h"
96+#include "zorbatypes/numconversions.h"
97
98 #include "error.h"
99
100
101=== modified file 'src/common/shared_types.h'
102--- src/common/shared_types.h 2013-04-26 04:44:36 +0000
103+++ src/common/shared_types.h 2013-05-08 15:05:31 +0000
104@@ -133,18 +133,20 @@
105 typedef rchandle<GMonth> GMonth_t;
106
107 /* numerics */
108-template<typename FloatType> class FloatImpl;
109+template<typename F> class FloatImpl;
110 typedef FloatImpl<double> Double;
111 typedef FloatImpl<float> Float;
112-#ifdef ZORBA_WITH_BIG_INTEGER
113-class IntegerImpl;
114-typedef IntegerImpl Integer;
115-typedef IntegerImpl UInteger;
116-#else
117-template<typename IntType> class IntegerImpl;
118-typedef IntegerImpl<long long> Integer;
119-typedef IntegerImpl<unsigned long long> UInteger;
120-#endif /* ZORBA_WITH_BIG_INTEGER */
121+class integer_traits;
122+class negative_traits;
123+class nonNegative_traits;
124+class nonPositive_traits;
125+class positive_traits;
126+template<class T> class IntegerImpl;
127+typedef IntegerImpl<integer_traits> Integer;
128+typedef IntegerImpl<negative_traits> NegativeInteger;
129+typedef IntegerImpl<nonNegative_traits> NonNegativeInteger;
130+typedef IntegerImpl<nonPositive_traits> NonPositiveInteger;
131+typedef IntegerImpl<positive_traits> PositiveInteger;
132
133 /* api */
134 class serializer;
135
136=== modified file 'src/compiler/expression/expr.cpp'
137--- src/compiler/expression/expr.cpp 2013-03-07 10:10:10 +0000
138+++ src/compiler/expression/expr.cpp 2013-05-08 15:05:31 +0000
139@@ -49,6 +49,9 @@
140
141 #include "store/api/store.h"
142 #include "store/api/item_factory.h"
143+#include "zorbatypes/decimal.h"
144+#include "zorbatypes/floatimpl.h"
145+#include "zorbatypes/integer.h"
146
147
148 namespace zorba
149
150=== modified file 'src/compiler/expression/expr_manager.cpp'
151--- src/compiler/expression/expr_manager.cpp 2013-04-16 20:06:08 +0000
152+++ src/compiler/expression/expr_manager.cpp 2013-05-08 15:05:31 +0000
153@@ -15,22 +15,24 @@
154 */
155
156 #include "stdafx.h"
157+
158+#include "zorbatypes/decimal.h"
159+#include "zorbatypes/integer.h"
160+
161+#include "expr.h"
162 #include "expr_manager.h"
163-
164-#include "mem_manager.h"
165-
166-#include "expr.h"
167-#include "ftnode.h"
168-#include "var_expr.h"
169 #include "flwor_expr.h"
170 #include "fo_expr.h"
171 #include "ft_expr.h"
172+#include "ftnode.h"
173 #include "function_item_expr.h"
174+#include "json_exprs.h"
175+#include "mem_manager.h"
176 #include "path_expr.h"
177+#include "pragma.h"
178 #include "script_exprs.h"
179 #include "update_exprs.h"
180-#include "json_exprs.h"
181-#include "pragma.h"
182+#include "var_expr.h"
183
184 namespace zorba
185 {
186
187=== modified file 'src/compiler/parser/jsoniq_parser.cpp'
188--- src/compiler/parser/jsoniq_parser.cpp 2013-04-24 17:26:02 +0000
189+++ src/compiler/parser/jsoniq_parser.cpp 2013-05-08 15:05:31 +0000
190@@ -50,14 +50,13 @@
191 #pragma warning(disable: 4786)
192 #endif
193
194+#include "compiler/api/compilercb.h"
195+#include "compiler/parser/parse_constants.h"
196+#include "compiler/parser/parser_helpers.h"
197+#include "compiler/parser/xquery_driver.h"
198 #include "compiler/parsetree/parsenodes.h"
199-#include "compiler/parser/parse_constants.h"
200-#include "compiler/api/compilercb.h"
201 #include "store/api/update_consts.h"
202-
203-#include "compiler/parser/xquery_driver.h"
204-
205-#include "compiler/parser/parser_helpers.h"
206+#include "zorbatypes/integer.h"
207
208 #define SYMTAB( n ) driver.symtab.get( (off_t)n )
209 #define SYMTAB_PUT( s ) driver.symtab.put( s )
210
211=== modified file 'src/compiler/parser/parser_helpers.h'
212--- src/compiler/parser/parser_helpers.h 2013-03-16 00:58:28 +0000
213+++ src/compiler/parser/parser_helpers.h 2013-05-08 15:05:31 +0000
214@@ -23,6 +23,8 @@
215
216 namespace zorba {
217
218+ class location;
219+
220 namespace parser {
221
222 extern const char *the_tumbling, *the_sliding, *the_start, *the_end, *the_only_end, *the_declare, *the_create;
223
224=== modified file 'src/compiler/parser/parser_y_includes.h'
225--- src/compiler/parser/parser_y_includes.h 2013-04-17 18:08:27 +0000
226+++ src/compiler/parser/parser_y_includes.h 2013-05-08 15:05:31 +0000
227@@ -60,14 +60,14 @@
228 #pragma warning(disable: 4786)
229 #endif
230
231-#include "compiler/parsetree/parsenodes.h"
232+#include "compiler/api/compilercb.h"
233 #include "compiler/parser/parse_constants.h"
234-#include "compiler/api/compilercb.h"
235+#include "compiler/parser/parser_helpers.h"
236+#include "compiler/parser/xquery_driver.h"
237+#include "compiler/parsetree/parsenodes.h"
238 #include "store/api/update_consts.h"
239-
240-#include "compiler/parser/xquery_driver.h"
241-
242-#include "compiler/parser/parser_helpers.h"
243+#include "zorbatypes/decimal.h"
244+#include "zorbatypes/integer.h"
245
246 #define SYMTAB( n ) driver.symtab.get( (off_t)n )
247 #define SYMTAB_PUT( s ) driver.symtab.put( s )
248
249=== modified file 'src/compiler/parser/symbol_table.cpp'
250--- src/compiler/parser/symbol_table.cpp 2013-03-25 19:47:18 +0000
251+++ src/compiler/parser/symbol_table.cpp 2013-05-08 15:05:31 +0000
252@@ -15,6 +15,9 @@
253 */
254 #include "stdafx.h"
255
256+#include "zorbatypes/decimal.h"
257+#include "zorbatypes/floatimpl.h"
258+#include "zorbatypes/integer.h"
259 #include "zorbatypes/numconversions.h"
260
261 #include "compiler/parser/symbol_table.h"
262
263=== modified file 'src/compiler/parser/xquery_parser.cpp'
264--- src/compiler/parser/xquery_parser.cpp 2013-04-24 17:26:02 +0000
265+++ src/compiler/parser/xquery_parser.cpp 2013-05-08 15:05:31 +0000
266@@ -50,14 +50,13 @@
267 #pragma warning(disable: 4786)
268 #endif
269
270+#include "compiler/api/compilercb.h"
271+#include "compiler/parser/parse_constants.h"
272+#include "compiler/parser/parser_helpers.h"
273+#include "compiler/parser/xquery_driver.h"
274 #include "compiler/parsetree/parsenodes.h"
275-#include "compiler/parser/parse_constants.h"
276-#include "compiler/api/compilercb.h"
277 #include "store/api/update_consts.h"
278-
279-#include "compiler/parser/xquery_driver.h"
280-
281-#include "compiler/parser/parser_helpers.h"
282+#include "zorbatypes/integer.h"
283
284 #define SYMTAB( n ) driver.symtab.get( (off_t)n )
285 #define SYMTAB_PUT( s ) driver.symtab.put( s )
286
287=== modified file 'src/compiler/parsetree/parsenode_print_xml_visitor.cpp'
288--- src/compiler/parsetree/parsenode_print_xml_visitor.cpp 2013-03-22 00:38:18 +0000
289+++ src/compiler/parsetree/parsenode_print_xml_visitor.cpp 2013-05-08 15:05:31 +0000
290@@ -16,9 +16,12 @@
291 #include "stdafx.h"
292
293 #include <ostream>
294-#include "compiler/parsetree/parsenode_print_xml_visitor.h"
295-#include "compiler/parsetree/parsenode_visitor.h"
296+
297 #include "types/typemanager.h"
298+#include "zorbatypes/integer.h"
299+
300+#include "parsenode_print_xml_visitor.h"
301+#include "parsenode_visitor.h"
302
303 using namespace std;
304
305
306=== modified file 'src/compiler/parsetree/parsenodes.cpp'
307--- src/compiler/parsetree/parsenodes.cpp 2013-04-17 22:41:05 +0000
308+++ src/compiler/parsetree/parsenodes.cpp 2013-05-08 15:05:31 +0000
309@@ -29,6 +29,7 @@
310 #include "compiler/parsetree/parsenodes.h"
311 #include "compiler/parser/parse_constants.h"
312 #include "compiler/parsetree/parsenode_visitor.h"
313+#include "zorbatypes/integer.h"
314
315 #include <iostream>
316 #include <sstream>
317
318=== modified file 'src/compiler/parsetree/parsenodes.h'
319--- src/compiler/parsetree/parsenodes.h 2013-05-08 03:19:57 +0000
320+++ src/compiler/parsetree/parsenodes.h 2013-05-08 15:05:31 +0000
321@@ -32,6 +32,9 @@
322
323 #include "store/api/item.h"
324
325+#include "zorbatypes/decimal.h"
326+#include "zorbatypes/integer.h"
327+#include "zorbatypes/floatimpl.h"
328 #include "zorbatypes/rchandle.h"
329 #include "zorbatypes/schema_types.h"
330 #include "zorbatypes/zstring.h"
331
332=== modified file 'src/compiler/rewriter/rules/flwor_rules.cpp'
333--- src/compiler/rewriter/rules/flwor_rules.cpp 2013-04-15 12:07:41 +0000
334+++ src/compiler/rewriter/rules/flwor_rules.cpp 2013-05-08 15:05:31 +0000
335@@ -37,6 +37,8 @@
336
337 #include "system/properties.h"
338
339+#include "zorbatypes/integer.h"
340+
341 #include <memory>
342 #include <iterator>
343
344@@ -300,7 +302,7 @@
345 if (pvar != NULL)
346 {
347 expr* constExpr = rCtx.theEM->
348- create_const_expr(sctx, udf, loc, xs_integer::zero());
349+ create_const_expr(sctx, udf, loc, numeric_consts<xs_integer>::zero());
350
351 subst_vars(rCtx, pvar, constExpr, 2);
352 fc->set_pos_var(NULL);
353@@ -318,7 +320,7 @@
354 if (pvar != NULL && (domQuant == TypeConstants::QUANT_ONE || ! outerFor))
355 {
356 expr* constExpr = rCtx.theEM->
357- create_const_expr(sctx, udf, loc, xs_integer::one());
358+ create_const_expr(sctx, udf, loc, numeric_consts<xs_integer>::one());
359
360 subst_vars(rCtx, pvar, constExpr, 2);
361 fc->set_pos_var(NULL);
362@@ -461,7 +463,7 @@
363 // since one value is still returned, count variables are changed to 1
364 subst_vars(rCtx,
365 static_cast<count_clause*>(clause)->get_var(),
366- rCtx.theEM->create_const_expr(sctx, udf, loc, xs_integer::one()),
367+ rCtx.theEM->create_const_expr(sctx, udf, loc, numeric_consts<xs_integer>::one()),
368 2);
369
370 theFlwor->remove_clause(0);
371
372=== modified file 'src/compiler/rewriter/rules/fold_rules.cpp'
373--- src/compiler/rewriter/rules/fold_rules.cpp 2013-05-04 20:20:05 +0000
374+++ src/compiler/rewriter/rules/fold_rules.cpp 2013-05-08 15:05:31 +0000
375@@ -47,6 +47,8 @@
376 #include "store/api/store.h"
377 #include "store/api/item_factory.h"
378
379+#include "zorbatypes/integer.h"
380+
381 #include <iterator>
382
383 namespace zorba {
384
385=== modified file 'src/compiler/translator/translator.cpp'
386--- src/compiler/translator/translator.cpp 2013-05-08 08:01:05 +0000
387+++ src/compiler/translator/translator.cpp 2013-05-08 15:05:31 +0000
388@@ -88,9 +88,12 @@
389 #include "types/typemanagerimpl.h"
390 #include "types/schema/schema.h"
391
392+#include "zorbamisc/ns_consts.h"
393+#include "zorbatypes/decimal.h"
394+#include "zorbatypes/floatimpl.h"
395+#include "zorbatypes/integer.h"
396+#include "zorbatypes/numconversions.h"
397 #include "zorbatypes/URI.h"
398-#include "zorbatypes/numconversions.h"
399-#include "zorbamisc/ns_consts.h"
400
401 #ifdef ZORBA_WITH_DEBUGGER
402 #include "debugger/debugger_commons.h"
403@@ -11932,8 +11935,8 @@
404 }
405 case FunctionConsts::FN_HEAD_1:
406 {
407- arguments.push_back(CREATE(const)(theRootSctx, theUDF, loc, xs_integer::one()));
408- arguments.push_back(CREATE(const)(theRootSctx, theUDF, loc, xs_integer::one()));
409+ arguments.push_back(CREATE(const)(theRootSctx, theUDF, loc, numeric_consts<xs_integer>::one()));
410+ arguments.push_back(CREATE(const)(theRootSctx, theUDF, loc, numeric_consts<xs_integer>::one()));
411
412 function* f = BUILTIN_FUNC(OP_ZORBA_SUBSEQUENCE_INT_3);
413
414
415=== modified file 'src/functions/udf.cpp'
416--- src/functions/udf.cpp 2013-04-24 01:35:58 +0000
417+++ src/functions/udf.cpp 2013-05-08 15:05:31 +0000
418@@ -36,6 +36,7 @@
419 #include "diagnostics/assert.h"
420
421 #include "types/typeops.h"
422+#include "zorbatypes/integer.h"
423
424 #include "zorbaserialization/serialize_template_types.h"
425 #include "zorbaserialization/serialize_zorba_types.h"
426
427=== modified file 'src/runtime/base/plan_iterator.cpp'
428--- src/runtime/base/plan_iterator.cpp 2013-03-24 20:40:03 +0000
429+++ src/runtime/base/plan_iterator.cpp 2013-05-08 15:05:31 +0000
430@@ -15,18 +15,14 @@
431 */
432 #include "stdafx.h"
433
434+#include "compiler/api/compilercb.h"
435 #include "context/static_context.h"
436-
437-#include "compiler/api/compilercb.h"
438-
439 #include "runtime/base/plan_iterator.h"
440-
441 #include "runtime/util/flowctl_exception.h"
442-
443+#include "store/api/item_factory.h"
444+#include "store/api/store.h"
445 #include "system/globalenv.h"
446-
447-#include "store/api/store.h"
448-#include "store/api/item_factory.h"
449+#include "zorbatypes/integer.h"
450
451
452 namespace zorba
453
454=== modified file 'src/runtime/booleans/BooleanImpl.cpp'
455--- src/runtime/booleans/BooleanImpl.cpp 2013-05-02 00:18:56 +0000
456+++ src/runtime/booleans/BooleanImpl.cpp 2013-05-08 15:05:31 +0000
457@@ -20,6 +20,7 @@
458
459 #include "zorbatypes/collation_manager.h"
460 #include "zorbatypes/datetime.h"
461+#include "zorbatypes/integer.h"
462
463 #include "system/globalenv.h"
464
465
466=== modified file 'src/runtime/collections/collections_base.h'
467--- src/runtime/collections/collections_base.h 2013-02-07 17:24:36 +0000
468+++ src/runtime/collections/collections_base.h 2013-05-08 15:05:31 +0000
469@@ -31,6 +31,7 @@
470 #include "types/typeimpl.h"
471
472 #include "diagnostics/util_macros.h"
473+#include "zorbatypes/integer.h"
474
475
476 namespace zorba {
477
478=== modified file 'src/runtime/collections/collections_impl.cpp'
479--- src/runtime/collections/collections_impl.cpp 2013-03-24 20:40:03 +0000
480+++ src/runtime/collections/collections_impl.cpp 2013-05-08 15:05:31 +0000
481@@ -307,9 +307,9 @@
482 lSkip = lSkipItem->getIntegerValue();
483
484 // negative skip is not allowed
485- if (lSkip < xs_integer::zero())
486+ if (lSkip.sign() < 0)
487 {
488- lSkip = xs_integer::zero();
489+ lSkip = numeric_consts<xs_integer>::zero();
490 }
491
492 if (!lRefPassed)
493@@ -381,11 +381,10 @@
494 // skip parameter passed
495 store::Item_t skipItem;
496 consumeNext(skipItem, theChildren[1].getp(), planState);
497- xs_integer skip = skipItem->getIntegerValue();
498-
499- count -= (skip <= xs_integer::zero() ? xs_integer::zero() : skip);
500-
501- count = (count < xs_integer::zero() ? xs_integer::zero() : count);
502+ xs_integer skip( skipItem->getIntegerValue() );
503+
504+ count -= (skip.sign() <= 0 ? numeric_consts<xs_integer>::zero() : skip);
505+ count = (count.sign() < 0 ? numeric_consts<xs_integer>::zero() : count);
506 }
507
508 STACK_PUSH(GENV_ITEMFACTORY->createInteger(result, count), state);
509
510=== modified file 'src/runtime/core/arithmetic_impl.cpp'
511--- src/runtime/core/arithmetic_impl.cpp 2013-04-08 21:32:54 +0000
512+++ src/runtime/core/arithmetic_impl.cpp 2013-05-08 15:05:31 +0000
513@@ -21,6 +21,7 @@
514 #include "diagnostics/util_macros.h"
515
516 #include "zorbatypes/datetime.h"
517+#include "zorbatypes/decimal.h"
518 #include "zorbatypes/duration.h"
519
520 #include "system/globalenv.h"
521
522=== modified file 'src/runtime/core/var_iterators.h'
523--- src/runtime/core/var_iterators.h 2013-05-08 08:01:05 +0000
524+++ src/runtime/core/var_iterators.h 2013-05-08 15:05:31 +0000
525@@ -23,7 +23,7 @@
526 #include "runtime/base/unarybase.h"
527 #include "runtime/base/narybase.h"
528
529-#include "zorbatypes/schema_types.h"
530+#include "zorbatypes/integer.h"
531
532
533 namespace zorba
534
535=== modified file 'src/runtime/durations_dates_times/durations_dates_times_impl.cpp'
536--- src/runtime/durations_dates_times/durations_dates_times_impl.cpp 2013-02-07 17:24:36 +0000
537+++ src/runtime/durations_dates_times/durations_dates_times_impl.cpp 2013-05-08 15:05:31 +0000
538@@ -17,6 +17,8 @@
539
540 #include "zorbatypes/datetime.h"
541 #include "zorbatypes/duration.h"
542+#include "zorbatypes/decimal.h"
543+#include "zorbatypes/integer.h"
544 #include "zorbatypes/numconversions.h"
545 #include "zorbatypes/datetime/parse.h"
546
547
548=== modified file 'src/runtime/full_text/ft_module_impl.cpp'
549--- src/runtime/full_text/ft_module_impl.cpp 2013-04-16 22:12:03 +0000
550+++ src/runtime/full_text/ft_module_impl.cpp 2013-05-08 15:05:31 +0000
551@@ -46,6 +46,7 @@
552 #include "types/typeops.h"
553 #include "util/stl_util.h"
554 #include "util/utf8_util.h"
555+#include "zorbatypes/integer.h"
556 #include "zorbatypes/URI.h"
557 #include "zorbautils/locale.h"
558
559
560=== modified file 'src/runtime/full_text/ft_util.cpp'
561--- src/runtime/full_text/ft_util.cpp 2013-02-07 17:24:36 +0000
562+++ src/runtime/full_text/ft_util.cpp 2013-05-08 15:05:31 +0000
563@@ -20,6 +20,7 @@
564
565 #include "diagnostics/xquery_diagnostics.h"
566 #include "zorbamisc/ns_consts.h"
567+#include "zorbatypes/integer.h"
568 #include "zorbatypes/numconversions.h"
569 #include "zorbautils/locale.h"
570
571
572=== modified file 'src/runtime/full_text/ftcontains_visitor.cpp'
573--- src/runtime/full_text/ftcontains_visitor.cpp 2013-02-07 17:24:36 +0000
574+++ src/runtime/full_text/ftcontains_visitor.cpp 2013-05-08 15:05:31 +0000
575@@ -24,12 +24,11 @@
576 #include "compiler/parser/query_loc.h"
577 #include "diagnostics/xquery_diagnostics.h"
578 #include "store/api/store.h"
579-
580 #include "system/globalenv.h"
581-
582 #include "util/cxx_util.h"
583 #include "util/indent.h"
584 #include "util/stl_util.h"
585+#include "zorbatypes/integer.h"
586
587 #ifndef NDEBUG
588 #include "system/properties.h"
589
590=== modified file 'src/runtime/hof/dynamic_fncall_iterator.cpp'
591--- src/runtime/hof/dynamic_fncall_iterator.cpp 2013-05-05 04:49:50 +0000
592+++ src/runtime/hof/dynamic_fncall_iterator.cpp 2013-05-08 15:05:31 +0000
593@@ -34,6 +34,7 @@
594 #include "types/root_typemanager.h"
595 #include "types/casting.h"
596 #include "types/typeops.h"
597+#include "zorbatypes/integer.h"
598
599 #include "system/globalenv.h"
600
601
602=== modified file 'src/runtime/hof/fn_hof_functions_impl.cpp'
603--- src/runtime/hof/fn_hof_functions_impl.cpp 2013-04-24 01:35:58 +0000
604+++ src/runtime/hof/fn_hof_functions_impl.cpp 2013-05-08 15:05:31 +0000
605@@ -42,6 +42,7 @@
606 #include "system/globalenv.h"
607
608 #include "zorbamisc/ns_consts.h"
609+#include "zorbatypes/integer.h"
610
611
612 #include "compiler/expression/expr_manager.h"
613
614=== modified file 'src/runtime/indexing/index_ddl.cpp'
615--- src/runtime/indexing/index_ddl.cpp 2013-03-24 20:40:03 +0000
616+++ src/runtime/indexing/index_ddl.cpp 2013-05-08 15:05:31 +0000
617@@ -34,6 +34,8 @@
618 #include "types/typeimpl.h"
619 #include "types/typeops.h"
620 #include "types/casting.h"
621+#include "zorbatypes/decimal.h"
622+#include "zorbatypes/integer.h"
623
624 #include "context/static_context.h"
625 #include "context/dynamic_context.h"
626@@ -623,7 +625,7 @@
627 PlanState& planState) const
628 {
629 store::IndexCondition_t cond;
630- xs_integer skip = xs_integer::zero();
631+ xs_integer skip( numeric_consts<xs_integer>::zero() );
632
633 try
634 {
635@@ -641,8 +643,8 @@
636 store::Item_t skipItem;
637 ZORBA_ASSERT(consumeNext(skipItem, theChildren[1], planState));
638 skip = skipItem->getIntegerValue();
639- if (skip < xs_integer::zero())
640- skip = xs_integer::zero();
641+ if (skip.sign() < 0)
642+ skip = numeric_consts<xs_integer>::zero();
643 }
644
645 state->theIterator->init(cond, skip);
646@@ -687,8 +689,8 @@
647 store::Item_t skipItem;
648 ZORBA_ASSERT(consumeNext(skipItem, theChildren[1], planState));
649 skip = skipItem->getIntegerValue();
650- if (skip < xs_integer::zero())
651- skip = xs_integer::zero();
652+ if (skip.sign() < 0)
653+ skip = numeric_consts<xs_integer>::zero();
654 }
655
656 state->theIterator->init(cond, skip);
657@@ -1071,7 +1073,7 @@
658 PlanState& planState) const
659 {
660 store::IndexCondition_t cond;
661- xs_integer skip = xs_integer::zero();
662+ xs_integer skip( numeric_consts<xs_integer>::zero() );
663
664 try
665 {
666@@ -1087,8 +1089,8 @@
667 store::Item_t skipItem;
668 ZORBA_ASSERT(consumeNext(skipItem, theChildren[1], planState));
669 skip = skipItem->getIntegerValue();
670- if (skip < xs_integer::zero())
671- skip = xs_integer::zero();
672+ if (skip.sign() < 0)
673+ skip = numeric_consts<xs_integer>::zero();
674 }
675
676 state->theIterator->init(cond, skip);
677@@ -1114,7 +1116,7 @@
678 PlanState& planState) const
679 {
680 store::IndexCondition_t cond;
681- xs_integer skip = xs_integer::zero();
682+ xs_integer skip( numeric_consts<xs_integer>::zero() );
683
684 try
685 {
686@@ -1130,8 +1132,8 @@
687 store::Item_t skipItem;
688 ZORBA_ASSERT(consumeNext(skipItem, theChildren[1], planState));
689 skip = skipItem->getIntegerValue();
690- if (skip < xs_integer::zero())
691- skip = xs_integer::zero();
692+ if (skip.sign() < 0)
693+ skip = numeric_consts<xs_integer>::zero();
694 }
695
696 state->theIterator->init(cond, skip);
697
698=== modified file 'src/runtime/introspection/sctx_impl.cpp'
699--- src/runtime/introspection/sctx_impl.cpp 2013-02-07 17:24:36 +0000
700+++ src/runtime/introspection/sctx_impl.cpp 2013-05-08 15:05:31 +0000
701@@ -19,6 +19,7 @@
702
703 #include "diagnostics/assert.h"
704 #include "diagnostics/xquery_diagnostics.h"
705+#include "zorbatypes/integer.h"
706 #include "zorbatypes/numconversions.h"
707
708 #include "system/globalenv.h"
709
710=== modified file 'src/runtime/item/item_impl.cpp'
711--- src/runtime/item/item_impl.cpp 2012-07-17 18:47:54 +0000
712+++ src/runtime/item/item_impl.cpp 2013-05-08 15:05:31 +0000
713@@ -25,6 +25,7 @@
714 #include "store/api/store.h"
715
716 #include "util/mem_sizeof.h"
717+#include "zorbatypes/integer.h"
718
719 using namespace std;
720
721
722=== modified file 'src/runtime/json/jsoniq_functions_impl.cpp'
723--- src/runtime/json/jsoniq_functions_impl.cpp 2013-05-05 04:49:50 +0000
724+++ src/runtime/json/jsoniq_functions_impl.cpp 2013-05-08 15:05:31 +0000
725@@ -46,6 +46,7 @@
726 #include "types/typeimpl.h"
727 #include "types/typeops.h"
728 #include "types/root_typemanager.h"
729+#include "zorbatypes/integer.h"
730
731 #include <runtime/util/doc_uri_heuristics.h>
732
733
734=== modified file 'src/runtime/maths/pregenerated/maths.cpp'
735--- src/runtime/maths/pregenerated/maths.cpp 2013-03-05 23:11:50 +0000
736+++ src/runtime/maths/pregenerated/maths.cpp 2013-05-08 15:05:31 +0000
737@@ -640,12 +640,12 @@
738
739 void ModfIteratorState::init(PlanState& planState) {
740 PlanIteratorState::init(planState);
741- theDoubInteger = xs_double::zero();
742+ theDoubInteger = numeric_consts<xs_double>::zero();
743 }
744
745 void ModfIteratorState::reset(PlanState& planState) {
746 PlanIteratorState::reset(planState);
747- theDoubInteger = xs_double::zero();
748+ theDoubInteger = numeric_consts<xs_double>::zero();
749 }
750 // </ModfIterator>
751
752@@ -678,12 +678,12 @@
753
754 void FrexpIteratorState::init(PlanState& planState) {
755 PlanIteratorState::init(planState);
756- theIntExponent = xs_integer::zero();
757+ theIntExponent = numeric_consts<xs_integer>::zero();
758 }
759
760 void FrexpIteratorState::reset(PlanState& planState) {
761 PlanIteratorState::reset(planState);
762- theIntExponent = xs_integer::zero();
763+ theIntExponent = numeric_consts<xs_integer>::zero();
764 }
765 // </FrexpIterator>
766
767
768=== modified file 'src/runtime/maths/pregenerated/maths.h'
769--- src/runtime/maths/pregenerated/maths.h 2013-03-05 23:11:50 +0000
770+++ src/runtime/maths/pregenerated/maths.h 2013-05-08 15:05:31 +0000
771@@ -29,6 +29,7 @@
772 #include "runtime/base/binarybase.h"
773 #include "runtime/base/noarybase.h"
774
775+#include "zorbatypes/integer.h"
776 #include "zorbatypes/schema_types.h"
777
778
779
780=== modified file 'src/runtime/numerics/NumericsImpl.cpp'
781--- src/runtime/numerics/NumericsImpl.cpp 2013-02-07 17:24:36 +0000
782+++ src/runtime/numerics/NumericsImpl.cpp 2013-05-08 15:05:31 +0000
783@@ -20,6 +20,8 @@
784 #include "diagnostics/assert.h"
785 #include "diagnostics/util_macros.h"
786 #include "diagnostics/xquery_diagnostics.h"
787+#include "zorbatypes/decimal.h"
788+#include "zorbatypes/integer.h"
789 #include "zorbatypes/zorbatypes_decl.h"
790
791 #include "system/globalenv.h"
792@@ -393,7 +395,7 @@
793 {
794 xs_decimal ld0 = i0->getDecimalValue();
795 xs_decimal ld1 = i1->getDecimalValue();
796- if ( ld1 == Integer::zero() )
797+ if ( ld1.sign() == 0 )
798 {
799 throw XQUERY_EXCEPTION( err::FOAR0001, ERROR_LOC( loc ) );
800 }
801@@ -412,7 +414,7 @@
802 {
803 xs_decimal const ll0(i0->getIntegerValue());
804 xs_decimal const ll1(i1->getIntegerValue());
805- if ( ll1 == Integer::zero() )
806+ if ( ll1.sign() == 0 )
807 {
808 throw XQUERY_EXCEPTION( err::FOAR0001, ERROR_LOC( loc ) );
809 }
810@@ -435,7 +437,7 @@
811 xs_double d0 = i0->getDoubleValue();
812 xs_double d1 = i1->getDoubleValue();
813
814- if ( d1 == xs_double::zero() )
815+ if ( d1 == numeric_consts<xs_double>::zero() )
816 {
817 throw XQUERY_EXCEPTION( err::FOAR0001, ERROR_LOC( loc ) );
818 }
819@@ -455,7 +457,7 @@
820
821 if (i0->isPosOrNegInf()) {
822 // idiv with +-INF divisor has 0 as result
823- return GENV_ITEMFACTORY->createInteger(result, Integer::zero());
824+ return GENV_ITEMFACTORY->createInteger(result, numeric_consts<xs_integer>::zero());
825 }
826
827 xs_integer const lInteger( d0 / d1 );
828@@ -474,7 +476,7 @@
829 {
830 xs_float f0 = i0->getFloatValue();
831 xs_float f1 = i1->getFloatValue();
832- if ( f1 == xs_float::zero() )
833+ if ( f1 == numeric_consts<xs_float>::zero() )
834 {
835 throw XQUERY_EXCEPTION( err::FOAR0001, ERROR_LOC( loc ) );
836 }
837@@ -494,7 +496,7 @@
838 if (i0->isPosOrNegInf())
839 {
840 // idiv with +-INF divisor has 0 as result
841- return GENV_ITEMFACTORY->createInteger(result, Integer::zero());
842+ return GENV_ITEMFACTORY->createInteger(result, numeric_consts<xs_integer>::zero());
843 }
844
845 xs_integer const lInteger( f0 / f1 );
846@@ -606,7 +608,7 @@
847 xs_integer ll0 = i0->getIntegerValue();
848 xs_integer ll1 = i1->getIntegerValue();
849
850- if (ll1 == Integer::zero())
851+ if ( ll1.sign() == 0 )
852 {
853 throw XQUERY_EXCEPTION(err::FOAR0001, ERROR_LOC(loc));
854 }
855
856=== modified file 'src/runtime/numerics/format_integer.cpp'
857--- src/runtime/numerics/format_integer.cpp 2013-05-04 20:27:31 +0000
858+++ src/runtime/numerics/format_integer.cpp 2013-05-08 15:05:31 +0000
859@@ -34,6 +34,7 @@
860 #include "util/stream_util.h"
861 #include "util/unicode_util.h"
862 #include "util/utf8_string.h"
863+#include "zorbatypes/integer.h"
864 #include "zorbatypes/numconversions.h"
865
866 using namespace std;
867
868=== modified file 'src/runtime/numerics/format_number.cpp'
869--- src/runtime/numerics/format_number.cpp 2013-05-03 23:19:41 +0000
870+++ src/runtime/numerics/format_number.cpp 2013-05-08 15:05:31 +0000
871@@ -31,7 +31,8 @@
872 #include "types/typeconstants.h"
873 #include "types/typeops.h"
874 #include "util/xml_util.h"
875-#include "zorbatypes/zorbatypes_decl.h"
876+#include "zorbatypes/floatimpl.h"
877+#include "zorbatypes/integer.h"
878
879 namespace zorba {
880
881@@ -258,7 +259,7 @@
882 );
883
884 store::Item_t zero;
885- GENV_ITEMFACTORY->createDouble( zero, xs_double::zero() );
886+ GENV_ITEMFACTORY->createDouble( zero, numeric_consts<xs_double>::zero() );
887
888 //
889 // Ibid: [T]he positive sub-picture and its associated variables are used if
890
891=== modified file 'src/runtime/numerics/numerics_impl.cpp'
892--- src/runtime/numerics/numerics_impl.cpp 2013-04-11 17:37:16 +0000
893+++ src/runtime/numerics/numerics_impl.cpp 2013-05-08 15:05:31 +0000
894@@ -22,6 +22,8 @@
895 #include "diagnostics/assert.h"
896 #include "diagnostics/util_macros.h"
897 #include "diagnostics/xquery_diagnostics.h"
898+#include "zorbatypes/decimal.h"
899+#include "zorbatypes/integer.h"
900 #include "zorbatypes/zorbatypes_decl.h"
901
902 #include "system/globalenv.h"
903@@ -97,7 +99,7 @@
904 }
905 else if (TypeOps::is_subtype(tm, *type, *rtm.INTEGER_TYPE_ONE))
906 {
907- if (result->getIntegerValue() >= xs_decimal::zero())
908+ if (result->getIntegerValue().sign() >= 0)
909 {
910 if ( !TypeOps::is_equal(tm, *type, *rtm.INTEGER_TYPE_ONE))
911 GENV_ITEMFACTORY->createInteger(result, result->getIntegerValue());
912@@ -109,7 +111,7 @@
913 }
914 else if (TypeOps::is_subtype(tm, *type, *rtm.DECIMAL_TYPE_ONE))
915 {
916- if ( result->getDecimalValue() >= xs_decimal::zero())
917+ if ( result->getDecimalValue().sign() >= 0)
918 {
919 if ( !TypeOps::is_equal(tm, *type, *rtm.DECIMAL_TYPE_ONE))
920 GENV_ITEMFACTORY->createDecimal(result, result->getDecimalValue());
921@@ -301,7 +303,7 @@
922 //item type is subtype of INTEGER
923 else if(TypeOps::is_subtype(tm, *type, *rtm.INTEGER_TYPE_ONE))
924 {
925- if(precision_integer < Integer::zero())
926+ if(precision_integer.sign() < 0)
927 GENV_ITEMFACTORY->createInteger(result, result->getIntegerValue().round(precision_integer));
928 }
929
930
931=== modified file 'src/runtime/random/pregenerated/random.h'
932--- src/runtime/random/pregenerated/random.h 2013-03-05 23:11:50 +0000
933+++ src/runtime/random/pregenerated/random.h 2013-05-08 15:05:31 +0000
934@@ -29,6 +29,7 @@
935
936
937 #include "runtime/base/narybase.h"
938+#include "zorbatypes/integer.h"
939
940
941 namespace zorba {
942
943=== modified file 'src/runtime/sequences/pregenerated/sequences.cpp'
944--- src/runtime/sequences/pregenerated/sequences.cpp 2013-04-15 20:57:28 +0000
945+++ src/runtime/sequences/pregenerated/sequences.cpp 2013-05-08 15:05:31 +0000
946@@ -238,15 +238,15 @@
947
948 void FnInsertBeforeIteratorState::init(PlanState& planState) {
949 PlanIteratorState::init(planState);
950- theCurrentPos = xs_integer::zero();
951- thePosition = xs_integer::zero();
952+ theCurrentPos = numeric_consts<xs_integer>::zero();
953+ thePosition = numeric_consts<xs_integer>::zero();
954 theTargetItem = NULL;
955 }
956
957 void FnInsertBeforeIteratorState::reset(PlanState& planState) {
958 PlanIteratorState::reset(planState);
959- theCurrentPos = xs_integer::zero();
960- thePosition = xs_integer::zero();
961+ theCurrentPos = numeric_consts<xs_integer>::zero();
962+ thePosition = numeric_consts<xs_integer>::zero();
963 theTargetItem = NULL;
964 }
965 // </FnInsertBeforeIterator>
966@@ -284,15 +284,15 @@
967
968 void FnRemoveIteratorState::init(PlanState& planState) {
969 PlanIteratorState::init(planState);
970- theCurrentPos = xs_integer::zero();
971- thePosition = xs_integer::zero();
972+ theCurrentPos = numeric_consts<xs_integer>::zero();
973+ thePosition = numeric_consts<xs_integer>::zero();
974 theCollator = 0;
975 }
976
977 void FnRemoveIteratorState::reset(PlanState& planState) {
978 PlanIteratorState::reset(planState);
979- theCurrentPos = xs_integer::zero();
980- thePosition = xs_integer::zero();
981+ theCurrentPos = numeric_consts<xs_integer>::zero();
982+ thePosition = numeric_consts<xs_integer>::zero();
983 theCollator = 0;
984 }
985 // </FnRemoveIterator>
986@@ -863,16 +863,16 @@
987
988 void OpToIteratorState::init(PlanState& planState) {
989 PlanIteratorState::init(planState);
990- theCurInt = xs_integer::zero();
991- theFirstVal = xs_integer::zero();
992- theLastVal = xs_integer::zero();
993+ theCurInt = numeric_consts<xs_integer>::zero();
994+ theFirstVal = numeric_consts<xs_integer>::zero();
995+ theLastVal = numeric_consts<xs_integer>::zero();
996 }
997
998 void OpToIteratorState::reset(PlanState& planState) {
999 PlanIteratorState::reset(planState);
1000- theCurInt = xs_integer::zero();
1001- theFirstVal = xs_integer::zero();
1002- theLastVal = xs_integer::zero();
1003+ theCurInt = numeric_consts<xs_integer>::zero();
1004+ theFirstVal = numeric_consts<xs_integer>::zero();
1005+ theLastVal = numeric_consts<xs_integer>::zero();
1006 }
1007 // </OpToIterator>
1008
1009
1010=== modified file 'src/runtime/sequences/pregenerated/sequences.h'
1011--- src/runtime/sequences/pregenerated/sequences.h 2013-04-15 20:57:28 +0000
1012+++ src/runtime/sequences/pregenerated/sequences.h 2013-05-08 15:05:31 +0000
1013@@ -31,6 +31,7 @@
1014 #include "runtime/base/narybase.h"
1015 #include "runtime/base/narybase.h"
1016 #include "runtime/core/path_iterators.h"
1017+#include "zorbatypes/integer.h"
1018
1019
1020 namespace zorba {
1021
1022=== modified file 'src/runtime/sequences/sequences_impl.cpp'
1023--- src/runtime/sequences/sequences_impl.cpp 2013-05-01 23:06:33 +0000
1024+++ src/runtime/sequences/sequences_impl.cpp 2013-05-08 15:05:31 +0000
1025@@ -20,12 +20,13 @@
1026 #include <vector>
1027 #include <sstream>
1028
1029-#include <zorbautils/fatal.h>
1030 #include "diagnostics/xquery_diagnostics.h"
1031 #include "diagnostics/util_macros.h"
1032
1033-#include <zorbatypes/URI.h>
1034-#include <zorbamisc/ns_consts.h>
1035+#include "zorbatypes/decimal.h"
1036+#include "zorbatypes/URI.h"
1037+#include "zorbamisc/ns_consts.h"
1038+#include "zorbautils/fatal.h"
1039
1040 // For timing
1041 #include <zorba/util/time.h>
1042@@ -1599,7 +1600,10 @@
1043 else
1044 {
1045 STACK_PUSH(
1046- GENV_ITEMFACTORY->createInteger( result, Integer::zero() ), state
1047+ GENV_ITEMFACTORY->createInteger(
1048+ result, numeric_consts<xs_integer>::zero()
1049+ ),
1050+ state
1051 );
1052 }
1053 }
1054@@ -1648,7 +1652,7 @@
1055 }
1056 else
1057 {
1058- GENV_ITEMFACTORY->createInteger(result, Integer::zero());
1059+ GENV_ITEMFACTORY->createInteger(result, numeric_consts<xs_integer>::zero());
1060 STACK_PUSH(true, state);
1061 }
1062
1063@@ -1697,7 +1701,7 @@
1064 }
1065 else
1066 {
1067- GENV_ITEMFACTORY->createInteger(result, Integer::zero());
1068+ GENV_ITEMFACTORY->createInteger(result, numeric_consts<xs_integer>::zero());
1069 STACK_PUSH(true, state);
1070 }
1071
1072@@ -1745,7 +1749,7 @@
1073 }
1074 else
1075 {
1076- GENV_ITEMFACTORY->createInteger(result, Integer::zero());
1077+ GENV_ITEMFACTORY->createInteger(result, numeric_consts<xs_integer>::zero());
1078 STACK_PUSH(true, state);
1079 }
1080
1081@@ -1803,7 +1807,7 @@
1082 }
1083 else
1084 {
1085- GENV_ITEMFACTORY->createInteger(result, Integer::zero());
1086+ GENV_ITEMFACTORY->createInteger(result, numeric_consts<xs_integer>::zero());
1087 STACK_PUSH(true, state);
1088 }
1089
1090
1091=== modified file 'src/runtime/spec/maths/maths.xml'
1092--- src/runtime/spec/maths/maths.xml 2013-02-07 17:24:36 +0000
1093+++ src/runtime/spec/maths/maths.xml 2013-05-08 15:05:31 +0000
1094@@ -6,6 +6,7 @@
1095 xsi:schemaLocation="http://www.zorba-xquery.com ../runtime.xsd">
1096
1097 <zorba:header>
1098+ <zorba:include form="Quoted">zorbatypes/integer.h</zorba:include>
1099 <zorba:include form="Quoted">zorbatypes/schema_types.h</zorba:include>
1100 </zorba:header>
1101
1102@@ -462,7 +463,7 @@
1103 </zorba:function>
1104
1105 <zorba:state generateInit="true" generateReset="true">
1106- <zorba:member type="xs_double" name="theDoubInteger" defaultValue="xs_double::zero()"
1107+ <zorba:member type="xs_double" name="theDoubInteger" defaultValue="numeric_consts&lt;xs_double&gt;::zero()"
1108 brief=""/>
1109 </zorba:state>
1110
1111@@ -485,7 +486,7 @@
1112 </zorba:function>
1113
1114 <zorba:state generateInit="true" generateReset="true">
1115- <zorba:member type="xs_integer" name="theIntExponent" defaultValue="xs_integer::zero()"
1116+ <zorba:member type="xs_integer" name="theIntExponent" defaultValue="numeric_consts&lt;xs_integer&gt;::zero()"
1117 brief=""/>
1118 </zorba:state>
1119
1120
1121=== modified file 'src/runtime/spec/random/random.xml'
1122--- src/runtime/spec/random/random.xml 2013-02-07 17:24:36 +0000
1123+++ src/runtime/spec/random/random.xml 2013-05-08 15:05:31 +0000
1124@@ -12,6 +12,10 @@
1125 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
1126 xsi:schemaLocation="http://www.zorba-xquery.com ../runtime.xsd">
1127
1128+<zorba:header>
1129+ <zorba:include form="Quoted">zorbatypes/integer.h</zorba:include>
1130+</zorba:header>
1131+
1132 <!--
1133 /*******************************************************************************
1134 ********************************************************************************/
1135
1136=== modified file 'src/runtime/spec/sequences/sequences.xml'
1137--- src/runtime/spec/sequences/sequences.xml 2013-04-15 20:57:28 +0000
1138+++ src/runtime/spec/sequences/sequences.xml 2013-05-08 15:05:31 +0000
1139@@ -15,6 +15,7 @@
1140 <zorba:header>
1141 <zorba:include form="Quoted">runtime/base/narybase.h</zorba:include>
1142 <zorba:include form="Quoted">runtime/core/path_iterators.h</zorba:include>
1143+ <zorba:include form="Quoted">zorbatypes/integer.h</zorba:include>
1144 <zorba:fwd-decl ns="zorba">NodeHandleHashSet</zorba:fwd-decl>
1145 <zorba:fwd-decl ns="zorba">AtomicItemHandleHashSet</zorba:fwd-decl>
1146 </zorba:header>
1147@@ -283,10 +284,10 @@
1148
1149 <zorba:state>
1150 <zorba:member type="xs_integer" name="theCurrentPos"
1151- defaultValue="xs_integer::zero()" brief="the current position in the sequence"/>
1152+ defaultValue="numeric_consts&lt;xs_integer&gt;::zero()" brief="the current position in the sequence"/>
1153
1154 <zorba:member type="xs_integer" name="thePosition"
1155- defaultValue="xs_integer::zero()" brief=""/>
1156+ defaultValue="numeric_consts&lt;xs_integer&gt;::zero()" brief=""/>
1157
1158 <zorba:member type="store::Item_t" name="theTargetItem"
1159 defaultValue="NULL" brief=""/>
1160@@ -328,10 +329,10 @@
1161
1162 <zorba:state>
1163 <zorba:member type="xs_integer" name="theCurrentPos"
1164- defaultValue="xs_integer::zero()" brief="the current position in the sequence"/>
1165+ defaultValue="numeric_consts&lt;xs_integer&gt;::zero()" brief="the current position in the sequence"/>
1166
1167 <zorba:member type="xs_integer" name="thePosition"
1168- defaultValue="xs_integer::zero()" brief="the position to delete"/>
1169+ defaultValue="numeric_consts&lt;xs_integer&gt;::zero()" brief="the position to delete"/>
1170
1171 <zorba:member type="XQPCollator*" name="theCollator"
1172 defaultValue="0" brief="the collator"/>
1173@@ -952,12 +953,12 @@
1174
1175 <zorba:state>
1176 <zorba:member type="xs_integer" name="theCurInt"
1177- defaultValue="xs_integer::zero()" brief="the current integer"/>
1178+ defaultValue="numeric_consts&lt;xs_integer&gt;::zero()" brief="the current integer"/>
1179
1180 <zorba:member type="xs_integer" name="theFirstVal"
1181- defaultValue="xs_integer::zero()" brief="first integer"/>
1182+ defaultValue="numeric_consts&lt;xs_integer&gt;::zero()" brief="first integer"/>
1183
1184- <zorba:member type="xs_integer" name="theLastVal" defaultValue="xs_integer::zero()"
1185+ <zorba:member type="xs_integer" name="theLastVal" defaultValue="numeric_consts&lt;xs_integer&gt;::zero()"
1186 brief="last integer"/>
1187 </zorba:state>
1188
1189
1190=== modified file 'src/runtime/store/maps_impl.cpp'
1191--- src/runtime/store/maps_impl.cpp 2013-03-05 12:34:19 +0000
1192+++ src/runtime/store/maps_impl.cpp 2013-05-08 15:05:31 +0000
1193@@ -19,6 +19,7 @@
1194 #include "diagnostics/util_macros.h"
1195 #include "diagnostics/xquery_diagnostics.h"
1196
1197+#include "zorbatypes/integer.h"
1198 #include "zorbatypes/URI.h"
1199
1200 #include "system/globalenv.h"
1201
1202=== modified file 'src/runtime/strings/strings_impl.cpp'
1203--- src/runtime/strings/strings_impl.cpp 2013-05-04 20:20:05 +0000
1204+++ src/runtime/strings/strings_impl.cpp 2013-05-08 15:05:31 +0000
1205@@ -25,6 +25,7 @@
1206 #include "diagnostics/xquery_diagnostics.h"
1207 #include "diagnostics/util_macros.h"
1208
1209+#include "zorbatypes/integer.h"
1210 #include "zorbatypes/numconversions.h"
1211
1212 #include "system/globalenv.h"
1213@@ -734,8 +735,12 @@
1214 }
1215 else
1216 {
1217- STACK_PUSH(GENV_ITEMFACTORY->createInteger(result, xs_integer::zero()),
1218- state);
1219+ STACK_PUSH(
1220+ GENV_ITEMFACTORY->createInteger(
1221+ result, numeric_consts<xs_integer>::zero()
1222+ ),
1223+ state
1224+ );
1225 }
1226 STACK_END(state);
1227 }
1228
1229=== modified file 'src/store/api/collection.h'
1230--- src/store/api/collection.h 2013-02-07 17:24:36 +0000
1231+++ src/store/api/collection.h 2013-05-08 15:05:31 +0000
1232@@ -59,7 +59,7 @@
1233 * @return Iterator
1234 */
1235 virtual Iterator_t getIterator(
1236- const xs_integer& aSkip = xs_integer::zero(),
1237+ const xs_integer& aSkip = numeric_consts<xs_integer>::zero(),
1238 const zstring& aStart = "") = 0;
1239
1240 /**
1241
1242=== modified file 'src/store/api/iterator.h'
1243--- src/store/api/iterator.h 2013-03-05 00:45:43 +0000
1244+++ src/store/api/iterator.h 2013-05-08 15:05:31 +0000
1245@@ -177,7 +177,7 @@
1246 virtual ~IndexProbeIterator() { }
1247
1248 virtual void init(const IndexCondition_t& cond,
1249- const xs_integer& aSkip = xs_integer::zero()) = 0;
1250+ const xs_integer& aSkip = numeric_consts<xs_integer>::zero()) = 0;
1251
1252 virtual void open() = 0;
1253
1254
1255=== modified file 'src/store/naive/atomic_items.cpp'
1256--- src/store/naive/atomic_items.cpp 2013-04-16 21:12:12 +0000
1257+++ src/store/naive/atomic_items.cpp 2013-05-08 15:05:31 +0000
1258@@ -2691,7 +2691,7 @@
1259
1260 bool DecimalItem::getEBV() const
1261 {
1262- return ( theValue != xs_decimal::zero() );
1263+ return !!theValue.sign();
1264 }
1265
1266
1267
1268=== modified file 'src/store/naive/atomic_items.h'
1269--- src/store/naive/atomic_items.h 2013-04-08 08:45:18 +0000
1270+++ src/store/naive/atomic_items.h 2013-05-08 15:05:31 +0000
1271@@ -38,8 +38,11 @@
1272 #include "naive_ft_token_iterator.h"
1273 #endif /* ZORBA_NO_FULL_TEXT */
1274
1275+#include "zorbatypes/datetime.h"
1276+#include "zorbatypes/decimal.h"
1277+#include "zorbatypes/floatimpl.h"
1278+#include "zorbatypes/integer.h"
1279 #include "zorbatypes/schema_types.h"
1280-#include "zorbatypes/datetime.h"
1281
1282 #include "diagnostics/xquery_diagnostics.h"
1283 #include "ordpath.h"
1284
1285=== modified file 'src/store/naive/collection.h'
1286--- src/store/naive/collection.h 2013-02-26 04:12:43 +0000
1287+++ src/store/naive/collection.h 2013-05-08 15:05:31 +0000
1288@@ -17,6 +17,7 @@
1289 #define ZORBA_SIMPLESTORE_COLLECTION
1290
1291 #include "store/api/collection.h"
1292+#include "zorbatypes/integer.h"
1293
1294 #include "shared_types.h"
1295 #include "tree_id.h"
1296
1297=== modified file 'src/store/naive/collection_tree_info.h'
1298--- src/store/naive/collection_tree_info.h 2013-02-06 18:52:32 +0000
1299+++ src/store/naive/collection_tree_info.h 2013-05-08 15:05:31 +0000
1300@@ -18,6 +18,7 @@
1301 #define ZORBA_STORE_COLLECTION_TREE_INFO_H
1302
1303 #include <zorba/config.h>
1304+#include "zorbatypes/integer.h"
1305
1306 namespace zorba
1307 {
1308
1309=== modified file 'src/store/naive/pul_primitives.cpp'
1310--- src/store/naive/pul_primitives.cpp 2013-02-26 04:12:43 +0000
1311+++ src/store/naive/pul_primitives.cpp 2013-05-08 15:05:31 +0000
1312@@ -1147,7 +1147,7 @@
1313
1314 assert(lColl);
1315
1316- xs_integer const zero( xs_integer::zero() );
1317+ xs_integer const zero( numeric_consts<xs_integer>::zero() );
1318 for (std::size_t i = 0; i < theNumApplied; ++i)
1319 {
1320 ZORBA_ASSERT(theNodes[i] == lColl->nodeAt(zero));
1321
1322=== modified file 'src/store/naive/simple_collection.cpp'
1323--- src/store/naive/simple_collection.cpp 2013-04-16 21:12:12 +0000
1324+++ src/store/naive/simple_collection.cpp 2013-05-08 15:05:31 +0000
1325@@ -93,7 +93,7 @@
1326 const zstring& startRef)
1327 {
1328 store::Item_t startNode;
1329- xs_integer startPos = xs_integer::zero();
1330+ xs_integer startPos;
1331
1332 if (startRef.size() != 0 &&
1333 (!GET_STORE().getNodeByReference(startNode, startRef) ||
1334@@ -511,7 +511,7 @@
1335
1336 if (num == 0 || pos >= theTrees.size())
1337 {
1338- return xs_integer::zero();
1339+ return numeric_consts<xs_integer>::zero();
1340 }
1341 else
1342 {
1343
1344=== modified file 'src/store/naive/simple_index_value.h'
1345--- src/store/naive/simple_index_value.h 2013-02-07 17:24:36 +0000
1346+++ src/store/naive/simple_index_value.h 2013-05-08 15:05:31 +0000
1347@@ -17,6 +17,7 @@
1348 #define ZORBA_SIMPLE_STORE_INDEX_HASH_VALUE
1349
1350 #include "simple_index.h"
1351+#include "zorbatypes/integer.h"
1352 #include <map>
1353
1354 namespace zorba
1355
1356=== modified file 'src/store/naive/simple_lazy_temp_seq.cpp'
1357--- src/store/naive/simple_lazy_temp_seq.cpp 2013-04-16 21:12:12 +0000
1358+++ src/store/naive/simple_lazy_temp_seq.cpp 2013-05-08 15:05:31 +0000
1359@@ -21,9 +21,9 @@
1360 #include "diagnostics/dict.h"
1361 #include "diagnostics/util_macros.h"
1362 #include "diagnostics/xquery_exception.h"
1363-
1364+#include "simple_lazy_temp_seq.h"
1365 #include "store/api/item.h"
1366-#include "simple_lazy_temp_seq.h"
1367+#include "zorbatypes/integer.h"
1368
1369
1370 namespace zorba
1371
1372=== modified file 'src/store/naive/simple_pul.cpp'
1373--- src/store/naive/simple_pul.cpp 2013-04-17 18:37:33 +0000
1374+++ src/store/naive/simple_pul.cpp 2013-05-08 15:05:31 +0000
1375@@ -1419,8 +1419,7 @@
1376
1377 xs_integer pos = position->getIntegerValue();
1378
1379- if (pos <= xs_integer::zero() ||
1380- arr->getArraySize() + 1 < pos)
1381+ if (pos.sign() <= 0 || arr->getArraySize() + 1 < pos)
1382 {
1383 RAISE_ERROR(jerr::JNUP0016, loc,
1384 ERROR_PARAMS(ZED(JNUP0016_Array), position->getStringValue()));
1385@@ -1557,8 +1556,7 @@
1386
1387 xs_integer pos = position->getIntegerValue();
1388
1389- if (pos <= xs_integer::zero() ||
1390- arr->getArraySize() < pos)
1391+ if (pos.sign() <= 0 || arr->getArraySize() < pos)
1392 {
1393 RAISE_ERROR(jerr::JNUP0016, loc,
1394 ERROR_PARAMS(ZED(JNUP0016_Array), position->getStringValue()));
1395@@ -1623,8 +1621,7 @@
1396
1397 xs_integer pos = position->getIntegerValue();
1398
1399- if (pos <= xs_integer::zero() ||
1400- arr->getArraySize() < pos)
1401+ if (pos.sign() <= 0 || arr->getArraySize() < pos)
1402 {
1403 RAISE_ERROR(jerr::JNUP0016, loc,
1404 ERROR_PARAMS(ZED(JNUP0016_Array), position->getStringValue()));
1405
1406=== modified file 'src/store/naive/simple_temp_seq.cpp'
1407--- src/store/naive/simple_temp_seq.cpp 2013-04-17 18:37:33 +0000
1408+++ src/store/naive/simple_temp_seq.cpp 2013-05-08 15:05:31 +0000
1409@@ -24,6 +24,7 @@
1410 #include "store/api/item.h"
1411 #include "simple_temp_seq.h"
1412 #include "store/api/copymode.h"
1413+#include "zorbatypes/integer.h"
1414
1415 namespace zorba { namespace simplestore {
1416
1417
1418=== modified file 'src/system/globalenv.cpp'
1419--- src/system/globalenv.cpp 2013-02-07 17:24:36 +0000
1420+++ src/system/globalenv.cpp 2013-05-08 15:05:31 +0000
1421@@ -42,6 +42,7 @@
1422
1423 #include "types/schema/schema.h"
1424
1425+#include "zorbatypes/m_apm.h"
1426 #include "zorbautils/condition.h"
1427
1428 #include "store/api/collection.h"
1429
1430=== modified file 'src/types/casting.cpp'
1431--- src/types/casting.cpp 2013-05-02 00:18:56 +0000
1432+++ src/types/casting.cpp 2013-05-08 15:05:31 +0000
1433@@ -17,10 +17,13 @@
1434
1435 #include <vector>
1436
1437-#include "zorbatypes/numconversions.h"
1438+#include "zorbatypes/chartype.h"
1439 #include "zorbatypes/datetime.h"
1440+#include "zorbatypes/decimal.h"
1441 #include "zorbatypes/duration.h"
1442-#include "zorbatypes/chartype.h"
1443+#include "zorbatypes/floatimpl.h"
1444+#include "zorbatypes/integer.h"
1445+#include "zorbatypes/numconversions.h"
1446 #include "zorbatypes/URI.h"
1447
1448 #include "diagnostics/xquery_diagnostics.h"
1449@@ -1433,36 +1436,36 @@
1450 T1_TO_T2(bool, flt)
1451 {
1452 if (aItem->getBooleanValue())
1453- aFactory->createFloat(result, xs_float::one());
1454+ aFactory->createFloat(result, numeric_consts<xs_float>::one());
1455 else
1456- aFactory->createFloat(result, xs_float::zero());
1457+ aFactory->createFloat(result, numeric_consts<xs_float>::zero());
1458 }
1459
1460
1461 T1_TO_T2(bool, dbl)
1462 {
1463 if (aItem->getBooleanValue())
1464- aFactory->createDouble(result, xs_double::one());
1465+ aFactory->createDouble(result, numeric_consts<xs_double>::one());
1466 else
1467- aFactory->createDouble(result, xs_double::zero());
1468+ aFactory->createDouble(result, numeric_consts<xs_double>::zero());
1469 }
1470
1471
1472 T1_TO_T2(bool, dec)
1473 {
1474 if (aItem->getBooleanValue())
1475- aFactory->createDecimal(result, xs_decimal::one());
1476+ aFactory->createDecimal(result, numeric_consts<xs_decimal>::one());
1477 else
1478- aFactory->createDecimal(result, xs_decimal::zero());
1479+ aFactory->createDecimal(result, numeric_consts<xs_decimal>::zero());
1480 }
1481
1482
1483 T1_TO_T2(bool, int)
1484 {
1485 if (aItem->getBooleanValue())
1486- aFactory->createInteger(result, xs_integer::one());
1487+ aFactory->createInteger(result, numeric_consts<xs_integer>::one());
1488 else
1489- aFactory->createInteger(result, xs_integer::zero());
1490+ aFactory->createInteger(result, numeric_consts<xs_integer>::zero());
1491 }
1492
1493
1494@@ -1666,17 +1669,24 @@
1495
1496 T1_TO_T2(dec, uint)
1497 {
1498- xs_nonNegativeInteger const n(aItem->getDecimalValue());
1499- aFactory->createNonNegativeInteger(result, n);
1500+ try
1501+ {
1502+ xs_nonNegativeInteger const n(aItem->getDecimalValue());
1503+ aFactory->createNonNegativeInteger(result, n);
1504+ }
1505+ catch ( const std::exception& )
1506+ {
1507+ throwFOCA0002Exception(aItem->getStringValue(), errInfo);
1508+ }
1509 }
1510
1511
1512 T1_TO_T2(bool, uint)
1513 {
1514- if (aItem->getBooleanValue())
1515- aFactory->createNonNegativeInteger(result, xs_nonNegativeInteger::one());
1516- else
1517- aFactory->createNonNegativeInteger(result, xs_nonNegativeInteger::zero());
1518+ xs_nonNegativeInteger const &i = aItem->getBooleanValue() ?
1519+ numeric_consts<xs_nonNegativeInteger>::one() :
1520+ numeric_consts<xs_nonNegativeInteger>::zero();
1521+ aFactory->createNonNegativeInteger(result, i );
1522 }
1523
1524
1525@@ -2024,12 +2034,16 @@
1526 }
1527 case store::XS_POSITIVE_INTEGER:
1528 {
1529- xs_positiveInteger const i = aItem->getUnsignedIntegerValue();
1530- if (i.sign() > 0)
1531+ try
1532 {
1533- factory->createPositiveInteger(result, i);
1534+ xs_positiveInteger const n = aItem->getUnsignedIntegerValue();
1535+ factory->createPositiveInteger(result, n);
1536 return;
1537 }
1538+ catch ( std::exception const& )
1539+ {
1540+ // ignore
1541+ }
1542 break;
1543 }
1544 default:
1545
1546=== modified file 'src/types/schema/XercesParseUtils.cpp'
1547--- src/types/schema/XercesParseUtils.cpp 2013-03-05 12:34:19 +0000
1548+++ src/types/schema/XercesParseUtils.cpp 2013-05-08 15:05:31 +0000
1549@@ -28,15 +28,18 @@
1550 #include "LoadSchemaErrorHandler.h"
1551 #include "PrintSchema.h"
1552
1553+#include "diagnostics/xquery_diagnostics.h"
1554 #include "store/api/item.h"
1555 #include "store/api/item_factory.h"
1556+#include "system/globalenv.h"
1557 #include "types/typeimpl.h"
1558-#include "diagnostics/xquery_diagnostics.h"
1559-#include <zorbatypes/numconversions.h>
1560-#include "system/globalenv.h"
1561+#include "util/utf8_util.h"
1562 #include "zorbatypes/datetime.h"
1563+#include "zorbatypes/decimal.h"
1564 #include "zorbatypes/duration.h"
1565-#include "util/utf8_util.h"
1566+#include "zorbatypes/floatimpl.h"
1567+#include "zorbatypes/integer.h"
1568+#include "zorbatypes/numconversions.h"
1569
1570 using namespace std;
1571 XERCES_CPP_NAMESPACE_USE;
1572
1573=== modified file 'src/util/stl_util.h'
1574--- src/util/stl_util.h 2013-04-17 15:21:56 +0000
1575+++ src/util/stl_util.h 2013-05-08 15:05:31 +0000
1576@@ -421,6 +421,13 @@
1577 return true;
1578 }
1579
1580+inline std::enable_if<!ZORBA_TR1_NS::is_signed<char>::value
1581+ && !ZORBA_TR1_NS::is_unsigned<char>::value,
1582+ bool>::type
1583+ge0( char c ) {
1584+ return c >= 0;
1585+}
1586+
1587 template<typename NumericType> inline
1588 typename std::enable_if<ZORBA_TR1_NS::is_signed<NumericType>::value,bool>::type
1589 lt0( NumericType n ) {
1590@@ -433,6 +440,13 @@
1591 return false;
1592 }
1593
1594+inline std::enable_if<!ZORBA_TR1_NS::is_signed<char>::value
1595+ && !ZORBA_TR1_NS::is_unsigned<char>::value,
1596+ bool>::type
1597+lt0( char c ) {
1598+ return c < 0;
1599+}
1600+
1601 template<typename NumericType> inline
1602 typename std::enable_if<ZORBA_TR1_NS::is_signed<NumericType>::value,bool>::type
1603 le0( NumericType n ) {
1604@@ -445,6 +459,10 @@
1605 return n == 0;
1606 }
1607
1608+inline bool le0( char c ) {
1609+ return c <= 0;
1610+}
1611+
1612 ///////////////////////////////////////////////////////////////////////////////
1613
1614 //
1615
1616=== modified file 'src/zorbaserialization/serialize_basic_types.cpp'
1617--- src/zorbaserialization/serialize_basic_types.cpp 2013-04-08 00:12:00 +0000
1618+++ src/zorbaserialization/serialize_basic_types.cpp 2013-05-08 15:05:31 +0000
1619@@ -22,6 +22,7 @@
1620 #include "zorbaserialization/archiver.h"
1621 #include "zorbaserialization/base64impl.h"
1622
1623+#include "zorbatypes/m_apm.h"
1624 #include "zorbatypes/floatimpl.h"
1625
1626 #include "diagnostics/xquery_diagnostics.h"
1627
1628=== modified file 'src/zorbaserialization/serialize_zorba_types.cpp'
1629--- src/zorbaserialization/serialize_zorba_types.cpp 2013-03-27 17:11:24 +0000
1630+++ src/zorbaserialization/serialize_zorba_types.cpp 2013-05-08 15:05:31 +0000
1631@@ -82,26 +82,21 @@
1632 /*******************************************************************************
1633
1634 ********************************************************************************/
1635-#ifdef ZORBA_WITH_BIG_INTEGER
1636-
1637-void operator&(serialization::Archiver& ar, IntegerImpl& obj)
1638-{
1639- ar & obj.value_;
1640-}
1641-
1642-#else
1643-
1644-void operator&(serialization::Archiver& ar, IntegerImpl<long long>& obj)
1645-{
1646- ar & obj.value();
1647-}
1648-
1649-void operator&(serialization::Archiver& ar, IntegerImpl<unsigned long long>& obj)
1650-{
1651- ar & obj.value();
1652-}
1653-
1654-#endif
1655+
1656+template<class T>
1657+void operator&(serialization::Archiver& ar, IntegerImpl<T>& obj)
1658+{
1659+ ar & obj.value();
1660+}
1661+
1662+#define INSTANTIATE_INTEGER(I) \
1663+ template void operator&<I::traits_type>(serialization::Archiver&, I&)
1664+
1665+INSTANTIATE_INTEGER( Integer );
1666+INSTANTIATE_INTEGER( NegativeInteger );
1667+INSTANTIATE_INTEGER( NonNegativeInteger );
1668+INSTANTIATE_INTEGER( NonPositiveInteger );
1669+INSTANTIATE_INTEGER( PositiveInteger );
1670
1671
1672 /*******************************************************************************
1673
1674=== modified file 'src/zorbaserialization/serialize_zorba_types.h'
1675--- src/zorbaserialization/serialize_zorba_types.h 2013-02-07 17:24:36 +0000
1676+++ src/zorbaserialization/serialize_zorba_types.h 2013-05-08 15:05:31 +0000
1677@@ -23,6 +23,7 @@
1678 #include "zorbatypes/rchandle.h"
1679 #include "zorbatypes/m_apm.h"
1680 #include "zorbatypes/floatimpl.h"
1681+#include "zorbatypes/zorbatypes_decl.h"
1682
1683 #include "zorbautils/checked_vector.h"
1684
1685@@ -37,24 +38,16 @@
1686
1687 namespace zorba
1688 {
1689- class Decimal;
1690- class Duration;
1691- class Timezone;
1692- class DateTime;
1693 class Base16;
1694 class Base64;
1695- class QueryLoc;
1696+ class Diagnostic;
1697+ class function;
1698 class HashMapItemPointerCmp;
1699 class HashMapZStringCmp;
1700+ class QueryLoc;
1701+ class Timezone;
1702 class XQType;
1703- class function;
1704- class Diagnostic;
1705 class ZorbaException;
1706-#ifdef ZORBA_WITH_BIG_INTEGER
1707- class IntegerImpl;
1708-#else
1709- template<typename IntType> class IntegerImpl;
1710-#endif /* ZORBA_WITH_BIG_INTEGER */
1711
1712 namespace serialization
1713 {
1714@@ -65,12 +58,8 @@
1715
1716 void operator&(Archiver& ar, const XQType*& obj);
1717
1718-#ifdef ZORBA_WITH_BIG_INTEGER
1719-void operator&(Archiver& ar, IntegerImpl& obj);
1720-#else
1721-void operator&(serialization::Archiver& ar, IntegerImpl<long long>& obj);
1722-void operator&(serialization::Archiver& ar, IntegerImpl<unsigned long long>& obj);
1723-#endif
1724+template<class C>
1725+void operator&(Archiver& ar, IntegerImpl<C>& obj);
1726
1727 void operator&(Archiver& ar, Decimal& obj);
1728
1729
1730=== modified file 'src/zorbatypes/CMakeLists.txt'
1731--- src/zorbatypes/CMakeLists.txt 2013-02-07 17:24:36 +0000
1732+++ src/zorbatypes/CMakeLists.txt 2013-05-08 15:05:31 +0000
1733@@ -17,6 +17,7 @@
1734 floatimpl.cpp
1735 integer.cpp
1736 numconversions.cpp
1737+ numeric_types.cpp
1738 binary.cpp
1739 URI.cpp
1740 collation_manager.cpp
1741
1742=== modified file 'src/zorbatypes/datetime.h'
1743--- src/zorbatypes/datetime.h 2013-04-23 06:09:42 +0000
1744+++ src/zorbatypes/datetime.h 2013-05-08 15:05:31 +0000
1745@@ -20,11 +20,10 @@
1746 #include <iostream>
1747
1748 #include <zorba/config.h>
1749-#include "zorbatypes/timezone.h"
1750-#include "zorbatypes/duration.h"
1751-
1752 #include "util/ascii_util.h"
1753
1754+#include "timezone.h"
1755+#include "duration.h"
1756
1757 namespace zorba
1758 {
1759@@ -301,7 +300,7 @@
1760
1761 int getMinutes() const;
1762
1763- xs_decimal getSeconds() const;
1764+ Decimal getSeconds() const;
1765
1766 int getIntSeconds() const;
1767
1768
1769=== modified file 'src/zorbatypes/datetime/datetimetype.cpp'
1770--- src/zorbatypes/datetime/datetimetype.cpp 2013-04-24 17:26:02 +0000
1771+++ src/zorbatypes/datetime/datetimetype.cpp 2013-05-08 15:05:31 +0000
1772@@ -29,14 +29,15 @@
1773 #include <time.h>
1774 #endif
1775
1776+#include "zorbatypes/datetime.h"
1777+#include "zorbatypes/datetime/parse.h"
1778+#include "zorbatypes/decimal.h"
1779+#include "zorbatypes/duration.h"
1780+#include "zorbatypes/integer.h"
1781+#include "zorbatypes/timezone.h"
1782+#include "zorbatypes/zorbatypes_decl.h"
1783+#include "zorbatypes/zstring.h"
1784 #include "zorbautils/hashfun.h"
1785-#include <zorbatypes/datetime.h>
1786-#include <zorbatypes/duration.h>
1787-#include <zorbatypes/timezone.h>
1788-#include <zorbatypes/zorbatypes_decl.h>
1789-#include <zorbatypes/zstring.h>
1790-
1791-#include "zorbatypes/datetime/parse.h"
1792
1793 #include "util/ascii_util.h"
1794 #include "util/time_util.h"
1795@@ -1325,7 +1326,7 @@
1796 // validate timezone value (-14 .. +14 H)
1797 if (d->getYears() != 0 || d->getMonths() != 0 ||
1798 d->getDays() != 0 ||
1799- d->getSeconds() != Integer::zero() ||
1800+ d->getSeconds().sign() != 0 ||
1801 d->getHours()*3600 + d->getMinutes()*60 > 14*3600 ||
1802 d->getHours()*3600 + d->getMinutes()*60 < -14*3600)
1803 throw InvalidTimezoneException( d->getHours()*3600 + d->getMinutes()*60 );
1804
1805=== modified file 'src/zorbatypes/datetime/duration.cpp'
1806--- src/zorbatypes/datetime/duration.cpp 2013-04-16 21:12:12 +0000
1807+++ src/zorbatypes/datetime/duration.cpp 2013-05-08 15:05:31 +0000
1808@@ -19,11 +19,14 @@
1809 #include <memory>
1810 #include <string>
1811
1812-#include "zorbautils/hashfun.h"
1813+#include "zorbatypes/datetime.h"
1814+#include "zorbatypes/datetime/parse.h"
1815+#include "zorbatypes/decimal.h"
1816 #include "zorbatypes/duration.h"
1817-#include "zorbatypes/datetime/parse.h"
1818+#include "zorbatypes/floatimpl.h"
1819+#include "zorbatypes/integer.h"
1820 #include "zorbatypes/numconversions.h"
1821-#include "zorbatypes/datetime.h"
1822+#include "zorbautils/hashfun.h"
1823
1824 #include "diagnostics/xquery_diagnostics.h"
1825
1826@@ -597,7 +600,8 @@
1827
1828 xs_double Duration::getTotalSeconds() const
1829 {
1830- return (is_negative ? xs_double::neg_one() : xs_double::one())
1831+ return (is_negative ?
1832+ numeric_consts<xs_double>::neg_one() : numeric_consts<xs_double>::one())
1833 * ((((((((xs_double(data[YEAR_DATA]) * 12
1834 + xs_double(data[MONTH_DATA])) * 30)
1835 + xs_double(data[DAY_DATA])) * 24)
1836
1837=== modified file 'src/zorbatypes/datetime/timezone.cpp'
1838--- src/zorbatypes/datetime/timezone.cpp 2013-03-13 16:19:33 +0000
1839+++ src/zorbatypes/datetime/timezone.cpp 2013-05-08 15:05:31 +0000
1840@@ -22,6 +22,7 @@
1841 #include <zorbatypes/timezone.h>
1842
1843 #include "zorbatypes/datetime/parse.h"
1844+#include "zorbatypes/decimal.h"
1845
1846 #include "zorbautils/hashfun.h"
1847
1848
1849=== modified file 'src/zorbatypes/decimal.cpp'
1850--- src/zorbatypes/decimal.cpp 2013-04-11 18:13:48 +0000
1851+++ src/zorbatypes/decimal.cpp 2013-05-08 15:05:31 +0000
1852@@ -23,19 +23,10 @@
1853 #include "util/ascii_util.h"
1854
1855 #include "decimal.h"
1856+#include "floatimpl.h"
1857 #include "integer.h"
1858 #include "numconversions.h"
1859
1860-#ifdef ZORBA_WITH_BIG_INTEGER
1861-# define TEMPLATE_DECL(T) /* nothing */
1862-# define INTEGER_IMPL(I) IntegerImpl
1863-#else
1864-# define TEMPLATE_DECL(T) template<typename T> /* spacer */
1865-# define INTEGER_IMPL(I) IntegerImpl<I> /* spacer */
1866-#endif /* ZORBA_WITH_BIG_INTEGER */
1867-#define INTEGER_IMPL_LL INTEGER_IMPL(long long)
1868-#define INTEGER_IMPL_ULL INTEGER_IMPL(unsigned long long)
1869-
1870 namespace zorba {
1871
1872 ///////////////////////////////////////////////////////////////////////////////
1873@@ -79,7 +70,6 @@
1874 delete[] copy;
1875 } else
1876 *result = first_non_ws;
1877-
1878 }
1879
1880 /**
1881@@ -178,7 +168,6 @@
1882 }
1883 }
1884
1885-
1886 ////////// constructors ///////////////////////////////////////////////////////
1887
1888 Decimal::Decimal( long long n ) {
1889@@ -224,14 +213,16 @@
1890 value_ = f.getNumber();
1891 }
1892
1893-TEMPLATE_DECL(I)
1894-Decimal::Decimal( INTEGER_IMPL(I) const &i ) :
1895- value_( i.itod() ) {
1896+template<class T>
1897+Decimal::Decimal( IntegerImpl<T> const &i ) : value_( i.itod() ) {
1898 }
1899-#ifndef ZORBA_WITH_BIG_INTEGER
1900-template Decimal::Decimal( INTEGER_IMPL_LL const& );
1901-template Decimal::Decimal( INTEGER_IMPL_ULL const& );
1902-#endif /* ZORBA_WITH_BIG_INTEGER */
1903+
1904+// instantiate Decimal-from-Integer constructors
1905+template Decimal::Decimal( Integer const& );
1906+template Decimal::Decimal( NegativeInteger const& );
1907+template Decimal::Decimal( NonNegativeInteger const& );
1908+template Decimal::Decimal( NonPositiveInteger const& );
1909+template Decimal::Decimal( PositiveInteger const& );
1910
1911 ////////// assignment operators ///////////////////////////////////////////////
1912
1913@@ -247,15 +238,17 @@
1914 return *this;
1915 }
1916
1917-TEMPLATE_DECL(I)
1918-Decimal& Decimal::operator=( INTEGER_IMPL(I) const &i ) {
1919+template<class T>
1920+Decimal& Decimal::operator=( IntegerImpl<T> const &i ) {
1921 value_ = i.itod();
1922 return *this;
1923 }
1924-#ifndef ZORBA_WITH_BIG_INTEGER
1925-template Decimal& Decimal::operator=( INTEGER_IMPL_LL const& );
1926-template Decimal& Decimal::operator=( INTEGER_IMPL_ULL const& );
1927-#endif /* ZORBA_WITH_BIG_INTEGER */
1928+
1929+template Decimal& Decimal::operator=( Integer const& );
1930+template Decimal& Decimal::operator=( NegativeInteger const& );
1931+template Decimal& Decimal::operator=( NonNegativeInteger const& );
1932+template Decimal& Decimal::operator=( NonPositiveInteger const& );
1933+template Decimal& Decimal::operator=( PositiveInteger const& );
1934
1935 Decimal& Decimal::operator=( Double const &d ) {
1936 if ( !d.isFinite() )
1937@@ -273,20 +266,19 @@
1938
1939 ////////// arithmetic operators ///////////////////////////////////////////////
1940
1941-#ifdef ZORBA_WITH_BIG_INTEGER
1942-# define ZORBA_INSTANTIATE(OP) /* nothing */
1943-#else
1944-# define ZORBA_INSTANTIATE(OP) \
1945- template Decimal operator OP( Decimal const&, INTEGER_IMPL_LL const& ); \
1946- template Decimal operator OP( Decimal const&, INTEGER_IMPL_ULL const& )
1947-#endif /* ZORBA_WITH_BIG_INTEGER */
1948+#define ZORBA_INSTANTIATE(OP,I) \
1949+ template Decimal operator OP( Decimal const&, I const& )
1950
1951 #define ZORBA_DECIMAL_OP(OP) \
1952- TEMPLATE_DECL(I) \
1953- Decimal operator OP( Decimal const &d, INTEGER_IMPL(I) const &i ) { \
1954+ template<class T> inline \
1955+ Decimal operator OP( Decimal const &d, IntegerImpl<T> const &i ) { \
1956 return d.value_ OP i.itod(); \
1957 } \
1958- ZORBA_INSTANTIATE(OP)
1959+ ZORBA_INSTANTIATE(OP,Integer); \
1960+ ZORBA_INSTANTIATE(OP,NegativeInteger); \
1961+ ZORBA_INSTANTIATE(OP,NonNegativeInteger); \
1962+ ZORBA_INSTANTIATE(OP,NonPositiveInteger); \
1963+ ZORBA_INSTANTIATE(OP,PositiveInteger);
1964
1965 ZORBA_DECIMAL_OP(+);
1966 ZORBA_DECIMAL_OP(-);
1967@@ -298,20 +290,19 @@
1968
1969 ////////// relational operators ///////////////////////////////////////////////
1970
1971-#ifdef ZORBA_WITH_BIG_INTEGER
1972-# define ZORBA_INSTANTIATE(OP) /* nothing */
1973-#else
1974-# define ZORBA_INSTANTIATE(OP) \
1975- template bool operator OP( Decimal const&, INTEGER_IMPL_LL const& ); \
1976- template bool operator OP( Decimal const&, INTEGER_IMPL_ULL const& )
1977-#endif /* ZORBA_WITH_BIG_INTEGER */
1978+#define ZORBA_INSTANTIATE(OP,I) \
1979+ template bool operator OP( Decimal const&, I const& )
1980
1981-#define ZORBA_DECIMAL_OP(OP) \
1982- TEMPLATE_DECL(I) \
1983- bool operator OP( Decimal const &d, INTEGER_IMPL(I) const &i ) { \
1984- return d.value_ OP i.itod(); \
1985- } \
1986- ZORBA_INSTANTIATE(OP)
1987+#define ZORBA_DECIMAL_OP(OP) \
1988+ template<class T> inline \
1989+ bool operator OP( Decimal const &d, IntegerImpl<T> const &i ) { \
1990+ return d.value_ OP i.itod(); \
1991+ } \
1992+ ZORBA_INSTANTIATE( OP, Integer ); \
1993+ ZORBA_INSTANTIATE( OP, NegativeInteger ); \
1994+ ZORBA_INSTANTIATE( OP, NonNegativeInteger ); \
1995+ ZORBA_INSTANTIATE( OP, NonPositiveInteger ); \
1996+ ZORBA_INSTANTIATE( OP, PositiveInteger );
1997
1998 ZORBA_DECIMAL_OP(==);
1999 ZORBA_DECIMAL_OP(!=);
2000@@ -325,17 +316,19 @@
2001 ////////// math functions /////////////////////////////////////////////////////
2002
2003 Decimal Decimal::round() const {
2004- return round( INTEGER_IMPL_LL::zero() );
2005+ return round( numeric_consts<xs_integer>::zero() );
2006 }
2007
2008-TEMPLATE_DECL(I)
2009-Decimal Decimal::round( INTEGER_IMPL(I) const &precision ) const {
2010+template<class T>
2011+Decimal Decimal::round( IntegerImpl<T> const &precision ) const {
2012 return round2( value_, precision.itod() );
2013 }
2014-#ifndef ZORBA_WITH_BIG_INTEGER
2015-template Decimal Decimal::round( INTEGER_IMPL_LL const& ) const;
2016-template Decimal Decimal::round( INTEGER_IMPL_ULL const& ) const;
2017-#endif /* ZORBA_WITH_BIG_INTEGER */
2018+
2019+template Decimal Decimal::round( Integer const& ) const;
2020+template Decimal Decimal::round( NegativeInteger const& ) const;
2021+template Decimal Decimal::round( NonNegativeInteger const& ) const;
2022+template Decimal Decimal::round( NonPositiveInteger const& ) const;
2023+template Decimal Decimal::round( PositiveInteger const& ) const;
2024
2025 Decimal::value_type Decimal::round2( value_type const &v,
2026 value_type const &precision ) {
2027@@ -352,14 +345,16 @@
2028 return result;
2029 }
2030
2031-TEMPLATE_DECL(I)
2032-Decimal Decimal::roundHalfToEven( INTEGER_IMPL(I) const &precision ) const {
2033+template<class T>
2034+Decimal Decimal::roundHalfToEven( IntegerImpl<T> const &precision ) const {
2035 return roundHalfToEven2( value_, precision.itod() );
2036 }
2037-#ifndef ZORBA_WITH_BIG_INTEGER
2038-template Decimal Decimal::roundHalfToEven( INTEGER_IMPL_LL const& ) const;
2039-template Decimal Decimal::roundHalfToEven( INTEGER_IMPL_ULL const& ) const;
2040-#endif /* ZORBA_WITH_BIG_INTEGER */
2041+
2042+template Decimal Decimal::roundHalfToEven( Integer const& ) const;
2043+template Decimal Decimal::roundHalfToEven( NegativeInteger const& ) const;
2044+template Decimal Decimal::roundHalfToEven( NonNegativeInteger const& ) const;
2045+template Decimal Decimal::roundHalfToEven( NonPositiveInteger const& ) const;
2046+template Decimal Decimal::roundHalfToEven( PositiveInteger const& ) const;
2047
2048 Decimal::value_type Decimal::roundHalfToEven2( value_type const &v,
2049 value_type const &precision ) {
2050@@ -425,21 +420,15 @@
2051 return static_cast<uint32_t>( n );
2052 }
2053
2054-Decimal const& Decimal::one() {
2055- static Decimal d(1);
2056- return d;
2057-}
2058-
2059-zstring Decimal::toString( value_type const &value, int precision ) {
2060- return toString(value, false, precision);
2061-}
2062-
2063-zstring Decimal::toString( value_type const &value, bool minusZero, int precision ) {
2064+zstring Decimal::toString( value_type const &value, bool minusZero,
2065+ int precision ) {
2066 char buf[ 1024 ];
2067
2068- if ( minusZero )
2069- {
2070- buf[0] = '-';
2071+ if ( minusZero ) {
2072+ if ( value.sign() == 0 )
2073+ buf[0] = '-';
2074+ else
2075+ minusZero = false;
2076 }
2077
2078 value.toFixPtString( buf + minusZero, precision );
2079@@ -464,11 +453,6 @@
2080 return buf;
2081 }
2082
2083-Decimal const& Decimal::zero() {
2084- static Decimal d(0);
2085- return d;
2086-}
2087-
2088 ///////////////////////////////////////////////////////////////////////////////
2089
2090 } // namespace zorba
2091
2092=== modified file 'src/zorbatypes/decimal.h'
2093--- src/zorbatypes/decimal.h 2013-04-11 18:13:48 +0000
2094+++ src/zorbatypes/decimal.h 2013-05-08 15:05:31 +0000
2095@@ -28,14 +28,6 @@
2096 #include "zorbatypes_decl.h"
2097 #include "zstring.h"
2098
2099-#ifdef ZORBA_WITH_BIG_INTEGER
2100-# define TEMPLATE_DECL(I) /* nothing */
2101-# define INTEGER_IMPL(I) IntegerImpl
2102-#else
2103-# define TEMPLATE_DECL(I) template<typename I> /* spacer */
2104-# define INTEGER_IMPL(I) IntegerImpl<I> /* spacer */
2105-#endif /* ZORBA_WITH_BIG_INTEGER */
2106-
2107 namespace zorba {
2108
2109 class Decimal;
2110@@ -72,8 +64,8 @@
2111 explicit Decimal( float n );
2112 explicit Decimal( double n );
2113
2114- TEMPLATE_DECL(I)
2115- explicit Decimal( INTEGER_IMPL(I) const &i );
2116+ template<class T>
2117+ explicit Decimal( IntegerImpl<T> const &i );
2118
2119 /**
2120 * Constructs a %Decimal from a C string.
2121@@ -133,8 +125,8 @@
2122 Decimal& operator=( Double const &d );
2123 Decimal& operator=( Float const &f );
2124
2125- TEMPLATE_DECL(I)
2126- Decimal& operator=( INTEGER_IMPL(I) const &i );
2127+ template<class T>
2128+ Decimal& operator=( IntegerImpl<T> const &i );
2129
2130 ////////// arithmetic operators /////////////////////////////////////////////
2131
2132@@ -145,11 +137,11 @@
2133 friend Decimal operator%( Decimal const&, Decimal const& );
2134
2135 #define ZORBA_DECIMAL_OP(OP) \
2136- TEMPLATE_DECL(I) \
2137- friend Decimal operator OP( Decimal const&, INTEGER_IMPL(I) const& ); \
2138+ template<class T> \
2139+ friend Decimal operator OP( Decimal const&, IntegerImpl<T> const& ); \
2140 \
2141- TEMPLATE_DECL(I) \
2142- friend Decimal operator OP( INTEGER_IMPL(I) const&, Decimal const& )
2143+ template<class T> \
2144+ friend Decimal operator OP( IntegerImpl<T> const&, Decimal const& )
2145
2146 ZORBA_DECIMAL_OP(+);
2147 ZORBA_DECIMAL_OP(-);
2148@@ -165,7 +157,7 @@
2149 Decimal& operator%=( Decimal const& );
2150
2151 #define ZORBA_DECIMAL_OP(OP) \
2152- TEMPLATE_DECL(I) Decimal& operator OP( INTEGER_IMPL(I) const& )
2153+ template<class T> Decimal& operator OP( IntegerImpl<T> const& )
2154
2155 ZORBA_DECIMAL_OP(+=);
2156 ZORBA_DECIMAL_OP(-=);
2157@@ -178,12 +170,12 @@
2158
2159 ////////// relational operators /////////////////////////////////////////////
2160
2161-#define ZORBA_DECIMAL_OP(OP) \
2162- friend bool operator OP( Decimal const&, Decimal const& ); \
2163- TEMPLATE_DECL(I) \
2164- friend bool operator OP( Decimal const&, INTEGER_IMPL(I) const& ); \
2165- TEMPLATE_DECL(I) \
2166- friend bool operator OP( INTEGER_IMPL(I) const&, Decimal const& )
2167+#define ZORBA_DECIMAL_OP(OP) \
2168+ friend bool operator OP( Decimal const&, Decimal const& ); \
2169+ template<class T> \
2170+ friend bool operator OP( Decimal const&, IntegerImpl<T> const& ); \
2171+ template<class T> \
2172+ friend bool operator OP( IntegerImpl<T> const&, Decimal const& )
2173
2174 ZORBA_DECIMAL_OP(==);
2175 ZORBA_DECIMAL_OP(!=);
2176@@ -201,11 +193,11 @@
2177 Decimal floor() const;
2178 Decimal round() const;
2179
2180- TEMPLATE_DECL(I)
2181- Decimal round( INTEGER_IMPL(I) const &precision ) const;
2182+ template<class T>
2183+ Decimal round( IntegerImpl<T> const &precision ) const;
2184
2185- TEMPLATE_DECL(I)
2186- Decimal roundHalfToEven( INTEGER_IMPL(I) const &precision ) const;
2187+ template<class T>
2188+ Decimal roundHalfToEven( IntegerImpl<T> const &precision ) const;
2189
2190 Decimal sqrt() const;
2191
2192@@ -223,9 +215,6 @@
2193
2194 zstring toString( int precision = ZORBA_FLOAT_POINT_PRECISION ) const;
2195
2196- static Decimal const& one();
2197- static Decimal const& zero();
2198-
2199 /////////////////////////////////////////////////////////////////////////////
2200
2201 private:
2202@@ -254,13 +243,15 @@
2203 static value_type roundHalfToEven2( value_type const &v,
2204 value_type const &precision );
2205
2206- static zstring toString( value_type const&,
2207- int precision = ZORBA_FLOAT_POINT_PRECISION );
2208+ static zstring toString( value_type const &value,
2209+ int precision = ZORBA_FLOAT_POINT_PRECISION ) {
2210+ return toString( value, false, precision );
2211+ }
2212
2213 static zstring toString( value_type const&, bool,
2214 int precision = ZORBA_FLOAT_POINT_PRECISION );
2215
2216- TEMPLATE_DECL(I) friend class IntegerImpl;
2217+ template<class T> friend class IntegerImpl;
2218 template<typename F> friend class FloatImpl;
2219
2220 friend xs_long to_xs_long( Decimal const& );
2221@@ -429,9 +420,6 @@
2222
2223 } // namespace zorba
2224
2225-#undef TEMPLATE_DECL
2226-#undef INTEGER_IMPL
2227-
2228 #endif /* ZORBA_DECIMAL_H */
2229 /*
2230 * Local variables:
2231
2232=== modified file 'src/zorbatypes/duration.h'
2233--- src/zorbatypes/duration.h 2013-02-07 17:24:36 +0000
2234+++ src/zorbatypes/duration.h 2013-05-08 15:05:31 +0000
2235@@ -18,10 +18,10 @@
2236 #define ZORBA_TYPES_DURATION_H
2237
2238 #include <zorba/config.h>
2239-#include "zorbatypes/zorbatypes_decl.h"
2240-#include "zorbatypes/schema_types.h"
2241+#include "zorbatypes_decl.h"
2242
2243 #include "util/ascii_util.h"
2244+#include "zorbatypes/zstring.h"
2245
2246 namespace zorba
2247 {
2248@@ -175,9 +175,9 @@
2249
2250 Duration* operator-(const Duration& d) const;
2251
2252- Duration* operator*(const xs_double& value) const;
2253+ Duration* operator*(const Double& value) const;
2254
2255- Duration* operator/(const xs_double& value) const;
2256+ Duration* operator/(const Double& value) const;
2257
2258 Decimal operator/(const Duration& d) const;
2259
2260@@ -195,13 +195,13 @@
2261
2262 virtual long getMinutes() const;
2263
2264- virtual xs_decimal getSeconds() const;
2265+ virtual Decimal getSeconds() const;
2266
2267 virtual long getFractionalSeconds() const;
2268
2269 virtual long getIntSeconds() const;
2270
2271- xs_double getTotalSeconds() const;
2272+ Double getTotalSeconds() const;
2273
2274 long getTotalMilliseconds() const;
2275
2276
2277=== modified file 'src/zorbatypes/floatimpl.cpp'
2278--- src/zorbatypes/floatimpl.cpp 2013-04-02 21:31:04 +0000
2279+++ src/zorbatypes/floatimpl.cpp 2013-05-08 15:05:31 +0000
2280@@ -30,16 +30,6 @@
2281 #include "zorbaserialization/serialize_zorba_types.h"
2282 #include "zorbaserialization/serialize_template_types.h"
2283
2284-#ifdef ZORBA_WITH_BIG_INTEGER
2285-# define TEMPLATE_DECL(T) /* nothing */
2286-# define INTEGER_IMPL(I) IntegerImpl
2287-#else
2288-# define TEMPLATE_DECL(T) template<typename T> /* spacer */
2289-# define INTEGER_IMPL(I) IntegerImpl<I> /* spacer */
2290-#endif /* ZORBA_WITH_BIG_INTEGER */
2291-#define INTEGER_IMPL_LL INTEGER_IMPL(long long)
2292-#define INTEGER_IMPL_ULL INTEGER_IMPL(unsigned long long)
2293-
2294 ///////////////////////////////////////////////////////////////////////////////
2295
2296 namespace zorba {
2297@@ -72,8 +62,8 @@
2298 }
2299 }
2300
2301-template<typename FloatType>
2302-void FloatImpl<FloatType>::parse( char const *s ) {
2303+template<typename F>
2304+void FloatImpl<F>::parse( char const *s ) {
2305 if ( !*s )
2306 throw std::invalid_argument( "empty string" );
2307
2308@@ -151,80 +141,87 @@
2309
2310 ////////// constructors ///////////////////////////////////////////////////////
2311
2312-template<typename FloatType>
2313-FloatImpl<FloatType>::FloatImpl( Decimal const &d ) {
2314+template<typename F>
2315+FloatImpl<F>::FloatImpl( Decimal const &d ) {
2316 zstring const temp( d.toString() );
2317 parse( temp.c_str() );
2318 }
2319
2320-template<typename FloatType>
2321-TEMPLATE_DECL(IntType)
2322-FloatImpl<FloatType>::FloatImpl( INTEGER_IMPL(IntType) const &i ) {
2323+template<typename F>
2324+template<class T>
2325+FloatImpl<F>::FloatImpl( IntegerImpl<T> const &i ) {
2326 zstring const temp( i.toString() );
2327 parse( temp.c_str() );
2328 }
2329
2330-#ifndef ZORBA_WITH_BIG_INTEGER
2331-template FloatImpl<float>::FloatImpl( INTEGER_IMPL_LL const& );
2332-template FloatImpl<float>::FloatImpl( INTEGER_IMPL_ULL const& );
2333+template FloatImpl<float>::FloatImpl( Integer const& );
2334+template FloatImpl<float>::FloatImpl( NegativeInteger const& );
2335+template FloatImpl<float>::FloatImpl( NonNegativeInteger const& );
2336+template FloatImpl<float>::FloatImpl( NonPositiveInteger const& );
2337+template FloatImpl<float>::FloatImpl( PositiveInteger const& );
2338
2339-template FloatImpl<double>::FloatImpl( INTEGER_IMPL_LL const& );
2340-template FloatImpl<double>::FloatImpl( INTEGER_IMPL_ULL const& );
2341-#endif /* ZORBA_WITH_BIG_INTEGER */
2342+template FloatImpl<double>::FloatImpl( Integer const& );
2343+template FloatImpl<double>::FloatImpl( NegativeInteger const& );
2344+template FloatImpl<double>::FloatImpl( NonNegativeInteger const& );
2345+template FloatImpl<double>::FloatImpl( NonPositiveInteger const& );
2346+template FloatImpl<double>::FloatImpl( PositiveInteger const& );
2347
2348 ////////// assignment operators ///////////////////////////////////////////////
2349
2350-template<typename FloatType>
2351-FloatImpl<FloatType>& FloatImpl<FloatType>::operator=( Decimal const &d ) {
2352+template<typename F>
2353+FloatImpl<F>& FloatImpl<F>::operator=( Decimal const &d ) {
2354 zstring const temp( d.toString() );
2355 parse( temp.c_str() );
2356 return *this;
2357 }
2358
2359-template<typename FloatType>
2360-TEMPLATE_DECL(IntType)
2361-FloatImpl<FloatType>&
2362-FloatImpl<FloatType>::operator=( INTEGER_IMPL(IntType) const &i ) {
2363+template<typename F>
2364+template<class T>
2365+FloatImpl<F>& FloatImpl<F>::operator=( IntegerImpl<T> const &i ) {
2366 zstring const temp( i.toString() );
2367 parse( temp.c_str() );
2368 return *this;
2369 }
2370
2371-#ifndef ZORBA_WITH_BIG_INTEGER
2372-template
2373-FloatImpl<float>& FloatImpl<float>::operator=( INTEGER_IMPL_LL const& );
2374-
2375-template
2376-FloatImpl<float>& FloatImpl<float>::operator=( INTEGER_IMPL_ULL const& );
2377-
2378-template
2379-FloatImpl<double>& FloatImpl<double>::operator=( INTEGER_IMPL_LL const& );
2380-
2381-template
2382-FloatImpl<double>& FloatImpl<double>::operator=( INTEGER_IMPL_ULL const& );
2383-#endif /* ZORBA_WITH_BIG_INTEGER */
2384+#define ZORBA_INSTANTIATE(F,I) \
2385+ template FloatImpl<F>& FloatImpl<F>::operator=( I const& )
2386+
2387+ZORBA_INSTANTIATE(float,Integer);
2388+ZORBA_INSTANTIATE(float,NegativeInteger);
2389+ZORBA_INSTANTIATE(float,NonNegativeInteger);
2390+ZORBA_INSTANTIATE(float,NonPositiveInteger);
2391+ZORBA_INSTANTIATE(float,PositiveInteger);
2392+
2393+ZORBA_INSTANTIATE(double,Integer);
2394+ZORBA_INSTANTIATE(double,NegativeInteger);
2395+ZORBA_INSTANTIATE(double,NonNegativeInteger);
2396+ZORBA_INSTANTIATE(double,NonPositiveInteger);
2397+ZORBA_INSTANTIATE(double,PositiveInteger);
2398+#undef ZORBA_INSTANTIATE
2399
2400 ////////// math functions /////////////////////////////////////////////////////
2401
2402-template<typename FloatType>
2403-FloatImpl<FloatType> FloatImpl<FloatType>::acos() const {
2404- if ( *this < neg_one() || *this > one() )
2405+template<typename F>
2406+FloatImpl<F> FloatImpl<F>::acos() const {
2407+ if ( *this < numeric_consts<FloatImpl>::neg_one() ||
2408+ *this > numeric_consts<FloatImpl>::one() )
2409 return nan();
2410- return FloatImpl<FloatType>(
2411- isNegZero() ? -std::acos( value_ ): std::acos( value_ )
2412+ return FloatImpl<F>(
2413+ isNegZero() ? -std::acos( value_ ) : std::acos( value_ )
2414 );
2415 }
2416
2417-template<typename FloatType>
2418-FloatImpl<FloatType> FloatImpl<FloatType>::asin() const {
2419- if ( *this < neg_one() || *this > one() )
2420+template<typename F>
2421+FloatImpl<F> FloatImpl<F>::asin() const {
2422+ if ( *this < numeric_consts<FloatImpl>::neg_one() ||
2423+ *this > numeric_consts<FloatImpl>::one() )
2424 return nan();
2425- return FloatImpl<FloatType>( std::asin( value_ ) );
2426+ return FloatImpl<F>( std::asin( value_ ) );
2427 }
2428
2429-template<typename FloatType>
2430-void FloatImpl<FloatType>::frexp( FloatImpl<FloatType> &out_mantissa,
2431- Integer &out_exponent ) const {
2432+template<typename F>
2433+void FloatImpl<F>::frexp( FloatImpl<F> &out_mantissa,
2434+ Integer &out_exponent ) const {
2435 int expint;
2436 out_mantissa = FloatImpl( ::frexp( value_, &expint ) );
2437 out_exponent = Integer( expint );
2438@@ -246,13 +243,13 @@
2439 out_integer = int_part;
2440 }
2441
2442-template<typename FloatType>
2443-FloatImpl<FloatType> FloatImpl<FloatType>::round() const {
2444- return round( Integer::zero() );
2445+template<typename F>
2446+FloatImpl<F> FloatImpl<F>::round() const {
2447+ return round( numeric_consts<xs_integer>::zero() );
2448 }
2449
2450-template<typename FloatType>
2451-FloatImpl<FloatType> FloatImpl<FloatType>::round( Integer const &precision ) const {
2452+template<typename F>
2453+FloatImpl<F> FloatImpl<F>::round( Integer const &precision ) const {
2454 FloatImpl result;
2455 if ( isFinite() && !isZero() ) {
2456 MAPM m(
2457@@ -274,8 +271,8 @@
2458 return result;
2459 }
2460
2461-template<typename FloatType> FloatImpl<FloatType>
2462-FloatImpl<FloatType>::roundHalfToEven( Integer const &precision) const {
2463+template<typename F>
2464+FloatImpl<F> FloatImpl<F>::roundHalfToEven( Integer const &precision ) const {
2465 FloatImpl result;
2466 if ( isFinite() && !isZero() ) {
2467 MAPM m(
2468@@ -318,48 +315,32 @@
2469 return false;
2470 }
2471
2472-template<typename FloatType>
2473-FloatImpl<FloatType> const& FloatImpl<FloatType>::nan() {
2474- static FloatImpl<FloatType> const value( std::sqrt( -1.0 ) );
2475- return value;
2476-}
2477-
2478-template<typename FloatType>
2479-FloatImpl<FloatType> const& FloatImpl<FloatType>::neg_inf() {
2480- static FloatImpl<FloatType> const value(
2481- -std::numeric_limits<FloatType>::infinity()
2482- );
2483- return value;
2484-}
2485-
2486-template<typename FloatType>
2487-FloatImpl<FloatType> const& FloatImpl<FloatType>::neg_one() {
2488- static FloatImpl<FloatType> const value( -1 );
2489- return value;
2490-}
2491-
2492-template<typename FloatType>
2493-FloatImpl<FloatType> const& FloatImpl<FloatType>::neg_zero() {
2494- static FloatImpl<FloatType> const value( -0.0 );
2495- return value;
2496-}
2497-
2498-template<typename FloatType>
2499-FloatImpl<FloatType> const& FloatImpl<FloatType>::one() {
2500- static FloatImpl<FloatType> const value( 1 );
2501- return value;
2502-}
2503-
2504-template<typename FloatType>
2505-FloatImpl<FloatType> const& FloatImpl<FloatType>::pos_inf() {
2506- static FloatImpl<FloatType> const value(
2507- std::numeric_limits<FloatType>::infinity()
2508- );
2509- return value;
2510-}
2511-
2512-template<typename FloatType>
2513-zstring FloatImpl<FloatType>::toIntegerString() const {
2514+template<typename F>
2515+FloatImpl<F> const& FloatImpl<F>::nan() {
2516+ static FloatImpl<F> const value( std::sqrt( -1.0 ) );
2517+ return value;
2518+}
2519+
2520+template<typename F>
2521+FloatImpl<F> const& FloatImpl<F>::neg_inf() {
2522+ static FloatImpl<F> const value( -std::numeric_limits<F>::infinity() );
2523+ return value;
2524+}
2525+
2526+template<typename F>
2527+FloatImpl<F> const& FloatImpl<F>::neg_zero() {
2528+ static FloatImpl<F> const value( -0.0 );
2529+ return value;
2530+}
2531+
2532+template<typename F>
2533+FloatImpl<F> const& FloatImpl<F>::pos_inf() {
2534+ static FloatImpl<F> const value( std::numeric_limits<F>::infinity() );
2535+ return value;
2536+}
2537+
2538+template<typename F>
2539+zstring FloatImpl<F>::toIntegerString() const {
2540 if ( isNaN() )
2541 return nan_str();
2542 if (isPosInf() )
2543@@ -377,8 +358,8 @@
2544 return buf;
2545 }
2546
2547-template<typename FloatType>
2548-zstring FloatImpl<FloatType>::toString( bool no_scientific_format ) const {
2549+template<typename F>
2550+zstring FloatImpl<F>::toString( bool no_scientific_format ) const {
2551 if ( isNaN() )
2552 return nan_str();
2553 if ( isPosInf() )
2554@@ -390,17 +371,17 @@
2555 if ( isNegZero() )
2556 return "-0";
2557
2558- FloatType const absVal = fabs( value_ );
2559- FloatType const lower = 0.000001f, upper = 1000000.0f;
2560+ value_type const abs_val = fabs( value_ );
2561+ value_type const lower = 0.000001f, upper = 1000000.0f;
2562
2563- if (no_scientific_format || (absVal < upper && absVal >= lower) || absVal == 0)
2564- {
2565+ if ( no_scientific_format || (abs_val >= lower && abs_val < upper) ||
2566+ abs_val == 0 ) {
2567 #if 1
2568 // This is the "spec" implementation, i.e., it is an exact application of
2569 // the spec in http://www.w3.org/TR/xpath-functions/#casting
2570 MAPM decimal_mapm( value_ );
2571 decimal_mapm = decimal_mapm.round( precision_ );
2572- return Decimal::toString(decimal_mapm, isNegZero(), max_precision());
2573+ return Decimal::toString( decimal_mapm, isNegZero(), max_precision() );
2574 #else
2575 std::stringstream stream;
2576 stream.precision(7);
2577@@ -471,12 +452,6 @@
2578 }
2579 }
2580
2581-template<typename FloatType>
2582-FloatImpl<FloatType> const& FloatImpl<FloatType>::zero() {
2583- static FloatImpl<FloatType> const value( 0 );
2584- return value;
2585-}
2586-
2587 ///////////////////////////////////////////////////////////////////////////////
2588
2589 template class FloatImpl<double>;
2590
2591=== modified file 'src/zorbatypes/floatimpl.h'
2592--- src/zorbatypes/floatimpl.h 2013-04-09 01:29:36 +0000
2593+++ src/zorbatypes/floatimpl.h 2013-05-08 15:05:31 +0000
2594@@ -29,14 +29,6 @@
2595 #include "schema_types.h"
2596 #include "zorbatypes_decl.h"
2597
2598-#ifdef ZORBA_WITH_BIG_INTEGER
2599-# define TEMPLATE_DECL(I) /* nothing */
2600-# define INTEGER_IMPL(I) IntegerImpl
2601-#else
2602-# define TEMPLATE_DECL(I) template<typename I> /* spacer */
2603-# define INTEGER_IMPL(I) IntegerImpl<I> /* spacer */
2604-#endif /* ZORBA_WITH_BIG_INTEGER */
2605-
2606 namespace zorba {
2607
2608 template<typename FloatType>
2609@@ -71,8 +63,8 @@
2610 explicit FloatImpl( double n );
2611 explicit FloatImpl( Decimal const &d );
2612
2613- TEMPLATE_DECL(IntType)
2614- explicit FloatImpl( INTEGER_IMPL(IntType) const &i );
2615+ template<class T>
2616+ explicit FloatImpl( IntegerImpl<T> const &i );
2617
2618 /**
2619 * Constructs a %FloatImpl from a C string.
2620@@ -126,8 +118,8 @@
2621 FloatImpl& operator=( char const *s );
2622 FloatImpl& operator=( Decimal const &d );
2623
2624- TEMPLATE_DECL(I)
2625- FloatImpl& operator=( INTEGER_IMPL(I) const &i );
2626+ template<class T>
2627+ FloatImpl& operator=( IntegerImpl<T> const &i );
2628
2629 ////////// arithmetic operators /////////////////////////////////////////////
2630
2631@@ -269,11 +261,9 @@
2632 bool isPosZero() const;
2633 bool isNegZero() const;
2634 bool isInteger() const;
2635+ int sign() const;
2636
2637- static FloatImpl const& zero();
2638 static FloatImpl const& neg_zero();
2639- static FloatImpl const& one();
2640- static FloatImpl const& neg_one();
2641 static FloatImpl const& nan();
2642 static FloatImpl const& pos_inf();
2643 static FloatImpl const& neg_inf();
2644@@ -283,7 +273,6 @@
2645 }
2646
2647 zstring toIntegerString() const;
2648-
2649 zstring toString( bool no_scientific_mode = false ) const;
2650
2651 /////////////////////////////////////////////////////////////////////////////
2652@@ -298,14 +287,12 @@
2653 value_type value_;
2654 precision_type precision_;
2655
2656- FloatImpl( value_type v, precision_type p );
2657-
2658 static precision_type max_precision();
2659
2660 void parse( char const* );
2661 bool parse_etc( char const* );
2662
2663- TEMPLATE_DECL(I) friend class IntegerImpl;
2664+ template<class T> friend class IntegerImpl;
2665 friend class Decimal;
2666
2667 friend class FloatImpl<float>;
2668@@ -412,24 +399,19 @@
2669 parse( s );
2670 }
2671
2672-template<typename F> template<typename G>
2673+template<typename F>
2674+template<typename G>
2675 inline FloatImpl<F>::FloatImpl( FloatImpl<G> const &f ) :
2676 value_( static_cast<F>( f.value_ ) ), precision_( max_precision() )
2677 {
2678 }
2679
2680-template<typename F>
2681-inline FloatImpl<F>::FloatImpl( value_type v, precision_type p ) :
2682- value_( v ), precision_( p )
2683-{
2684-}
2685-
2686 ////////// assignment operators ///////////////////////////////////////////////
2687
2688-template<typename F> template<typename G>
2689+template<typename F>
2690+template<typename G>
2691 inline FloatImpl<F>& FloatImpl<F>::operator=( FloatImpl<G> const &f ) {
2692 value_ = static_cast<F>( f.value_ );
2693- precision_ = max_precision();
2694 return *this;
2695 }
2696
2697@@ -437,7 +419,6 @@
2698 template<typename F> \
2699 inline FloatImpl<F>& FloatImpl<F>::operator=( T n ) { \
2700 value_ = static_cast<F>( n ); \
2701- precision_ = max_precision(); \
2702 return *this; \
2703 }
2704
2705@@ -668,7 +649,8 @@
2706 ZORBA_FLOAT_OP(/=)
2707 #undef ZORBA_FLOAT_OP
2708
2709-template<typename F> template<typename G>
2710+template<typename F>
2711+template<typename G>
2712 inline FloatImpl<F>& FloatImpl<F>::operator%=( FloatImpl<G> const &f ) {
2713 value_ = std::fmod( value_, static_cast<F>( f.value_ ) );
2714 return *this;
2715@@ -676,7 +658,7 @@
2716
2717 template<typename F>
2718 inline FloatImpl<F> FloatImpl<F>::operator-() const {
2719- return FloatImpl<F>( -value_, precision_ );
2720+ return FloatImpl<F>( -value_ );
2721 }
2722
2723 #define ZORBA_FLOAT_OP(OP) \
2724@@ -932,7 +914,8 @@
2725
2726 ////////// miscellaneous //////////////////////////////////////////////////////
2727
2728-template<typename F> template<typename G>
2729+template<typename F>
2730+template<typename G>
2731 inline int FloatImpl<F>::compare( FloatImpl<G> const &f ) const {
2732 return value_ < f.value_ ? -1 : value_ > f.value_ ? 1 : 0;
2733 }
2734@@ -987,12 +970,17 @@
2735 return isFinite() && ::floor( value_ ) == value_;
2736 }
2737
2738-template <typename F>
2739+template<typename F>
2740 inline bool FloatImpl<F>::isZero() const {
2741 return value_ == 0;
2742 }
2743
2744 template<typename F>
2745+inline int FloatImpl<F>::sign() const {
2746+ return value_ > 0 ? 1 : value_ < 0 ? -1 : 0;
2747+}
2748+
2749+template<typename F>
2750 inline std::ostream& operator<<( std::ostream &os, FloatImpl<F> const &f ) {
2751 return os << f.toString();
2752 }
2753@@ -1001,9 +989,6 @@
2754
2755 } // namespace zorba
2756
2757-#undef TEMPLATE_DECL
2758-#undef INTEGER_IMPL
2759-
2760 #endif // ZORBA_FLOATIMPL_H
2761 /*
2762 * Local variables:
2763
2764=== modified file 'src/zorbatypes/integer.cpp'
2765--- src/zorbatypes/integer.cpp 2013-04-09 22:38:19 +0000
2766+++ src/zorbatypes/integer.cpp 2013-05-08 15:05:31 +0000
2767@@ -16,166 +16,185 @@
2768
2769 #include "stdafx.h"
2770
2771+// standard
2772 #include <cerrno>
2773 #include <cstdlib>
2774+#include <sstream>
2775
2776+// Zorba
2777 #include <zorba/internal/unique_ptr.h>
2778 #include "util/cxx_util.h"
2779 #include "util/string_util.h"
2780
2781-#include "integer.h"
2782+// local
2783 #include "decimal.h"
2784 #include "floatimpl.h"
2785+#include "integer.h"
2786 #include "numconversions.h"
2787
2788-#ifdef ZORBA_WITH_BIG_INTEGER
2789-# define TEMPLATE_DECL(T) /* nothing */
2790-# define INTEGER_IMPL(T) IntegerImpl
2791-#else
2792-# define TEMPLATE_DECL(T) template<typename T> /* spacer */
2793-# define INTEGER_IMPL(T) IntegerImpl<T> /* spacer */
2794-#endif /* ZORBA_WITH_BIG_INTEGER */
2795-#define INTEGER_IMPL_LL INTEGER_IMPL(long long)
2796-#define INTEGER_IMPL_ULL INTEGER_IMPL(unsigned long long)
2797-
2798 using namespace std;
2799
2800-#ifndef ZORBA_WITH_BIG_INTEGER
2801-unsigned long long MaxUIntegerValue = ~0ull >> 1;
2802-
2803-inline bool is_too_big( long long ) {
2804- return false;
2805-}
2806-
2807-inline bool is_too_big( unsigned long long n ) {
2808- return n > MaxUIntegerValue;
2809-}
2810-#endif /* ZORBA_WITH_BIG_INTEGER */
2811-
2812 namespace zorba {
2813
2814 ///////////////////////////////////////////////////////////////////////////////
2815
2816-TEMPLATE_DECL(I)
2817-void INTEGER_IMPL(I)::parse( char const *s ) {
2818+ostream& operator<<( ostream &o, MAPM const &m ) {
2819+ unique_ptr<char[]> const buf( new char[ m.exponent() + 3 ] );
2820+ m.toIntegerString( buf.get() );
2821+ return o << buf.get();
2822+}
2823+
2824+void integer_traits::throw_error( string const &what, bool throw_range_error ) {
2825+ if ( throw_range_error )
2826+ throw range_error( what );
2827+ throw invalid_argument( what );
2828+}
2829+
2830+void integer_traits::throw_error( MAPM const &n, char const *op,
2831+ bool throw_range_error ) {
2832+ ostringstream oss;
2833+ oss << n;
2834+ string const what( BUILD_STRING( oss.str(), ": not ", op, " 0" ) );
2835+ throw_error( what, throw_range_error );
2836+}
2837+
2838+///////////////////////////////////////////////////////////////////////////////
2839+
2840+template<class T>
2841+void IntegerImpl<T>::parse( char const *s, bool throw_range_error ) {
2842 #ifdef ZORBA_WITH_BIG_INTEGER
2843 Decimal::parse( s, &value_, Decimal::parse_integer );
2844 #else
2845- value_type const temp( ztd::aton<value_type>( s ) );
2846- if ( is_too_big( temp ) )
2847- throw std::invalid_argument(
2848- BUILD_STRING( '"', temp, "\": unsigned integer too big" )
2849- );
2850- value_ = temp;
2851+ try {
2852+ value_ = ztd::aton<value_type>( s );
2853+ }
2854+ catch ( std::range_error const &e ) {
2855+ if ( throw_range_error )
2856+ throw;
2857+ throw invalid_argument( e.what() );
2858+ }
2859 #endif /* ZORBA_WITH_BIG_INTEGER */
2860+ T::check_value( value_, throw_range_error );
2861 }
2862
2863 ////////// constructors ///////////////////////////////////////////////////////
2864
2865 #ifdef ZORBA_WITH_BIG_INTEGER
2866-IntegerImpl::IntegerImpl( long long n ) {
2867+template<class T>
2868+IntegerImpl<T>::IntegerImpl( long long n ) {
2869 ascii::itoa_buf_type buf;
2870 value_ = ascii::itoa( n, buf );
2871+ T::check_value( value_, false );
2872 }
2873
2874 #if ZORBA_SIZEOF_INT == ZORBA_SIZEOF_LONG
2875-TEMPLATE_DECL(T)
2876-INTEGER_IMPL(T)::IntegerImpl( unsigned int n ) {
2877+template<class T>
2878+IntegerImpl<T>::IntegerImpl( unsigned int n ) {
2879 ascii::itoa_buf_type buf;
2880 value_ = ascii::itoa( n, buf );
2881+ T::check_value( value_, false );
2882 }
2883 #endif /* ZORBA_SIZEOF_INT == ZORBA_SIZEOF_LONG */
2884
2885-IntegerImpl::IntegerImpl( unsigned long n ) {
2886+template<class T>
2887+IntegerImpl<T>::IntegerImpl( unsigned long n ) {
2888 ascii::itoa_buf_type buf;
2889 value_ = ascii::itoa( n, buf );
2890+ T::check_value( value_, false );
2891 }
2892
2893-IntegerImpl::IntegerImpl( unsigned long long n ) {
2894+template<class T>
2895+IntegerImpl<T>::IntegerImpl( unsigned long long n ) {
2896 ascii::itoa_buf_type buf;
2897 value_ = ascii::itoa( n, buf );
2898+ T::check_value( value_, false );
2899 }
2900 #endif /* ZORBA_WITH_BIG_INTEGER */
2901
2902-TEMPLATE_DECL(T)
2903-INTEGER_IMPL(T)::IntegerImpl( Decimal const &d ) {
2904- value_ = ftoi( d.value_ );
2905+template<class T>
2906+IntegerImpl<T>::IntegerImpl( Decimal const &d ) {
2907+ value_ = T::check_value( ftoi( d.value_ ), false );
2908 }
2909
2910-TEMPLATE_DECL(T)
2911-INTEGER_IMPL(T)::IntegerImpl( Double const &d ) {
2912+template<class T>
2913+IntegerImpl<T>::IntegerImpl( Double const &d ) {
2914 if ( !d.isFinite() )
2915 throw std::invalid_argument( "not finite" );
2916- value_ = ftoi( d.getNumber() );
2917+ value_ = T::check_value( ftoi( d.getNumber() ), false );
2918 }
2919
2920-TEMPLATE_DECL(T)
2921-INTEGER_IMPL(T)::IntegerImpl( Float const &f ) {
2922+template<class T>
2923+IntegerImpl<T>::IntegerImpl( Float const &f ) {
2924 if ( !f.isFinite() )
2925 throw std::invalid_argument( "not finite" );
2926- value_ = ftoi( f.getNumber() );
2927+ value_ = T::check_value( ftoi( f.getNumber() ), false );
2928 }
2929
2930 ////////// assignment operators ///////////////////////////////////////////////
2931
2932 #ifdef ZORBA_WITH_BIG_INTEGER
2933-IntegerImpl& IntegerImpl::operator=( long long n ) {
2934- ascii::itoa_buf_type buf;
2935- value_ = ascii::itoa( n, buf );
2936- return *this;
2937-}
2938-
2939-IntegerImpl& IntegerImpl::operator=( unsigned long n ) {
2940- ascii::itoa_buf_type buf;
2941- value_ = ascii::itoa( n, buf );
2942- return *this;
2943-}
2944-
2945-IntegerImpl& IntegerImpl::operator=( unsigned long long n ) {
2946- ascii::itoa_buf_type buf;
2947- value_ = ascii::itoa( n, buf );
2948+template<class T>
2949+IntegerImpl<T>& IntegerImpl<T>::operator=( long long n ) {
2950+ ascii::itoa_buf_type buf;
2951+ value_ = ascii::itoa( n, buf );
2952+ T::check_value( value_, true );
2953+ return *this;
2954+}
2955+
2956+template<class T>
2957+IntegerImpl<T>& IntegerImpl<T>::operator=( unsigned long n ) {
2958+ ascii::itoa_buf_type buf;
2959+ value_ = ascii::itoa( n, buf );
2960+ T::check_value( value_, true );
2961+ return *this;
2962+}
2963+
2964+template<class T>
2965+IntegerImpl<T>& IntegerImpl<T>::operator=( unsigned long long n ) {
2966+ ascii::itoa_buf_type buf;
2967+ value_ = ascii::itoa( n, buf );
2968+ T::check_value( value_, true );
2969 return *this;
2970 }
2971 #endif /* ZORBA_WITH_BIG_INTEGER */
2972
2973-TEMPLATE_DECL(T)
2974-INTEGER_IMPL(T)& INTEGER_IMPL(T)::operator=( Decimal const &d ) {
2975- value_ = ftoi( d.value_ );
2976+template<class T>
2977+IntegerImpl<T>& IntegerImpl<T>::operator=( Decimal const &d ) {
2978+ value_ = T::check_value( ftoi( d.value_ ), true );
2979 return *this;
2980 }
2981
2982-TEMPLATE_DECL(T)
2983-INTEGER_IMPL(T)& INTEGER_IMPL(T)::operator=( Double const &d ) {
2984+template<class T>
2985+IntegerImpl<T>& IntegerImpl<T>::operator=( Double const &d ) {
2986 if ( !d.isFinite() )
2987 throw std::invalid_argument( "not finite" );
2988- value_ = ftoi( d.getNumber() );
2989+ value_ = T::check_value( ftoi( d.getNumber() ), true );
2990 return *this;
2991 }
2992
2993-TEMPLATE_DECL(T)
2994-INTEGER_IMPL(T)& INTEGER_IMPL(T)::operator=( Float const &f ) {
2995+template<class T>
2996+IntegerImpl<T>& IntegerImpl<T>::operator=( Float const &f ) {
2997 if ( !f.isFinite() )
2998 throw std::invalid_argument( "not finite" );
2999- value_ = ftoi( f.getNumber() );
3000+ value_ = T::check_value( ftoi( f.getNumber() ), true );
3001 return *this;
3002 }
3003
3004 ////////// arithmetic operators ///////////////////////////////////////////////
3005
3006-#ifdef ZORBA_WITH_BIG_INTEGER
3007-# define ZORBA_INSTANTIATE(OP) /* nothing */
3008-#else
3009-# define ZORBA_INSTANTIATE(OP) \
3010- template Decimal operator OP( INTEGER_IMPL_LL const&, Decimal const& ); \
3011- template Decimal operator OP( INTEGER_IMPL_ULL const&, Decimal const& );
3012-#endif /* ZORBA_WITH_BIG_INTEGER */
3013+#define ZORBA_INSTANTIATE(OP,I) \
3014+ template Decimal operator OP( I const&, Decimal const& );
3015
3016 #define ZORBA_INTEGER_OP(OP) \
3017- TEMPLATE_DECL(T) \
3018- Decimal operator OP( INTEGER_IMPL(T) const &i, Decimal const &d ) { \
3019+ template<class T> \
3020+ Decimal operator OP( IntegerImpl<T> const &i, Decimal const &d ) { \
3021 return i.itod() OP d.value_; \
3022 } \
3023- ZORBA_INSTANTIATE(OP)
3024+ ZORBA_INSTANTIATE( OP, Integer ); \
3025+ ZORBA_INSTANTIATE( OP, NegativeInteger ); \
3026+ ZORBA_INSTANTIATE( OP, NonNegativeInteger ); \
3027+ ZORBA_INSTANTIATE( OP, NonPositiveInteger ); \
3028+ ZORBA_INSTANTIATE( OP, PositiveInteger );
3029
3030 ZORBA_INTEGER_OP(+)
3031 ZORBA_INTEGER_OP(-)
3032@@ -187,15 +206,26 @@
3033
3034 #ifdef ZORBA_WITH_BIG_INTEGER
3035
3036-#define ZORBA_INTEGER_OP(OP,T) \
3037- IntegerImpl operator OP( IntegerImpl const &i, T n ) { \
3038- ascii::itoa_buf_type buf; \
3039- return i.value_ OP IntegerImpl::value_type( ascii::itoa( n, buf ) ); \
3040- } \
3041- IntegerImpl operator OP( T n, IntegerImpl const &i ) { \
3042- ascii::itoa_buf_type buf; \
3043- return IntegerImpl::value_type( ascii::itoa( n, buf ) ) OP i.value_; \
3044- }
3045+#define ZORBA_INSTANTIATE(OP,I,N) \
3046+ template Integer operator OP( I const&, N ); \
3047+ template Integer operator OP( N, I const& )
3048+
3049+#define ZORBA_INTEGER_OP(OP,N) \
3050+ template<class T> \
3051+ Integer operator OP( IntegerImpl<T> const &i, N n ) { \
3052+ ascii::itoa_buf_type buf; \
3053+ return i.value_ OP MAPM( ascii::itoa( n, buf ) ); \
3054+ } \
3055+ template<class T> \
3056+ Integer operator OP( N n, IntegerImpl<T> const &i ) { \
3057+ ascii::itoa_buf_type buf; \
3058+ return MAPM( ascii::itoa( n, buf ) ) OP i.value_; \
3059+ } \
3060+ ZORBA_INSTANTIATE( OP, Integer, N ); \
3061+ ZORBA_INSTANTIATE( OP, NegativeInteger, N ); \
3062+ ZORBA_INSTANTIATE( OP, NonNegativeInteger, N ); \
3063+ ZORBA_INSTANTIATE( OP, NonPositiveInteger, N ); \
3064+ ZORBA_INSTANTIATE( OP, PositiveInteger, N );
3065
3066 ZORBA_INTEGER_OP(+,long long)
3067 ZORBA_INTEGER_OP(-,long long)
3068@@ -210,30 +240,44 @@
3069 ZORBA_INTEGER_OP(*,unsigned long long)
3070 ZORBA_INTEGER_OP(%,unsigned long long)
3071 #undef ZORBA_INTEGER_OP
3072-
3073-#define ZORBA_INTEGER_OP(T) \
3074- IntegerImpl operator/( IntegerImpl const &i, T n ) { \
3075- ascii::itoa_buf_type buf; \
3076- IntegerImpl::value_type const temp( ascii::itoa( n, buf ) ); \
3077- return IntegerImpl::ftoi( i.value_ / temp ); \
3078- } \
3079- IntegerImpl operator/( T n, IntegerImpl const &i ) { \
3080- ascii::itoa_buf_type buf; \
3081- IntegerImpl::value_type const temp( ascii::itoa( n, buf ) ); \
3082- return IntegerImpl::ftoi( temp / i.value_ ); \
3083- }
3084+#undef ZORBA_INSTANTIATE
3085+
3086+#define ZORBA_INSTANTIATE(I,N) \
3087+ template Integer operator/( I const&, N ); \
3088+ template Integer operator/( N, I const& )
3089+
3090+#define ZORBA_INTEGER_OP(N) \
3091+ template<class T> \
3092+ Integer operator/( IntegerImpl<T> const &i, N n ) { \
3093+ ascii::itoa_buf_type buf; \
3094+ MAPM const temp( ascii::itoa( n, buf ) ); \
3095+ return Integer::ftoi( i.value_ / temp ); \
3096+ } \
3097+ template<class T> \
3098+ Integer operator/( N n, IntegerImpl<T> const &i ) { \
3099+ ascii::itoa_buf_type buf; \
3100+ MAPM const temp( ascii::itoa( n, buf ) ); \
3101+ return Integer::ftoi( temp / i.value_ ); \
3102+ } \
3103+ ZORBA_INSTANTIATE( Integer, N ); \
3104+ ZORBA_INSTANTIATE( NegativeInteger, N ); \
3105+ ZORBA_INSTANTIATE( NonNegativeInteger, N ); \
3106+ ZORBA_INSTANTIATE( NonPositiveInteger, N ); \
3107+ ZORBA_INSTANTIATE( PositiveInteger, N );
3108
3109 ZORBA_INTEGER_OP(long long)
3110 ZORBA_INTEGER_OP(unsigned long)
3111 ZORBA_INTEGER_OP(unsigned long long)
3112 #undef ZORBA_INTEGER_OP
3113+#undef ZORBA_INSTANTIATE
3114
3115-#define ZORBA_INTEGER_OP(OP,T) \
3116- IntegerImpl& IntegerImpl::operator OP( T n ) { \
3117- ascii::itoa_buf_type buf; \
3118- value_type const temp( ascii::itoa( n, buf ) ); \
3119- value_ OP temp; \
3120- return *this; \
3121+#define ZORBA_INTEGER_OP(OP,N) \
3122+ template<class T> \
3123+ IntegerImpl<T>& IntegerImpl<T>::operator OP( N n ) { \
3124+ ascii::itoa_buf_type buf; \
3125+ value_type const temp( ascii::itoa( n, buf ) ); \
3126+ T::check_value( value_ OP temp, true ); \
3127+ return *this; \
3128 }
3129
3130 ZORBA_INTEGER_OP(+=,long long)
3131@@ -250,12 +294,13 @@
3132 ZORBA_INTEGER_OP(%=,unsigned long long)
3133 #undef ZORBA_INTEGER_OP
3134
3135-#define ZORBA_INTEGER_OP(T) \
3136- IntegerImpl& IntegerImpl::operator/=( T n ) { \
3137- ascii::itoa_buf_type buf; \
3138- value_type const temp( ascii::itoa( n, buf ) ); \
3139- value_ = ftoi( value_ / temp ); \
3140- return *this; \
3141+#define ZORBA_INTEGER_OP(N) \
3142+ template<class T> \
3143+ IntegerImpl<T>& IntegerImpl<T>::operator/=( N n ) { \
3144+ ascii::itoa_buf_type buf; \
3145+ value_type const temp( ascii::itoa( n, buf ) ); \
3146+ T::check_value( value_ = ftoi( value_ / temp ), true ); \
3147+ return *this; \
3148 }
3149
3150 ZORBA_INTEGER_OP(long long)
3151@@ -266,36 +311,63 @@
3152
3153 ////////// relational operators ///////////////////////////////////////////////
3154
3155-TEMPLATE_DECL(T)
3156-bool operator==( INTEGER_IMPL(T) const &i, Decimal const &d ) {
3157+#define ZORBA_INSTANTIATE(OP,I) \
3158+ template bool operator OP( I const&, Decimal const& )
3159+
3160+template<class T>
3161+bool operator==( IntegerImpl<T> const &i, Decimal const &d ) {
3162 return d.is_xs_integer() && i.itod() == d.value_;
3163 }
3164
3165-#define ZORBA_INTEGER_OP(OP) \
3166- TEMPLATE_DECL(T) \
3167- bool operator OP( INTEGER_IMPL(T) const &i, Decimal const &d ) { \
3168- return i.itod() OP d.value_; \
3169- }
3170+ZORBA_INSTANTIATE( ==, Integer );
3171+ZORBA_INSTANTIATE( ==, NegativeInteger );
3172+ZORBA_INSTANTIATE( ==, NonNegativeInteger );
3173+ZORBA_INSTANTIATE( ==, NonPositiveInteger );
3174+ZORBA_INSTANTIATE( ==, PositiveInteger );
3175+
3176+#define ZORBA_INTEGER_OP(OP) \
3177+ template<class T> \
3178+ bool operator OP( IntegerImpl<T> const &i, Decimal const &d ) { \
3179+ return i.itod() OP d.value_; \
3180+ } \
3181+ ZORBA_INSTANTIATE( OP, Integer ); \
3182+ ZORBA_INSTANTIATE( OP, NegativeInteger ); \
3183+ ZORBA_INSTANTIATE( OP, NonNegativeInteger ); \
3184+ ZORBA_INSTANTIATE( OP, NonPositiveInteger ); \
3185+ ZORBA_INSTANTIATE( OP, PositiveInteger );
3186
3187 ZORBA_INTEGER_OP(!=)
3188 ZORBA_INTEGER_OP(< )
3189 ZORBA_INTEGER_OP(<=)
3190 ZORBA_INTEGER_OP(> )
3191 ZORBA_INTEGER_OP(>=)
3192+#undef ZORBA_INSTANTIATE
3193 #undef ZORBA_INTEGER_OP
3194
3195 #ifdef ZORBA_WITH_BIG_INTEGER
3196
3197-#define ZORBA_INTEGER_OP(OP,T) \
3198- bool operator OP( IntegerImpl const &i, T n ) { \
3199- ascii::itoa_buf_type buf; \
3200- return i.value_ OP IntegerImpl::value_type( ascii::itoa( n, buf ) ); \
3201- } \
3202- \
3203- bool operator OP( T n, IntegerImpl const &i ) { \
3204- ascii::itoa_buf_type buf; \
3205- return IntegerImpl::value_type( ascii::itoa( n, buf ) ) OP i.value_; \
3206- }
3207+#define ZORBA_INSTANTIATE(OP,I,N) \
3208+ template bool operator OP( I const&, N ); \
3209+ template bool operator OP( N, I const& )
3210+
3211+#define ZORBA_INTEGER_OP(OP,N) \
3212+ template<class T> \
3213+ bool operator OP( IntegerImpl<T> const &i, N n ) { \
3214+ ascii::itoa_buf_type buf; \
3215+ return i.value_ OP MAPM( ascii::itoa( n, buf ) ); \
3216+ } \
3217+ \
3218+ template<class T> \
3219+ bool operator OP( N n, IntegerImpl<T> const &i ) { \
3220+ ascii::itoa_buf_type buf; \
3221+ return MAPM( ascii::itoa( n, buf ) ) OP i.value_; \
3222+ } \
3223+ \
3224+ ZORBA_INSTANTIATE( OP, Integer, N ); \
3225+ ZORBA_INSTANTIATE( OP, NegativeInteger, N ); \
3226+ ZORBA_INSTANTIATE( OP, NonNegativeInteger, N ); \
3227+ ZORBA_INSTANTIATE( OP, NonPositiveInteger, N ); \
3228+ ZORBA_INSTANTIATE( OP, PositiveInteger, N );
3229
3230 ZORBA_INTEGER_OP(==,long long)
3231 ZORBA_INTEGER_OP(!=,long long)
3232@@ -315,27 +387,14 @@
3233 ZORBA_INTEGER_OP(<=,unsigned long long)
3234 ZORBA_INTEGER_OP(> ,unsigned long long)
3235 ZORBA_INTEGER_OP(>=,unsigned long long)
3236-
3237-#else /* ZORBA_WITH_BIG_INTEGER */
3238-
3239-#define ZORBA_INSTANTIATE(OP) \
3240- template bool operator OP( INTEGER_IMPL_LL const&, Decimal const& ); \
3241- template bool operator OP( INTEGER_IMPL_ULL const&, Decimal const& )
3242-
3243-ZORBA_INSTANTIATE(==);
3244-ZORBA_INSTANTIATE(!=);
3245-ZORBA_INSTANTIATE(< );
3246-ZORBA_INSTANTIATE(<=);
3247-ZORBA_INSTANTIATE(> );
3248-ZORBA_INSTANTIATE(>=);
3249 #undef ZORBA_INSTANTIATE
3250
3251 #endif /* ZORBA_WITH_BIG_INTEGER */
3252
3253 ////////// math functions /////////////////////////////////////////////////////
3254
3255-TEMPLATE_DECL(T)
3256-Double INTEGER_IMPL(T)::pow( INTEGER_IMPL(T) const &power ) const {
3257+template<class T>
3258+Double IntegerImpl<T>::pow( IntegerImpl<T> const &power ) const {
3259 #ifdef ZORBA_WITH_BIG_INTEGER
3260 value_type const result( value_.pow( power.value_, 15 ) );
3261 char buf[300];
3262@@ -349,30 +408,30 @@
3263 #endif /* ZORBA_WITH_BIG_INTEGER */
3264 }
3265
3266-TEMPLATE_DECL(T)
3267-INTEGER_IMPL(T) INTEGER_IMPL(T)::round( IntegerImpl const &precision ) const {
3268+template<class T>
3269+IntegerImpl<T> IntegerImpl<T>::round( IntegerImpl<T> const &precision ) const {
3270 return IntegerImpl( Decimal::round2( itod(), precision.itod() ) );
3271 }
3272
3273-TEMPLATE_DECL(T)
3274-INTEGER_IMPL(T)
3275-INTEGER_IMPL(T)::roundHalfToEven( IntegerImpl const &precision ) const {
3276+template<class T>
3277+IntegerImpl<T>
3278+IntegerImpl<T>::roundHalfToEven( IntegerImpl const &precision ) const {
3279 return IntegerImpl( Decimal::roundHalfToEven2( itod(), precision.itod() ) );
3280 }
3281
3282 ////////// miscellaneous //////////////////////////////////////////////////////
3283
3284 #ifndef ZORBA_WITH_BIG_INTEGER
3285-TEMPLATE_DECL(T)
3286-typename INTEGER_IMPL(T)::value_type INTEGER_IMPL(T)::ftoi( MAPM const &d ) {
3287+template<class T>
3288+typename IntegerImpl<T>::value_type IntegerImpl<T>::ftoi( MAPM const &d ) {
3289 MAPM const temp( d.sign() >= 0 ? d.floor() : d.ceil() );
3290 unique_ptr<char[]> const buf( new char[ temp.exponent() + 3 ] );
3291 temp.toIntegerString( buf.get() );
3292 return ztd::aton<value_type>( buf.get() );
3293 }
3294
3295-TEMPLATE_DECL(T)
3296-MAPM INTEGER_IMPL(T)::itod() const {
3297+template<class T>
3298+MAPM IntegerImpl<T>::itod() const {
3299 if ( is_cxx_long() )
3300 return static_cast<long>( value_ );
3301 ascii::itoa_buf_type buf;
3302@@ -381,77 +440,79 @@
3303 #endif /* ZORBA_WITH_BIG_INTEGER */
3304
3305 #ifdef ZORBA_WITH_BIG_INTEGER
3306-size_t IntegerImpl::alloc_size() const {
3307+
3308+static MAPM xs_byte_min( "-128" );
3309+static MAPM xs_byte_max( "127" );
3310+static MAPM xs_short_min( "-32768" );
3311+static MAPM xs_short_max( "32767" );
3312+static MAPM xs_unsignedByte_max( "256" );
3313+static MAPM xs_unsignedInt_max( "4294967295" );
3314+static MAPM xs_unsignedLong_max( "18446744073709551615" );
3315+static MAPM xs_unsignedShort_max( "65536" );
3316+
3317+template<class T>
3318+size_t IntegerImpl<T>::alloc_size() const {
3319 return value_.significant_digits();
3320 }
3321
3322-uint32_t IntegerImpl::hash() const {
3323+template<class T>
3324+uint32_t IntegerImpl<T>::hash() const {
3325 return Decimal::hash( value_ );
3326 }
3327
3328-bool IntegerImpl::is_xs_byte() const {
3329- static MAPM xs_byte_min( "-128" );
3330- static MAPM xs_byte_max( "127" );
3331+template<class T>
3332+bool IntegerImpl<T>::is_xs_byte() const {
3333 return value_ >= xs_byte_min && value_ <= xs_byte_max;
3334 }
3335
3336-bool IntegerImpl::is_xs_short() const {
3337- static MAPM xs_short_min( "-32768" );
3338- static MAPM xs_short_max( "32767" );
3339+template<class T>
3340+bool IntegerImpl<T>::is_xs_short() const {
3341 return value_ >= xs_short_min && value_ <= xs_short_max;
3342 }
3343
3344-bool IntegerImpl::is_xs_unsignedByte() const {
3345- static MAPM xs_unsignedByte_max( "256" );
3346+template<class T>
3347+bool IntegerImpl<T>::is_xs_unsignedByte() const {
3348 return value_.sign() >= 0 && value_ <= xs_unsignedByte_max;
3349 }
3350
3351-bool IntegerImpl::is_xs_unsignedInt() const {
3352- static MAPM xs_unsignedInt_max( "4294967295" );
3353+template<class T>
3354+bool IntegerImpl<T>::is_xs_unsignedInt() const {
3355 return value_.sign() >= 0 && value_ <= xs_unsignedInt_max;
3356 }
3357
3358-bool IntegerImpl::is_xs_unsignedLong() const {
3359- static MAPM xs_unsignedLong_max( "18446744073709551615" );
3360+template<class T>
3361+bool IntegerImpl<T>::is_xs_unsignedLong() const {
3362 return value_.sign() >= 0 && value_ <= xs_unsignedLong_max;
3363 }
3364
3365-bool IntegerImpl::is_xs_unsignedShort() const {
3366- static MAPM xs_unsignedShort_max( "65536" );
3367+template<class T>
3368+bool IntegerImpl<T>::is_xs_unsignedShort() const {
3369 return value_.sign() >= 0 && value_ <= xs_unsignedShort_max;
3370 }
3371 #endif /* ZORBA_WITH_BIG_INTEGER */
3372
3373-TEMPLATE_DECL(T)
3374-INTEGER_IMPL(T) const& INTEGER_IMPL(T)::one() {
3375- static INTEGER_IMPL(T) const i(1);
3376- return i;
3377-}
3378-
3379-TEMPLATE_DECL(T)
3380-zstring INTEGER_IMPL(T)::toString() const {
3381+template<class T>
3382+zstring IntegerImpl<T>::toString() const {
3383 #ifdef ZORBA_WITH_BIG_INTEGER
3384- unique_ptr<char[]> const buf( new char[ value_.exponent() + 3 ] );
3385- value_.toIntegerString( buf.get() );
3386- return buf.get();
3387+ ostringstream oss;
3388+ oss << value_;
3389+ return oss.str();
3390 #else
3391 ascii::itoa_buf_type buf;
3392 return ascii::itoa( value_, buf );
3393 #endif /* ZORBA_WITH_BIG_INTEGER */
3394 }
3395
3396-TEMPLATE_DECL(T)
3397-INTEGER_IMPL(T) const& INTEGER_IMPL(T)::zero() {
3398- static INTEGER_IMPL(T) const i(0);
3399- return i;
3400-}
3401-
3402-///////////////////////////////////////////////////////////////////////////////
3403-
3404-#ifndef ZORBA_WITH_BIG_INTEGER
3405-template class IntegerImpl<long long>;
3406-template class IntegerImpl<unsigned long long>;
3407-#endif /* ZORBA_WITH_BIG_INTEGER */
3408+///////////////////////////////////////////////////////////////////////////////
3409+
3410+// instantiate integer types
3411+template class IntegerImpl<integer_traits>;
3412+template class IntegerImpl<negative_traits>;
3413+template class IntegerImpl<nonNegative_traits>;
3414+template class IntegerImpl<nonPositive_traits>;
3415+template class IntegerImpl<positive_traits>;
3416+
3417+///////////////////////////////////////////////////////////////////////////////
3418
3419 } // namespace zorba
3420 /* vim:set et sw=2 ts=2: */
3421
3422=== modified file 'src/zorbatypes/integer.h'
3423--- src/zorbatypes/integer.h 2013-02-26 04:12:43 +0000
3424+++ src/zorbatypes/integer.h 2013-05-08 15:05:31 +0000
3425@@ -18,60 +18,142 @@
3426 #ifndef ZORBA_INTEGER_H
3427 #define ZORBA_INTEGER_H
3428
3429+// standard
3430 #include <cmath>
3431 #include <limits>
3432+#include <string>
3433
3434+// Zorba
3435 #include <zorba/config.h>
3436-
3437 #include "common/common.h"
3438 #include "util/stl_util.h"
3439+#include "util/string_util.h"
3440
3441+// local
3442 #include "m_apm.h"
3443+#include "numeric_types.h"
3444 #include "schema_types_base.h"
3445 #include "zorbatypes_decl.h"
3446 #include "zstring.h"
3447
3448-#ifdef ZORBA_WITH_BIG_INTEGER
3449-# define TEMPLATE_DECL(I) /* nothing */
3450-# define INTEGER_IMPL(I) IntegerImpl
3451-# define TEMPLATE_TYPENAME /* nothing */
3452-#else
3453-# define TEMPLATE_DECL(I) template<typename I> /* spacer */
3454-# define INTEGER_IMPL(I) IntegerImpl<I> /* spacer */
3455-# define TEMPLATE_TYPENAME typename
3456-#endif /* ZORBA_WITH_BIG_INTEGER */
3457-#define INTEGER_IMPL_LL INTEGER_IMPL(long long)
3458-#define INTEGER_IMPL_ULL INTEGER_IMPL(unsigned long long)
3459-
3460 namespace zorba {
3461
3462-TEMPLATE_DECL(I)
3463+template<class TraitsType>
3464 class IntegerImpl;
3465
3466-namespace serialization
3467-{
3468+namespace serialization {
3469 class Archiver;
3470- TEMPLATE_DECL(I) void operator&( Archiver&, INTEGER_IMPL(I)& );
3471+
3472+ template<class T>
3473+ void operator&( Archiver&, IntegerImpl<T>& );
3474 }
3475
3476 ///////////////////////////////////////////////////////////////////////////////
3477
3478-TEMPLATE_DECL(IntType)
3479-class IntegerImpl
3480-{
3481+std::ostream& operator<<( std::ostream&, MAPM const& );
3482+
3483+struct integer_traits {
3484+ static int const default_value = 0;
3485+
3486+ template<typename ValueType>
3487+ static ValueType check_value( ValueType n, bool ) {
3488+ return n;
3489+ }
3490+
3491+ static MAPM const& check_value( MAPM const &n, bool ) {
3492+ return n;
3493+ }
3494+
3495+protected:
3496+ static void throw_error( std::string const&, bool );
3497+
3498+ template<typename ValueType>
3499+ static void throw_error( ValueType n, char const *op,
3500+ bool throw_range_error ) {
3501+ std::string const what( BUILD_STRING( n, ": not ", op, " 0" ) );
3502+ throw_error( what, throw_range_error );
3503+ }
3504+
3505+ static void throw_error( MAPM const &n, char const *op,
3506+ bool throw_range_error );
3507+};
3508+
3509+struct nonPositive_traits : integer_traits {
3510+ template<typename ValueType>
3511+ static ValueType check_value( ValueType n, bool throw_range_error ) {
3512+ if ( !ztd::le0( n ) )
3513+ throw_error( n, "<=", throw_range_error );
3514+ return n;
3515+ }
3516+ static MAPM const& check_value( MAPM const &n, bool throw_range_error ) {
3517+ if ( !(n.sign() <= 0) )
3518+ throw_error( n, "<=", throw_range_error );
3519+ return n;
3520+ }
3521+};
3522+
3523+struct negative_traits : nonPositive_traits {
3524+ static int const default_value = -1;
3525+
3526+ template<typename ValueType>
3527+ static ValueType check_value( ValueType n, bool throw_range_error ) {
3528+ if ( !ztd::lt0( n ) )
3529+ throw_error( n, "<", throw_range_error );
3530+ return n;
3531+ }
3532+ static MAPM const& check_value( MAPM const &n, bool throw_range_error ) {
3533+ if ( !(n.sign() < 0) )
3534+ throw_error( n, "<", throw_range_error );
3535+ return n;
3536+ }
3537+};
3538+
3539+struct nonNegative_traits : integer_traits {
3540+ template<typename ValueType>
3541+ static ValueType check_value( ValueType n, bool throw_range_error ) {
3542+ if ( !ztd::ge0( n ) )
3543+ throw_error( n, ">=", throw_range_error );
3544+ return n;
3545+ }
3546+ static MAPM const& check_value( MAPM const &n, bool throw_range_error ) {
3547+ if ( !(n.sign() >= 0) )
3548+ throw_error( n, ">=", throw_range_error );
3549+ return n;
3550+ }
3551+};
3552+
3553+struct positive_traits : nonNegative_traits {
3554+ static int const default_value = 1;
3555+
3556+ template<typename ValueType>
3557+ static ValueType check_value( ValueType n, bool throw_range_error ) {
3558+ if ( !ztd::gt0( n ) )
3559+ throw_error( n, ">", throw_range_error );
3560+ return n;
3561+ }
3562+ static MAPM const& check_value( MAPM const &n, bool throw_range_error ) {
3563+ if ( !(n.sign() > 0) )
3564+ throw_error( n, ">", throw_range_error );
3565+ return n;
3566+ }
3567+};
3568+
3569+template<class TraitsType>
3570+class IntegerImpl {
3571 public:
3572 #ifdef ZORBA_WITH_BIG_INTEGER
3573 typedef MAPM value_type;
3574 #else
3575- typedef IntType value_type;
3576+ typedef long long value_type;
3577 #endif /* ZORBA_WITH_BIG_INTEGER */
3578+ typedef TraitsType traits_type;
3579
3580 ////////// constructors /////////////////////////////////////////////////////
3581
3582 explicit IntegerImpl( char c );
3583 explicit IntegerImpl( signed char c );
3584 explicit IntegerImpl( short n );
3585- explicit IntegerImpl( int n = 0 );
3586+ explicit IntegerImpl( int n = traits_type::default_value );
3587 explicit IntegerImpl( long n );
3588 explicit IntegerImpl( long long n );
3589 explicit IntegerImpl( unsigned char c );
3590@@ -112,27 +194,27 @@
3591 explicit IntegerImpl( Float const &f );
3592
3593 /**
3594- * Constructs from another %IntegerImpl even if its \c IntType is different.
3595- * (This subsumes the conventional copy constructor.)
3596+ * Constructs from another %IntegerImpl even if its \c TraitsType is
3597+ * different. (This subsumes the conventional copy constructor.)
3598 *
3599- * @tparam IntType2 the integer type of \a i.
3600+ * @tparam TraitsType2 The traits type of \a i.
3601 * @param i The %IntegerImpl to copy from.
3602 */
3603- TEMPLATE_DECL(IntType2)
3604- IntegerImpl( INTEGER_IMPL(IntType2) const &i );
3605+ template<class TraitsType2>
3606+ IntegerImpl( IntegerImpl<TraitsType2> const &i );
3607
3608 ////////// assignment operators /////////////////////////////////////////////
3609
3610 /**
3611- * Assign from an %IntegerImpl even if its \c IntType is different.
3612+ * Assign from an %IntegerImpl even if its \c TraitsType is different.
3613 * (This subsumes the conventional assignment operator.)
3614 *
3615- * @tparam IntType2 the integer type of \a i.
3616+ * @tparam TraitsType2 The traits type of \a i.
3617 * @param i The %IntegerImpl to assign from.
3618 * @return Returns \c *this.
3619 */
3620- TEMPLATE_DECL(IntType2)
3621- IntegerImpl& operator=( INTEGER_IMPL(IntType2) const &i );
3622+ template<class TraitsType2>
3623+ IntegerImpl& operator=( IntegerImpl<TraitsType2> const &i );
3624
3625 IntegerImpl& operator=( char c );
3626 IntegerImpl& operator=( signed char c );
3627@@ -155,16 +237,15 @@
3628
3629 ////////// arithmetic operators /////////////////////////////////////////////
3630
3631-#define ZORBA_INTEGER_OP(OP) \
3632- TEMPLATE_DECL(I) friend \
3633- INTEGER_IMPL(I) operator OP( INTEGER_IMPL(I) const&, \
3634- INTEGER_IMPL(I) const& ); \
3635- \
3636- TEMPLATE_DECL(I) friend \
3637- Decimal operator OP( INTEGER_IMPL(I) const&, Decimal const& ); \
3638- \
3639- TEMPLATE_DECL(I) friend \
3640- Decimal operator OP( Decimal const&, INTEGER_IMPL(I) const& )
3641+#define ZORBA_INTEGER_OP(OP) \
3642+ template<class T,class U> friend \
3643+ Integer operator OP( IntegerImpl<T> const&, IntegerImpl<U> const& ); \
3644+ \
3645+ template<class T> friend \
3646+ Decimal operator OP( IntegerImpl<T> const&, Decimal const& ); \
3647+ \
3648+ template<class T> friend \
3649+ Decimal operator OP( Decimal const&, IntegerImpl<T> const& )
3650
3651 ZORBA_INTEGER_OP(+);
3652 ZORBA_INTEGER_OP(-);
3653@@ -173,12 +254,12 @@
3654 ZORBA_INTEGER_OP(%);
3655 #undef ZORBA_INTEGER_OP
3656
3657-#define ZORBA_INTEGER_OP(OP,T) \
3658- TEMPLATE_DECL(I) friend \
3659- INTEGER_IMPL(I) operator OP( INTEGER_IMPL(I) const&, T ); \
3660- \
3661- TEMPLATE_DECL(I) friend \
3662- INTEGER_IMPL(I) operator OP( T, INTEGER_IMPL(I) const& )
3663+#define ZORBA_INTEGER_OP(OP,N) \
3664+ template<class T> friend \
3665+ Integer operator OP( IntegerImpl<T> const&, N ); \
3666+ \
3667+ template<class T> friend \
3668+ Integer operator OP( N, IntegerImpl<T> const& )
3669
3670 ZORBA_INTEGER_OP(+,char);
3671 ZORBA_INTEGER_OP(-,char);
3672@@ -247,19 +328,14 @@
3673 ZORBA_INTEGER_OP(%,double);
3674 #undef ZORBA_INTEGER_OP
3675
3676-#define ZORBA_INTEGER_OP(OP,TYPE) \
3677- IntegerImpl& operator OP( TYPE )
3678+#define ZORBA_INTEGER_OP(OP,T) \
3679+ IntegerImpl& operator OP( T )
3680
3681 ZORBA_INTEGER_OP(+=,IntegerImpl const&);
3682 ZORBA_INTEGER_OP(-=,IntegerImpl const&);
3683 ZORBA_INTEGER_OP(*=,IntegerImpl const&);
3684 ZORBA_INTEGER_OP(/=,IntegerImpl const&);
3685 ZORBA_INTEGER_OP(%=,IntegerImpl const&);
3686-#undef ZORBA_INTEGER_OP
3687-
3688-#define ZORBA_INTEGER_OP(OP,T) \
3689- IntegerImpl& operator OP( T )
3690-
3691 ZORBA_INTEGER_OP(+=,char);
3692 ZORBA_INTEGER_OP(-=,char);
3693 ZORBA_INTEGER_OP(*=,char);
3694@@ -327,7 +403,7 @@
3695 ZORBA_INTEGER_OP(%=,double);
3696 #undef ZORBA_INTEGER_OP
3697
3698- IntegerImpl operator-() const;
3699+ Integer operator-() const;
3700
3701 IntegerImpl& operator++();
3702 IntegerImpl operator++(int);
3703@@ -336,107 +412,107 @@
3704
3705 ////////// relational operators /////////////////////////////////////////////
3706
3707-#define ZORBA_INTEGER_OP(OP) \
3708- TEMPLATE_DECL(I) friend \
3709- bool operator OP( INTEGER_IMPL(I) const&, INTEGER_IMPL(I) const& ); \
3710- \
3711- TEMPLATE_DECL(I) friend \
3712- bool operator OP( INTEGER_IMPL(I) const&, Decimal const& ); \
3713- \
3714- TEMPLATE_DECL(I) friend \
3715- bool operator OP( Decimal const&, INTEGER_IMPL(I) const& )
3716-
3717- ZORBA_INTEGER_OP(==);
3718- ZORBA_INTEGER_OP(!=);
3719- ZORBA_INTEGER_OP(< );
3720- ZORBA_INTEGER_OP(<=);
3721- ZORBA_INTEGER_OP(> );
3722- ZORBA_INTEGER_OP(>=);
3723-#undef ZORBA_INTEGER_OP
3724-
3725-#define ZORBA_INTEGER_OP(OP,T) \
3726- TEMPLATE_DECL(I) friend bool operator OP( INTEGER_IMPL(I) const&, T ); \
3727- TEMPLATE_DECL(I) friend bool operator OP( T, INTEGER_IMPL(I) const& )
3728-
3729- ZORBA_INTEGER_OP(==,char);
3730- ZORBA_INTEGER_OP(!=,char);
3731- ZORBA_INTEGER_OP(< ,char);
3732- ZORBA_INTEGER_OP(<=,char);
3733- ZORBA_INTEGER_OP(> ,char);
3734- ZORBA_INTEGER_OP(>=,char);
3735- ZORBA_INTEGER_OP(==,signed char);
3736- ZORBA_INTEGER_OP(!=,signed char);
3737- ZORBA_INTEGER_OP(< ,signed char);
3738- ZORBA_INTEGER_OP(<=,signed char);
3739- ZORBA_INTEGER_OP(> ,signed char);
3740- ZORBA_INTEGER_OP(>=,signed char);
3741- ZORBA_INTEGER_OP(==,short);
3742- ZORBA_INTEGER_OP(!=,short);
3743- ZORBA_INTEGER_OP(< ,short);
3744- ZORBA_INTEGER_OP(<=,short);
3745- ZORBA_INTEGER_OP(> ,short);
3746- ZORBA_INTEGER_OP(>=,short);
3747- ZORBA_INTEGER_OP(==,int);
3748- ZORBA_INTEGER_OP(!=,int);
3749- ZORBA_INTEGER_OP(< ,int);
3750- ZORBA_INTEGER_OP(<=,int);
3751- ZORBA_INTEGER_OP(> ,int);
3752- ZORBA_INTEGER_OP(>=,int);
3753- ZORBA_INTEGER_OP(==,long);
3754- ZORBA_INTEGER_OP(!=,long);
3755- ZORBA_INTEGER_OP(< ,long);
3756- ZORBA_INTEGER_OP(<=,long);
3757- ZORBA_INTEGER_OP(> ,long);
3758- ZORBA_INTEGER_OP(>=,long);
3759- ZORBA_INTEGER_OP(==,long long);
3760- ZORBA_INTEGER_OP(!=,long long);
3761- ZORBA_INTEGER_OP(< ,long long);
3762- ZORBA_INTEGER_OP(<=,long long);
3763- ZORBA_INTEGER_OP(> ,long long);
3764- ZORBA_INTEGER_OP(>=,long long);
3765- ZORBA_INTEGER_OP(==,unsigned char);
3766- ZORBA_INTEGER_OP(!=,unsigned char);
3767- ZORBA_INTEGER_OP(< ,unsigned char);
3768- ZORBA_INTEGER_OP(<=,unsigned char);
3769- ZORBA_INTEGER_OP(> ,unsigned char);
3770- ZORBA_INTEGER_OP(>=,unsigned char);
3771- ZORBA_INTEGER_OP(==,unsigned short);
3772- ZORBA_INTEGER_OP(!=,unsigned short);
3773- ZORBA_INTEGER_OP(< ,unsigned short);
3774- ZORBA_INTEGER_OP(<=,unsigned short);
3775- ZORBA_INTEGER_OP(> ,unsigned short);
3776- ZORBA_INTEGER_OP(>=,unsigned short);
3777- ZORBA_INTEGER_OP(==,unsigned int);
3778- ZORBA_INTEGER_OP(!=,unsigned int);
3779- ZORBA_INTEGER_OP(< ,unsigned int);
3780- ZORBA_INTEGER_OP(<=,unsigned int);
3781- ZORBA_INTEGER_OP(> ,unsigned int);
3782- ZORBA_INTEGER_OP(>=,unsigned int);
3783- ZORBA_INTEGER_OP(==,unsigned long);
3784- ZORBA_INTEGER_OP(!=,unsigned long);
3785- ZORBA_INTEGER_OP(< ,unsigned long);
3786- ZORBA_INTEGER_OP(<=,unsigned long);
3787- ZORBA_INTEGER_OP(> ,unsigned long);
3788- ZORBA_INTEGER_OP(>=,unsigned long);
3789- ZORBA_INTEGER_OP(==,unsigned long long);
3790- ZORBA_INTEGER_OP(!=,unsigned long long);
3791- ZORBA_INTEGER_OP(< ,unsigned long long);
3792- ZORBA_INTEGER_OP(<=,unsigned long long);
3793- ZORBA_INTEGER_OP(> ,unsigned long long);
3794- ZORBA_INTEGER_OP(>=,unsigned long long);
3795- ZORBA_INTEGER_OP(==,float);
3796- ZORBA_INTEGER_OP(!=,float);
3797- ZORBA_INTEGER_OP(< ,float);
3798- ZORBA_INTEGER_OP(<=,float);
3799- ZORBA_INTEGER_OP(> ,float);
3800- ZORBA_INTEGER_OP(>=,float);
3801- ZORBA_INTEGER_OP(==,double);
3802- ZORBA_INTEGER_OP(!=,double);
3803- ZORBA_INTEGER_OP(< ,double);
3804- ZORBA_INTEGER_OP(<=,double);
3805- ZORBA_INTEGER_OP(> ,double);
3806- ZORBA_INTEGER_OP(>=,double);
3807-#undef ZORBA_INTEGER_OP
3808+#define ZORBA_REL_OP(OP) \
3809+ template<class T,class U> friend \
3810+ bool operator OP( IntegerImpl<T> const&, IntegerImpl<U> const& ); \
3811+ \
3812+ template<class T> friend \
3813+ bool operator OP( IntegerImpl<T> const&, Decimal const& ); \
3814+ \
3815+ template<class T> friend \
3816+ bool operator OP( Decimal const&, IntegerImpl<T> const& )
3817+
3818+ ZORBA_REL_OP(==);
3819+ ZORBA_REL_OP(!=);
3820+ ZORBA_REL_OP(< );
3821+ ZORBA_REL_OP(<=);
3822+ ZORBA_REL_OP(> );
3823+ ZORBA_REL_OP(>=);
3824+#undef ZORBA_REL_OP
3825+
3826+#define ZORBA_REL_OP(OP,N) \
3827+ template<class T> friend bool operator OP( IntegerImpl<T> const&, N ); \
3828+ template<class T> friend bool operator OP( N, IntegerImpl<T> const& )
3829+
3830+ ZORBA_REL_OP(==,char);
3831+ ZORBA_REL_OP(!=,char);
3832+ ZORBA_REL_OP(< ,char);
3833+ ZORBA_REL_OP(<=,char);
3834+ ZORBA_REL_OP(> ,char);
3835+ ZORBA_REL_OP(>=,char);
3836+ ZORBA_REL_OP(==,signed char);
3837+ ZORBA_REL_OP(!=,signed char);
3838+ ZORBA_REL_OP(< ,signed char);
3839+ ZORBA_REL_OP(<=,signed char);
3840+ ZORBA_REL_OP(> ,signed char);
3841+ ZORBA_REL_OP(>=,signed char);
3842+ ZORBA_REL_OP(==,short);
3843+ ZORBA_REL_OP(!=,short);
3844+ ZORBA_REL_OP(< ,short);
3845+ ZORBA_REL_OP(<=,short);
3846+ ZORBA_REL_OP(> ,short);
3847+ ZORBA_REL_OP(>=,short);
3848+ ZORBA_REL_OP(==,int);
3849+ ZORBA_REL_OP(!=,int);
3850+ ZORBA_REL_OP(< ,int);
3851+ ZORBA_REL_OP(<=,int);
3852+ ZORBA_REL_OP(> ,int);
3853+ ZORBA_REL_OP(>=,int);
3854+ ZORBA_REL_OP(==,long);
3855+ ZORBA_REL_OP(!=,long);
3856+ ZORBA_REL_OP(< ,long);
3857+ ZORBA_REL_OP(<=,long);
3858+ ZORBA_REL_OP(> ,long);
3859+ ZORBA_REL_OP(>=,long);
3860+ ZORBA_REL_OP(==,long long);
3861+ ZORBA_REL_OP(!=,long long);
3862+ ZORBA_REL_OP(< ,long long);
3863+ ZORBA_REL_OP(<=,long long);
3864+ ZORBA_REL_OP(> ,long long);
3865+ ZORBA_REL_OP(>=,long long);
3866+ ZORBA_REL_OP(==,unsigned char);
3867+ ZORBA_REL_OP(!=,unsigned char);
3868+ ZORBA_REL_OP(< ,unsigned char);
3869+ ZORBA_REL_OP(<=,unsigned char);
3870+ ZORBA_REL_OP(> ,unsigned char);
3871+ ZORBA_REL_OP(>=,unsigned char);
3872+ ZORBA_REL_OP(==,unsigned short);
3873+ ZORBA_REL_OP(!=,unsigned short);
3874+ ZORBA_REL_OP(< ,unsigned short);
3875+ ZORBA_REL_OP(<=,unsigned short);
3876+ ZORBA_REL_OP(> ,unsigned short);
3877+ ZORBA_REL_OP(>=,unsigned short);
3878+ ZORBA_REL_OP(==,unsigned int);
3879+ ZORBA_REL_OP(!=,unsigned int);
3880+ ZORBA_REL_OP(< ,unsigned int);
3881+ ZORBA_REL_OP(<=,unsigned int);
3882+ ZORBA_REL_OP(> ,unsigned int);
3883+ ZORBA_REL_OP(>=,unsigned int);
3884+ ZORBA_REL_OP(==,unsigned long);
3885+ ZORBA_REL_OP(!=,unsigned long);
3886+ ZORBA_REL_OP(< ,unsigned long);
3887+ ZORBA_REL_OP(<=,unsigned long);
3888+ ZORBA_REL_OP(> ,unsigned long);
3889+ ZORBA_REL_OP(>=,unsigned long);
3890+ ZORBA_REL_OP(==,unsigned long long);
3891+ ZORBA_REL_OP(!=,unsigned long long);
3892+ ZORBA_REL_OP(< ,unsigned long long);
3893+ ZORBA_REL_OP(<=,unsigned long long);
3894+ ZORBA_REL_OP(> ,unsigned long long);
3895+ ZORBA_REL_OP(>=,unsigned long long);
3896+ ZORBA_REL_OP(==,float);
3897+ ZORBA_REL_OP(!=,float);
3898+ ZORBA_REL_OP(< ,float);
3899+ ZORBA_REL_OP(<=,float);
3900+ ZORBA_REL_OP(> ,float);
3901+ ZORBA_REL_OP(>=,float);
3902+ ZORBA_REL_OP(==,double);
3903+ ZORBA_REL_OP(!=,double);
3904+ ZORBA_REL_OP(< ,double);
3905+ ZORBA_REL_OP(<=,double);
3906+ ZORBA_REL_OP(> ,double);
3907+ ZORBA_REL_OP(>=,double);
3908+#undef ZORBA_REL_OP
3909
3910 ////////// math functions ///////////////////////////////////////////////////
3911
3912@@ -464,8 +540,6 @@
3913 zstring toString() const;
3914 value_type& value();
3915 value_type const& value() const;
3916- static IntegerImpl const& one();
3917- static IntegerImpl const& zero();
3918
3919 /////////////////////////////////////////////////////////////////////////////
3920
3921@@ -473,20 +547,18 @@
3922 #ifdef ZORBA_WITH_BIG_INTEGER
3923 typedef long int_cast_type;
3924 #else
3925- typedef IntType int_cast_type;
3926+ typedef value_type int_cast_type;
3927 #endif /* ZORBA_WITH_BIG_INTEGER */
3928
3929 value_type value_;
3930
3931-#ifdef ZORBA_WITH_BIG_INTEGER
3932- IntegerImpl( value_type const &v ) : value_( v ) { }
3933-#endif /* ZORBA_WITH_BIG_INTEGER */
3934-
3935 static value_type ftoi( double d ) {
3936 return value_type( d >= 0 ? floor( d ) : ceil( d ) );
3937 }
3938
3939 #ifdef ZORBA_WITH_BIG_INTEGER
3940+ IntegerImpl( value_type const &v ) : value_( v ) { }
3941+
3942 static value_type ftoi( MAPM const &d ) {
3943 return d.sign() >= 0 ? d.floor() : d.ceil();
3944 }
3945@@ -499,7 +571,6 @@
3946 static value_type make_value_type( T n ) {
3947 return value_type( static_cast<int_cast_type>( n ) );
3948 }
3949-
3950 #else /* ZORBA_WITH_BIG_INTEGER */
3951
3952 static value_type ftoi( value_type v ) {
3953@@ -516,148 +587,149 @@
3954 }
3955 #endif /* ZORBA_WITH_BIG_INTEGER */
3956
3957- void parse( char const *s );
3958+ void parse( char const *s, bool throw_range_error );
3959
3960 friend class Decimal;
3961- template<typename T> friend class FloatImpl;
3962-
3963-#ifndef ZORBA_WITH_BIG_INTEGER
3964- template<typename T> friend class IntegerImpl;
3965-#endif /* ZORBA_WITH_BIG_INTEGER */
3966-
3967- friend xs_int to_xs_int( INTEGER_IMPL_LL const& );
3968- friend xs_long to_xs_long( INTEGER_IMPL_LL const& );
3969- friend xs_unsignedByte to_xs_unsignedByte( INTEGER_IMPL_LL const& );
3970- friend xs_unsignedShort to_xs_unsignedShort( INTEGER_IMPL_LL const& );
3971- friend xs_unsignedInt to_xs_unsignedInt( INTEGER_IMPL_LL const& );
3972- friend xs_unsignedLong to_xs_unsignedLong( INTEGER_IMPL_LL const& );
3973-
3974- TEMPLATE_DECL(I) friend
3975- void serialization::operator&( serialization::Archiver&, INTEGER_IMPL(I)& );
3976+ template<typename F> friend class FloatImpl;
3977+ template<class T> friend class IntegerImpl;
3978+
3979+ friend xs_int to_xs_int( Integer const& );
3980+ friend xs_long to_xs_long( Integer const& );
3981+ friend xs_unsignedByte to_xs_unsignedByte( Integer const& );
3982+ friend xs_unsignedShort to_xs_unsignedShort( Integer const& );
3983+ friend xs_unsignedInt to_xs_unsignedInt( Integer const& );
3984+ friend xs_unsignedLong to_xs_unsignedLong( Integer const& );
3985+
3986+ template<class T> friend
3987+ void serialization::operator&( serialization::Archiver&, IntegerImpl<T>& );
3988 };
3989
3990-typedef INTEGER_IMPL_LL Integer;
3991-typedef INTEGER_IMPL_ULL UInteger;
3992+typedef IntegerImpl<integer_traits> Integer;
3993+typedef IntegerImpl<negative_traits> NegativeInteger;
3994+typedef IntegerImpl<nonNegative_traits> NonNegativeInteger;
3995+typedef IntegerImpl<nonPositive_traits> NonPositiveInteger;
3996+typedef IntegerImpl<positive_traits> PositiveInteger;
3997
3998 ////////// constructors ///////////////////////////////////////////////////////
3999
4000-TEMPLATE_DECL(I)
4001-inline INTEGER_IMPL(I)::IntegerImpl( char c ) :
4002- value_( static_cast<long>( c ) )
4003-{
4004-}
4005-
4006-TEMPLATE_DECL(I)
4007-inline INTEGER_IMPL(I)::IntegerImpl( signed char c ) :
4008- value_( static_cast<long>( c ) )
4009-{
4010-}
4011-
4012-TEMPLATE_DECL(I)
4013-inline INTEGER_IMPL(I)::IntegerImpl( short n ) :
4014- value_( static_cast<long>( n ) )
4015-{
4016-}
4017-
4018-TEMPLATE_DECL(I)
4019-inline INTEGER_IMPL(I)::IntegerImpl( int n ) :
4020- value_( static_cast<long>( n ) )
4021-{
4022-}
4023-
4024-TEMPLATE_DECL(I)
4025-inline INTEGER_IMPL(I)::IntegerImpl( long n ) :
4026- value_( n )
4027+template<class T>
4028+inline IntegerImpl<T>::IntegerImpl( char c ) :
4029+ value_( static_cast<long>( T::check_value( c, false ) ) )
4030+{
4031+}
4032+
4033+template<class T>
4034+inline IntegerImpl<T>::IntegerImpl( signed char c ) :
4035+ value_( static_cast<long>( T::check_value( c, false ) ) )
4036+{
4037+}
4038+
4039+template<class T>
4040+inline IntegerImpl<T>::IntegerImpl( short n ) :
4041+ value_( static_cast<long>( T::check_value( n, false ) ) )
4042+{
4043+}
4044+
4045+template<class T>
4046+inline IntegerImpl<T>::IntegerImpl( int n ) :
4047+ value_( static_cast<long>( T::check_value( n, false ) ) )
4048+{
4049+}
4050+
4051+template<class T>
4052+inline IntegerImpl<T>::IntegerImpl( long n ) :
4053+ value_( T::check_value( n, false ) )
4054 {
4055 }
4056
4057 #ifndef ZORBA_WITH_BIG_INTEGER
4058-TEMPLATE_DECL(I)
4059-inline INTEGER_IMPL(I)::IntegerImpl( long long n ) :
4060- value_( n )
4061+template<class T>
4062+inline IntegerImpl<T>::IntegerImpl( long long n ) :
4063+ value_( T::check_value( n, false ) )
4064 {
4065 }
4066 #endif /* ZORBA_WITH_BIG_INTEGER */
4067
4068-TEMPLATE_DECL(I)
4069-inline INTEGER_IMPL(I)::IntegerImpl( unsigned char c ) :
4070- value_( static_cast<long>( (unsigned long)c ) )
4071+template<class T>
4072+inline IntegerImpl<T>::IntegerImpl( unsigned char c ) :
4073+ value_( static_cast<long>( (unsigned long)T::check_value( c, false ) ) )
4074 {
4075 }
4076
4077-TEMPLATE_DECL(I)
4078-inline INTEGER_IMPL(I)::IntegerImpl( unsigned short n ) :
4079- value_( static_cast<long>( (unsigned long)n ) )
4080+template<class T>
4081+inline IntegerImpl<T>::IntegerImpl( unsigned short n ) :
4082+ value_( static_cast<long>( (unsigned long)T::check_value( n, false ) ) )
4083 {
4084 }
4085
4086 #ifdef ZORBA_WITH_BIG_INTEGER
4087 #if ZORBA_SIZEOF_INT != ZORBA_SIZEOF_LONG
4088-TEMPLATE_DECL(T)
4089-inline INTEGER_IMPL(T)::IntegerImpl( unsigned int n ) :
4090- value_( static_cast<long>( (unsigned long)n ) )
4091+template<class T>
4092+inline IntegerImpl<T>::IntegerImpl( unsigned int n ) :
4093+ value_( static_cast<long>( (unsigned long)T::check_value( n, false ) ) )
4094 {
4095 }
4096 #endif /* ZORBA_SIZEOF_INT == ZORBA_SIZEOF_LONG */
4097 #else /* ZORBA_WITH_BIG_INTEGER */
4098-TEMPLATE_DECL(I)
4099-inline INTEGER_IMPL(I)::IntegerImpl( unsigned int n ) :
4100- value_( static_cast<value_type>( n ) )
4101-{
4102-}
4103-
4104-TEMPLATE_DECL(I)
4105-inline INTEGER_IMPL(I)::IntegerImpl( unsigned long n ) :
4106- value_( static_cast<value_type>( n ) )
4107-{
4108-}
4109-
4110-TEMPLATE_DECL(I)
4111-inline INTEGER_IMPL(I)::IntegerImpl( unsigned long long n ) :
4112- value_( static_cast<value_type>( n ) )
4113-{
4114-}
4115-#endif /* ZORBA_WITH_BIG_INTEGER */
4116-
4117-TEMPLATE_DECL(I)
4118-inline INTEGER_IMPL(I)::IntegerImpl( float n ) :
4119-#ifdef ZORBA_WITH_BIG_INTEGER
4120- value_( static_cast<double>( n ) )
4121-#else
4122- value_( static_cast<value_type>( n ) )
4123-#endif /* ZORBA_WITH_BIG_INTEGER */
4124-{
4125-}
4126-
4127-TEMPLATE_DECL(I)
4128-inline INTEGER_IMPL(I)::IntegerImpl( double n ) :
4129-#ifdef ZORBA_WITH_BIG_INTEGER
4130- value_( n )
4131-#else
4132- value_( static_cast<value_type>( n ) )
4133-#endif /* ZORBA_WITH_BIG_INTEGER */
4134-{
4135-}
4136-
4137-TEMPLATE_DECL(I)
4138-inline INTEGER_IMPL(I)::IntegerImpl( char const *s ) {
4139- parse( s );
4140-}
4141-
4142-TEMPLATE_DECL(I)
4143-TEMPLATE_DECL(J)
4144-inline INTEGER_IMPL(I)::IntegerImpl( INTEGER_IMPL(J) const &i ) :
4145- value_( i.value_ )
4146+
4147+template<class T>
4148+inline IntegerImpl<T>::IntegerImpl( unsigned int n ) :
4149+ value_( static_cast<value_type>( T::check_value( n, false ) ) )
4150+{
4151+}
4152+
4153+template<class T>
4154+inline IntegerImpl<T>::IntegerImpl( unsigned long n ) :
4155+ value_( static_cast<value_type>( T::check_value( n, false ) ) )
4156+{
4157+}
4158+
4159+template<class T>
4160+inline IntegerImpl<T>::IntegerImpl( unsigned long long n ) :
4161+ value_( static_cast<value_type>( T::check_value( n, false ) ) )
4162+{
4163+}
4164+#endif /* ZORBA_WITH_BIG_INTEGER */
4165+
4166+template<class T>
4167+inline IntegerImpl<T>::IntegerImpl( float n ) :
4168+#ifdef ZORBA_WITH_BIG_INTEGER
4169+ value_( static_cast<double>( T::check_value( n, false ) ) )
4170+#else
4171+ value_( static_cast<value_type>( T::check_value( n, false ) ) )
4172+#endif /* ZORBA_WITH_BIG_INTEGER */
4173+{
4174+}
4175+
4176+template<class T>
4177+inline IntegerImpl<T>::IntegerImpl( double n ) :
4178+#ifdef ZORBA_WITH_BIG_INTEGER
4179+ value_( T::check_value( n, false ) )
4180+#else
4181+ value_( static_cast<value_type>( T::check_value( n, false ) ) )
4182+#endif /* ZORBA_WITH_BIG_INTEGER */
4183+{
4184+}
4185+
4186+template<class T>
4187+inline IntegerImpl<T>::IntegerImpl( char const *s ) {
4188+ parse( s, false );
4189+}
4190+
4191+template<class T>
4192+template<class U>
4193+inline IntegerImpl<T>::IntegerImpl( IntegerImpl<U> const &i ) :
4194+ value_( T::check_value( i.value_, false ) )
4195 {
4196 }
4197
4198 ////////// assignment operators ///////////////////////////////////////////////
4199
4200-#define ZORBA_ASSIGN_OP(T) \
4201- TEMPLATE_DECL(I) inline \
4202- INTEGER_IMPL(I)& INTEGER_IMPL(I)::operator=( T n ) { \
4203- value_ = static_cast<int_cast_type>( n ); \
4204- return *this; \
4205+#define ZORBA_ASSIGN_OP(N) \
4206+ template<class T> inline \
4207+ IntegerImpl<T>& IntegerImpl<T>::operator=( N n ) { \
4208+ value_ = static_cast<int_cast_type>( T::check_value( n, false ) ); \
4209+ return *this; \
4210 }
4211
4212 ZORBA_ASSIGN_OP(char)
4213@@ -677,25 +749,25 @@
4214 #endif /* ZORBA_WITH_BIG_INTEGER */
4215 #undef ZORBA_ASSIGN_OP
4216
4217-TEMPLATE_DECL(I)
4218-inline INTEGER_IMPL(I)& INTEGER_IMPL(I)::operator=( char const *s ) {
4219- parse( s );
4220+template<class T>
4221+inline IntegerImpl<T>& IntegerImpl<T>::operator=( char const *s ) {
4222+ parse( s, false );
4223 return *this;
4224 }
4225
4226-TEMPLATE_DECL(I) TEMPLATE_DECL(J)
4227-inline INTEGER_IMPL(I)& INTEGER_IMPL(I)::operator=( INTEGER_IMPL(J) const &i ) {
4228- value_ = i.value_;
4229+template<class T>
4230+template<class U>
4231+inline IntegerImpl<T>& IntegerImpl<T>::operator=( IntegerImpl<U> const &i ) {
4232+ T::check_value( value_ = i.value_, false );
4233 return *this;
4234 }
4235
4236 ////////// arithmetic operators ///////////////////////////////////////////////
4237
4238-#define ZORBA_INTEGER_OP(OP) \
4239- TEMPLATE_DECL(I) inline \
4240- INTEGER_IMPL(I) operator OP( INTEGER_IMPL(I) const &i, \
4241- INTEGER_IMPL(I) const &j ) { \
4242- return INTEGER_IMPL(I)( i.value_ OP j.value_ ); \
4243+#define ZORBA_INTEGER_OP(OP) \
4244+ template<class T,class U> inline \
4245+ Integer operator OP( IntegerImpl<T> const &i, IntegerImpl<U> const &j ) { \
4246+ return Integer( i.value_ OP j.value_ ); \
4247 }
4248
4249 ZORBA_INTEGER_OP(+)
4250@@ -704,21 +776,20 @@
4251 ZORBA_INTEGER_OP(%)
4252 #undef ZORBA_INTEGER_OP
4253
4254-TEMPLATE_DECL(I) inline
4255-INTEGER_IMPL(I) operator/( INTEGER_IMPL(I) const &i,
4256- INTEGER_IMPL(I) const &j ) {
4257- return INTEGER_IMPL(I)( INTEGER_IMPL(I)::ftoi( i.value_ / j.value_ ) );
4258+template<class T,class U>
4259+inline Integer operator/( IntegerImpl<T> const &i, IntegerImpl<U> const &j ) {
4260+ return Integer( Integer::ftoi( i.value_ / j.value_ ) );
4261 }
4262
4263-#define ZORBA_INTEGER_OP(OP,T) \
4264- TEMPLATE_DECL(I) inline \
4265- INTEGER_IMPL(I) operator OP( INTEGER_IMPL(I) const &i, T n ) { \
4266- return INTEGER_IMPL(I)( i.value_ OP INTEGER_IMPL(I)::make_value_type( n ) ); \
4267+#define ZORBA_INTEGER_OP(OP,N) \
4268+ template<class T> inline \
4269+ Integer operator OP( IntegerImpl<T> const &i, N n ) { \
4270+ return Integer( i.value_ OP Integer::make_value_type( n ) ); \
4271 } \
4272 \
4273- TEMPLATE_DECL(I) inline \
4274- INTEGER_IMPL(I) operator OP( T n, INTEGER_IMPL(I) const &i ) { \
4275- return INTEGER_IMPL(I)( INTEGER_IMPL(I)::make_value_type( n ) OP i.value_ ); \
4276+ template<class T> inline \
4277+ Integer operator OP( N n, IntegerImpl<T> const &i ) { \
4278+ return Integer( Integer::make_value_type( n ) OP i.value_ ); \
4279 }
4280
4281 ZORBA_INTEGER_OP(+,char)
4282@@ -777,15 +848,15 @@
4283 #endif /* ZORBA_WITH_BIG_INTEGER */
4284 #undef ZORBA_INTEGER_OP
4285
4286-#define ZORBA_INTEGER_OP(T) \
4287- TEMPLATE_DECL(I) inline \
4288- INTEGER_IMPL(I) operator/( INTEGER_IMPL(I) const &i, T n ) { \
4289- return INTEGER_IMPL(I)( INTEGER_IMPL(I)::ftoi( i.value_ / INTEGER_IMPL(I)::make_value_type( n ) ) ); \
4290- } \
4291- \
4292- TEMPLATE_DECL(I) inline \
4293- INTEGER_IMPL(I) operator/( T n, INTEGER_IMPL(I) const &i ) { \
4294- return INTEGER_IMPL(I)( INTEGER_IMPL(I)::ftoi( INTEGER_IMPL(I)::make_value_type( n ) / i.value_ ) ); \
4295+#define ZORBA_INTEGER_OP(N) \
4296+ template<class T> inline \
4297+ Integer operator/( IntegerImpl<T> const &i, N n ) { \
4298+ return Integer( Integer::ftoi( i.value_ / Integer::make_value_type( n ) ) ); \
4299+ } \
4300+ \
4301+ template<class T> inline \
4302+ Integer operator/( N n, IntegerImpl<T> const &i ) { \
4303+ return Integer( Integer::ftoi( Integer::make_value_type( n ) / i.value_ ) ); \
4304 }
4305
4306 ZORBA_INTEGER_OP(signed char)
4307@@ -805,11 +876,11 @@
4308 #endif /* ZORBA_WITH_BIG_INTEGER */
4309 #undef ZORBA_INTEGER_OP
4310
4311-#define ZORBA_INTEGER_OP(OP) \
4312- TEMPLATE_DECL(I) inline \
4313- INTEGER_IMPL(I)& INTEGER_IMPL(I)::operator OP( IntegerImpl const &i ) { \
4314- value_ OP i.value_; \
4315- return *this; \
4316+#define ZORBA_INTEGER_OP(OP) \
4317+ template<class T> inline \
4318+ IntegerImpl<T>& IntegerImpl<T>::operator OP( IntegerImpl<T> const &i ) { \
4319+ T::check_value( value_ OP i.value_, true ); \
4320+ return *this; \
4321 }
4322
4323 ZORBA_INTEGER_OP(+=)
4324@@ -818,17 +889,17 @@
4325 ZORBA_INTEGER_OP(%=)
4326 #undef ZORBA_INTEGER_OP
4327
4328-TEMPLATE_DECL(I)
4329-inline INTEGER_IMPL(I)& INTEGER_IMPL(I)::operator/=( IntegerImpl const &i ) {
4330- value_ = ftoi( value_ / i.value_ );
4331+template<class T>
4332+inline IntegerImpl<T>& IntegerImpl<T>::operator/=( IntegerImpl<T> const &i ) {
4333+ value_ = T::check_value( ftoi( value_ / i.value_ ), true );
4334 return *this;
4335 }
4336
4337-#define ZORBA_INTEGER_OP(OP,T) \
4338- TEMPLATE_DECL(I) inline \
4339- INTEGER_IMPL(I)& INTEGER_IMPL(I)::operator OP( T n ) { \
4340- value_ OP make_value_type( n ); \
4341- return *this; \
4342+#define ZORBA_INTEGER_OP(OP,N) \
4343+ template<class T> inline \
4344+ IntegerImpl<T>& IntegerImpl<T>::operator OP( N n ) { \
4345+ T::check_value( value_ OP make_value_type( n ), true ); \
4346+ return *this; \
4347 }
4348
4349 ZORBA_INTEGER_OP(+=,char)
4350@@ -887,11 +958,11 @@
4351 #endif /* ZORBA_WITH_BIG_INTEGER */
4352 #undef ZORBA_INTEGER_OP
4353
4354-#define ZORBA_INTEGER_OP(T) \
4355- TEMPLATE_DECL(I) inline \
4356- INTEGER_IMPL(I)& INTEGER_IMPL(I)::operator/=( T n ) { \
4357- value_ = ftoi( value_ / make_value_type( n ) ); \
4358- return *this; \
4359+#define ZORBA_INTEGER_OP(N) \
4360+ template<class T> inline \
4361+ IntegerImpl<T>& IntegerImpl<T>::operator/=( N n ) { \
4362+ value_ = T::check_value( ftoi( value_ / make_value_type( n ) ), true ); \
4363+ return *this; \
4364 }
4365
4366 ZORBA_INTEGER_OP(char)
4367@@ -911,243 +982,247 @@
4368 #endif /* ZORBA_WITH_BIG_INTEGER */
4369 #undef ZORBA_INTEGER_OP
4370
4371-TEMPLATE_DECL(I)
4372-inline INTEGER_IMPL(I) INTEGER_IMPL(I)::operator-() const {
4373- return INTEGER_IMPL(I)( -value_ );
4374+template<class T>
4375+inline Integer IntegerImpl<T>::operator-() const {
4376+ return Integer( -value_ );
4377 }
4378
4379-TEMPLATE_DECL(I)
4380-inline INTEGER_IMPL(I)& INTEGER_IMPL(I)::operator++() {
4381- ++value_;
4382+template<class T>
4383+inline IntegerImpl<T>& IntegerImpl<T>::operator++() {
4384+ T::check_value( ++value_, true );
4385 return *this;
4386 }
4387
4388-TEMPLATE_DECL(I)
4389-inline INTEGER_IMPL(I) INTEGER_IMPL(I)::operator++(int) {
4390- INTEGER_IMPL(I) const result( *this );
4391- ++value_;
4392+template<class T>
4393+inline IntegerImpl<T> IntegerImpl<T>::operator++(int) {
4394+ IntegerImpl<T> const result( *this );
4395+ T::check_value( ++value_, true );
4396 return result;
4397 }
4398
4399-TEMPLATE_DECL(I)
4400-inline INTEGER_IMPL(I)& INTEGER_IMPL(I)::operator--() {
4401- --value_;
4402+template<class T>
4403+inline IntegerImpl<T>& IntegerImpl<T>::operator--() {
4404+ T::check_value( --value_, true );
4405 return *this;
4406 }
4407
4408-TEMPLATE_DECL(I)
4409-inline INTEGER_IMPL(I) INTEGER_IMPL(I)::operator--(int) {
4410- INTEGER_IMPL(I) const result( *this );
4411- --value_;
4412+template<class T>
4413+inline IntegerImpl<T> IntegerImpl<T>::operator--(int) {
4414+ IntegerImpl<T> const result( *this );
4415+ T::check_value( --value_, true );
4416 return result;
4417 }
4418
4419 ////////// relational operators ///////////////////////////////////////////////
4420
4421-#define ZORBA_INTEGER_OP(OP) \
4422- TEMPLATE_DECL(I) inline \
4423- bool operator OP( INTEGER_IMPL(I) const &i, INTEGER_IMPL(I) const &j ) { \
4424- return i.value_ OP j.value_; \
4425+#define ZORBA_REL_OP(OP) \
4426+ template<class T,class U> inline \
4427+ bool operator OP( IntegerImpl<T> const &i, IntegerImpl<U> const &j ) { \
4428+ return i.value_ OP j.value_; \
4429 }
4430
4431-ZORBA_INTEGER_OP(==)
4432-ZORBA_INTEGER_OP(!=)
4433-ZORBA_INTEGER_OP(< )
4434-ZORBA_INTEGER_OP(<=)
4435-ZORBA_INTEGER_OP(> )
4436-ZORBA_INTEGER_OP(>=)
4437-#undef ZORBA_INTEGER_OP
4438+ZORBA_REL_OP(==)
4439+ZORBA_REL_OP(!=)
4440+ZORBA_REL_OP(< )
4441+ZORBA_REL_OP(<=)
4442+ZORBA_REL_OP(> )
4443+ZORBA_REL_OP(>=)
4444+#undef ZORBA_REL_OP
4445
4446-#define ZORBA_INTEGER_OP(OP,T) \
4447- TEMPLATE_DECL(I) inline \
4448- bool operator OP( INTEGER_IMPL(I) const &i, T n ) { \
4449- return i.value_ OP INTEGER_IMPL(I)::make_value_type( n ); \
4450+#define ZORBA_REL_OP(OP,N) \
4451+ template<class T> inline \
4452+ bool operator OP( IntegerImpl<T> const &i, N n ) { \
4453+ return i.value_ OP IntegerImpl<T>::make_value_type( n ); \
4454 } \
4455 \
4456- TEMPLATE_DECL(I) inline \
4457- bool operator OP( T n, INTEGER_IMPL(I) const &i ) { \
4458- return INTEGER_IMPL(I)::make_value_type( n ) OP i.value_; \
4459+ template<class T> inline \
4460+ bool operator OP( N n, IntegerImpl<T> const &i ) { \
4461+ return IntegerImpl<T>::make_value_type( n ) OP i.value_; \
4462 }
4463
4464-ZORBA_INTEGER_OP(==,char)
4465-ZORBA_INTEGER_OP(!=,char)
4466-ZORBA_INTEGER_OP(< ,char)
4467-ZORBA_INTEGER_OP(<=,char)
4468-ZORBA_INTEGER_OP(> ,char)
4469-ZORBA_INTEGER_OP(>=,char)
4470-ZORBA_INTEGER_OP(==,signed char)
4471-ZORBA_INTEGER_OP(!=,signed char)
4472-ZORBA_INTEGER_OP(< ,signed char)
4473-ZORBA_INTEGER_OP(<=,signed char)
4474-ZORBA_INTEGER_OP(> ,signed char)
4475-ZORBA_INTEGER_OP(>=,signed char)
4476-ZORBA_INTEGER_OP(==,short)
4477-ZORBA_INTEGER_OP(!=,short)
4478-ZORBA_INTEGER_OP(< ,short)
4479-ZORBA_INTEGER_OP(<=,short)
4480-ZORBA_INTEGER_OP(> ,short)
4481-ZORBA_INTEGER_OP(>=,short)
4482-ZORBA_INTEGER_OP(==,int)
4483-ZORBA_INTEGER_OP(!=,int)
4484-ZORBA_INTEGER_OP(< ,int)
4485-ZORBA_INTEGER_OP(<=,int)
4486-ZORBA_INTEGER_OP(> ,int)
4487-ZORBA_INTEGER_OP(>=,int)
4488-ZORBA_INTEGER_OP(==,long)
4489-ZORBA_INTEGER_OP(!=,long)
4490-ZORBA_INTEGER_OP(< ,long)
4491-ZORBA_INTEGER_OP(<=,long)
4492-ZORBA_INTEGER_OP(> ,long)
4493-ZORBA_INTEGER_OP(>=,long)
4494-ZORBA_INTEGER_OP(==,unsigned char)
4495-ZORBA_INTEGER_OP(!=,unsigned char)
4496-ZORBA_INTEGER_OP(< ,unsigned char)
4497-ZORBA_INTEGER_OP(<=,unsigned char)
4498-ZORBA_INTEGER_OP(> ,unsigned char)
4499-ZORBA_INTEGER_OP(>=,unsigned char)
4500-ZORBA_INTEGER_OP(==,unsigned short)
4501-ZORBA_INTEGER_OP(!=,unsigned short)
4502-ZORBA_INTEGER_OP(< ,unsigned short)
4503-ZORBA_INTEGER_OP(<=,unsigned short)
4504-ZORBA_INTEGER_OP(> ,unsigned short)
4505-ZORBA_INTEGER_OP(>=,unsigned short)
4506-ZORBA_INTEGER_OP(==,unsigned int)
4507-ZORBA_INTEGER_OP(!=,unsigned int)
4508-ZORBA_INTEGER_OP(< ,unsigned int)
4509-ZORBA_INTEGER_OP(<=,unsigned int)
4510-ZORBA_INTEGER_OP(> ,unsigned int)
4511-ZORBA_INTEGER_OP(>=,unsigned int)
4512-ZORBA_INTEGER_OP(==,float)
4513-ZORBA_INTEGER_OP(!=,float)
4514-ZORBA_INTEGER_OP(< ,float)
4515-ZORBA_INTEGER_OP(<=,float)
4516-ZORBA_INTEGER_OP(> ,float)
4517-ZORBA_INTEGER_OP(>=,float)
4518-ZORBA_INTEGER_OP(==,double)
4519-ZORBA_INTEGER_OP(!=,double)
4520-ZORBA_INTEGER_OP(< ,double)
4521-ZORBA_INTEGER_OP(<=,double)
4522-ZORBA_INTEGER_OP(> ,double)
4523-ZORBA_INTEGER_OP(>=,double)
4524+ZORBA_REL_OP(==,char)
4525+ZORBA_REL_OP(!=,char)
4526+ZORBA_REL_OP(< ,char)
4527+ZORBA_REL_OP(<=,char)
4528+ZORBA_REL_OP(> ,char)
4529+ZORBA_REL_OP(>=,char)
4530+ZORBA_REL_OP(==,signed char)
4531+ZORBA_REL_OP(!=,signed char)
4532+ZORBA_REL_OP(< ,signed char)
4533+ZORBA_REL_OP(<=,signed char)
4534+ZORBA_REL_OP(> ,signed char)
4535+ZORBA_REL_OP(>=,signed char)
4536+ZORBA_REL_OP(==,short)
4537+ZORBA_REL_OP(!=,short)
4538+ZORBA_REL_OP(< ,short)
4539+ZORBA_REL_OP(<=,short)
4540+ZORBA_REL_OP(> ,short)
4541+ZORBA_REL_OP(>=,short)
4542+ZORBA_REL_OP(==,int)
4543+ZORBA_REL_OP(!=,int)
4544+ZORBA_REL_OP(< ,int)
4545+ZORBA_REL_OP(<=,int)
4546+ZORBA_REL_OP(> ,int)
4547+ZORBA_REL_OP(>=,int)
4548+ZORBA_REL_OP(==,long)
4549+ZORBA_REL_OP(!=,long)
4550+ZORBA_REL_OP(< ,long)
4551+ZORBA_REL_OP(<=,long)
4552+ZORBA_REL_OP(> ,long)
4553+ZORBA_REL_OP(>=,long)
4554+ZORBA_REL_OP(==,unsigned char)
4555+ZORBA_REL_OP(!=,unsigned char)
4556+ZORBA_REL_OP(< ,unsigned char)
4557+ZORBA_REL_OP(<=,unsigned char)
4558+ZORBA_REL_OP(> ,unsigned char)
4559+ZORBA_REL_OP(>=,unsigned char)
4560+ZORBA_REL_OP(==,unsigned short)
4561+ZORBA_REL_OP(!=,unsigned short)
4562+ZORBA_REL_OP(< ,unsigned short)
4563+ZORBA_REL_OP(<=,unsigned short)
4564+ZORBA_REL_OP(> ,unsigned short)
4565+ZORBA_REL_OP(>=,unsigned short)
4566+ZORBA_REL_OP(==,unsigned int)
4567+ZORBA_REL_OP(!=,unsigned int)
4568+ZORBA_REL_OP(< ,unsigned int)
4569+ZORBA_REL_OP(<=,unsigned int)
4570+ZORBA_REL_OP(> ,unsigned int)
4571+ZORBA_REL_OP(>=,unsigned int)
4572+ZORBA_REL_OP(==,float)
4573+ZORBA_REL_OP(!=,float)
4574+ZORBA_REL_OP(< ,float)
4575+ZORBA_REL_OP(<=,float)
4576+ZORBA_REL_OP(> ,float)
4577+ZORBA_REL_OP(>=,float)
4578+ZORBA_REL_OP(==,double)
4579+ZORBA_REL_OP(!=,double)
4580+ZORBA_REL_OP(< ,double)
4581+ZORBA_REL_OP(<=,double)
4582+ZORBA_REL_OP(> ,double)
4583+ZORBA_REL_OP(>=,double)
4584 #ifndef ZORBA_WITH_BIG_INTEGER
4585-ZORBA_INTEGER_OP(==,long long)
4586-ZORBA_INTEGER_OP(!=,long long)
4587-ZORBA_INTEGER_OP(< ,long long)
4588-ZORBA_INTEGER_OP(<=,long long)
4589-ZORBA_INTEGER_OP(> ,long long)
4590-ZORBA_INTEGER_OP(>=,long long)
4591-ZORBA_INTEGER_OP(==,unsigned long)
4592-ZORBA_INTEGER_OP(!=,unsigned long)
4593-ZORBA_INTEGER_OP(< ,unsigned long)
4594-ZORBA_INTEGER_OP(<=,unsigned long)
4595-ZORBA_INTEGER_OP(> ,unsigned long)
4596-ZORBA_INTEGER_OP(>=,unsigned long)
4597-ZORBA_INTEGER_OP(==,unsigned long long)
4598-ZORBA_INTEGER_OP(!=,unsigned long long)
4599-ZORBA_INTEGER_OP(< ,unsigned long long)
4600-ZORBA_INTEGER_OP(<=,unsigned long long)
4601-ZORBA_INTEGER_OP(> ,unsigned long long)
4602-ZORBA_INTEGER_OP(>=,unsigned long long)
4603+ZORBA_REL_OP(==,long long)
4604+ZORBA_REL_OP(!=,long long)
4605+ZORBA_REL_OP(< ,long long)
4606+ZORBA_REL_OP(<=,long long)
4607+ZORBA_REL_OP(> ,long long)
4608+ZORBA_REL_OP(>=,long long)
4609+ZORBA_REL_OP(==,unsigned long)
4610+ZORBA_REL_OP(!=,unsigned long)
4611+ZORBA_REL_OP(< ,unsigned long)
4612+ZORBA_REL_OP(<=,unsigned long)
4613+ZORBA_REL_OP(> ,unsigned long)
4614+ZORBA_REL_OP(>=,unsigned long)
4615+ZORBA_REL_OP(==,unsigned long long)
4616+ZORBA_REL_OP(!=,unsigned long long)
4617+ZORBA_REL_OP(< ,unsigned long long)
4618+ZORBA_REL_OP(<=,unsigned long long)
4619+ZORBA_REL_OP(> ,unsigned long long)
4620+ZORBA_REL_OP(>=,unsigned long long)
4621 #endif /* ZORBA_WITH_BIG_INTEGER */
4622-#undef ZORBA_INTEGER_OP
4623+#undef ZORBA_REL_OP
4624
4625 ////////// miscellaneous //////////////////////////////////////////////////////
4626
4627 #ifdef ZORBA_WITH_BIG_INTEGER
4628
4629-inline int IntegerImpl::compare( IntegerImpl const &i ) const {
4630+template<class T>
4631+inline int IntegerImpl<T>::compare( IntegerImpl<T> const &i ) const {
4632 return value_.compare( i.value_ );
4633 }
4634
4635-inline bool IntegerImpl::is_xs_int() const {
4636+template<class T>
4637+inline bool IntegerImpl<T>::is_xs_int() const {
4638 return value_ >= MAPM::getMinInt32() && value_ <= MAPM::getMaxInt32();
4639 }
4640
4641-inline bool IntegerImpl::is_xs_long() const {
4642+template<class T>
4643+inline bool IntegerImpl<T>::is_xs_long() const {
4644 return value_ >= MAPM::getMinInt64() && value_ <= MAPM::getMaxInt64();
4645 }
4646
4647-inline int IntegerImpl::sign() const {
4648+template<class T>
4649+inline int IntegerImpl<T>::sign() const {
4650 return value_.sign();
4651 }
4652
4653 #else /* ZORBA_WITH_BIG_INTEGER */
4654
4655-template<typename I>
4656-inline int IntegerImpl<I>::compare( IntegerImpl const &i ) const {
4657+template<class T>
4658+inline int IntegerImpl<T>::compare( IntegerImpl<T> const &i ) const {
4659 return value_ < i.value_ ? -1 : value_ > i.value_ ? 1 : 0;
4660 }
4661
4662-template<typename I>
4663-inline uint32_t IntegerImpl<I>::hash() const {
4664+template<class T>
4665+inline uint32_t IntegerImpl<T>::hash() const {
4666 return static_cast<uint32_t>( value_ );
4667 }
4668
4669-template<typename I>
4670-inline bool IntegerImpl<I>::is_cxx_long() const {
4671+template<class T>
4672+inline bool IntegerImpl<T>::is_cxx_long() const {
4673 return ZORBA_IN_RANGE( value_, long );
4674 }
4675
4676-template<typename I>
4677-inline bool IntegerImpl<I>::is_xs_byte() const {
4678+template<class T>
4679+inline bool IntegerImpl<T>::is_xs_byte() const {
4680 return ZORBA_IN_RANGE( value_, xs_byte );
4681 }
4682
4683-template<typename I>
4684-inline bool IntegerImpl<I>::is_xs_int() const {
4685+template<class T>
4686+inline bool IntegerImpl<T>::is_xs_int() const {
4687 return ZORBA_IN_RANGE( value_, xs_int );
4688 }
4689
4690-template<typename I>
4691-inline bool IntegerImpl<I>::is_xs_long() const {
4692+template<class T>
4693+inline bool IntegerImpl<T>::is_xs_long() const {
4694 return ZORBA_IN_RANGE( value_, xs_long );
4695 }
4696
4697-template<typename I>
4698-inline bool IntegerImpl<I>::is_xs_short() const {
4699+template<class T>
4700+inline bool IntegerImpl<T>::is_xs_short() const {
4701 return ZORBA_IN_RANGE( value_, xs_short );
4702 }
4703
4704-template<typename I>
4705-inline bool IntegerImpl<I>::is_xs_unsignedByte() const {
4706+template<class T>
4707+inline bool IntegerImpl<T>::is_xs_unsignedByte() const {
4708 return ZORBA_IN_RANGE( value_, xs_unsignedByte );
4709 }
4710
4711-template<typename I>
4712-inline bool IntegerImpl<I>::is_xs_unsignedInt() const {
4713+template<class T>
4714+inline bool IntegerImpl<T>::is_xs_unsignedInt() const {
4715 return ZORBA_IN_RANGE( value_, xs_unsignedInt );
4716 }
4717
4718-template<typename I>
4719-inline bool IntegerImpl<I>::is_xs_unsignedLong() const {
4720+template<class T>
4721+inline bool IntegerImpl<T>::is_xs_unsignedLong() const {
4722 return ZORBA_IN_RANGE( value_, xs_unsignedLong );
4723 }
4724
4725-template<typename I>
4726-inline bool IntegerImpl<I>::is_xs_unsignedShort() const {
4727+template<class T>
4728+inline bool IntegerImpl<T>::is_xs_unsignedShort() const {
4729 return ZORBA_IN_RANGE( value_, xs_unsignedShort );
4730 }
4731
4732-template<typename I>
4733-inline int IntegerImpl<I>::sign() const {
4734+template<class T>
4735+inline int IntegerImpl<T>::sign() const {
4736 return ztd::lt0( value_ ) ? -1 : value_ > 0 ? 1 : 0;
4737 }
4738
4739 #endif /* ZORBA_WITH_BIG_INTEGER */
4740
4741-TEMPLATE_DECL(I) inline
4742-TEMPLATE_TYPENAME INTEGER_IMPL(I)::value_type& INTEGER_IMPL(I)::value() {
4743- return value_;
4744-}
4745-
4746-TEMPLATE_DECL(I) inline
4747-TEMPLATE_TYPENAME INTEGER_IMPL(I)::value_type const&
4748-INTEGER_IMPL(I)::value() const {
4749- return value_;
4750-}
4751-
4752-TEMPLATE_DECL(I)
4753-inline std::ostream& operator<<( std::ostream &os, INTEGER_IMPL(I) const &i ) {
4754+template<class T>
4755+inline typename IntegerImpl<T>::value_type& IntegerImpl<T>::value() {
4756+ return value_;
4757+}
4758+
4759+template<class T>
4760+inline typename IntegerImpl<T>::value_type const&
4761+IntegerImpl<T>::value() const {
4762+ return value_;
4763+}
4764+
4765+template<class T>
4766+inline std::ostream& operator<<( std::ostream &os, IntegerImpl<T> const &i ) {
4767 return os << i.toString();
4768 }
4769
4770@@ -1155,11 +1230,6 @@
4771
4772 } // namespace zorba
4773
4774-#undef TEMPLATE_DECL
4775-#undef INTEGER_IMPL
4776-#undef INTEGER_IMPL_LL
4777-#undef INTEGER_IMPL_ULL
4778-
4779 #endif // ZORBA_INTEGER_H
4780 /*
4781 * Local variables:
4782
4783=== modified file 'src/zorbatypes/numconversions.cpp'
4784--- src/zorbatypes/numconversions.cpp 2013-03-22 19:06:44 +0000
4785+++ src/zorbatypes/numconversions.cpp 2013-05-08 15:05:31 +0000
4786@@ -15,11 +15,18 @@
4787 */
4788 #include "stdafx.h"
4789
4790+// standard
4791 #include <stdexcept>
4792
4793+// Zorba
4794 #include "common/common.h"
4795 #include "util/string_util.h"
4796-#include "zorbatypes/numconversions.h"
4797+
4798+// local
4799+#include "decimal.h"
4800+#include "floatimpl.h"
4801+#include "integer.h"
4802+#include "numconversions.h"
4803
4804 namespace zorba {
4805
4806
4807=== modified file 'src/zorbatypes/numconversions.h'
4808--- src/zorbatypes/numconversions.h 2013-03-22 19:06:44 +0000
4809+++ src/zorbatypes/numconversions.h 2013-05-08 15:05:31 +0000
4810@@ -64,6 +64,7 @@
4811 */
4812 xs_long to_xs_long( xs_integer const &i );
4813
4814+#if 0
4815 #ifndef ZORBA_WITH_BIG_INTEGER
4816 /**
4817 * Converts an \c xs:nonNegativeInteger value to an \c xs:long.
4818@@ -75,6 +76,7 @@
4819 */
4820 xs_long to_xs_long( xs_nonNegativeInteger const &i );
4821 #endif /* ZORBA_WITH_BIG_INTEGER */
4822+#endif
4823
4824 /**
4825 * Converts an \c xs:integer value to an \c xs:unsignedByte.
4826
4827=== added file 'src/zorbatypes/numeric_types.cpp'
4828--- src/zorbatypes/numeric_types.cpp 1970-01-01 00:00:00 +0000
4829+++ src/zorbatypes/numeric_types.cpp 2013-05-08 15:05:31 +0000
4830@@ -0,0 +1,82 @@
4831+/*
4832+ * Copyright 2006-2008 The FLWOR Foundation.
4833+ *
4834+ * Licensed under the Apache License, Version 2.0 (the "License");
4835+ * you may not use this file except in compliance with the License.
4836+ * You may obtain a copy of the License at
4837+ *
4838+ * http://www.apache.org/licenses/LICENSE-2.0
4839+ *
4840+ * Unless required by applicable law or agreed to in writing, software
4841+ * distributed under the License is distributed on an "AS IS" BASIS,
4842+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4843+ * See the License for the specific language governing permissions and
4844+ * limitations under the License.
4845+ */
4846+
4847+#include "stdafx.h"
4848+
4849+// local
4850+#include "decimal.h"
4851+#include "floatimpl.h"
4852+#include "integer.h"
4853+
4854+using namespace std;
4855+
4856+namespace zorba {
4857+
4858+///////////////////////////////////////////////////////////////////////////////
4859+
4860+template<class NumericType>
4861+NumericType const& numeric_consts<NumericType>::zero() {
4862+ static NumericType const n(0);
4863+ return n;
4864+}
4865+
4866+template<class NumericType>
4867+NumericType const& numeric_consts<NumericType>::one() {
4868+ static NumericType const n(1);
4869+ return n;
4870+}
4871+
4872+template<class NumericType>
4873+NumericType const& numeric_consts<NumericType>::neg_one() {
4874+ static NumericType const n(-1);
4875+ return n;
4876+}
4877+
4878+// instantiate non-special cases
4879+template class numeric_consts<Decimal>;
4880+template class numeric_consts<Double>;
4881+template class numeric_consts<Float>;
4882+template class numeric_consts<Integer>;
4883+
4884+NonNegativeInteger const& numeric_consts<NonNegativeInteger>::zero() {
4885+ static NonNegativeInteger const n(0);
4886+ return n;
4887+}
4888+
4889+NonNegativeInteger const& numeric_consts<NonNegativeInteger>::one() {
4890+ static NonNegativeInteger const n(1);
4891+ return n;
4892+}
4893+
4894+NonPositiveInteger const& numeric_consts<NonPositiveInteger>::zero() {
4895+ static NonPositiveInteger const n(0);
4896+ return n;
4897+}
4898+
4899+NonPositiveInteger const& numeric_consts<NonPositiveInteger>::neg_one() {
4900+ static NonPositiveInteger const n(-1);
4901+ return n;
4902+}
4903+
4904+PositiveInteger const& numeric_consts<PositiveInteger>::one() {
4905+ static PositiveInteger const n(1);
4906+ return n;
4907+}
4908+
4909+///////////////////////////////////////////////////////////////////////////////
4910+
4911+} // namespace zorba
4912+/* vim:set et sw=2 ts=2: */
4913
4914=== added file 'src/zorbatypes/numeric_types.h'
4915--- src/zorbatypes/numeric_types.h 1970-01-01 00:00:00 +0000
4916+++ src/zorbatypes/numeric_types.h 2013-05-08 15:05:31 +0000
4917@@ -0,0 +1,106 @@
4918+/*
4919+ * Copyright 2006-2008 The FLWOR Foundation.
4920+ *
4921+ * Licensed under the Apache License, Version 2.0 (the "License");
4922+ * you may not use this file except in compliance with the License.
4923+ * You may obtain a copy of the License at
4924+ *
4925+ * http://www.apache.org/licenses/LICENSE-2.0
4926+ *
4927+ * Unless required by applicable law or agreed to in writing, software
4928+ * distributed under the License is distributed on an "AS IS" BASIS,
4929+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4930+ * See the License for the specific language governing permissions and
4931+ * limitations under the License.
4932+ */
4933+
4934+#pragma once
4935+#ifndef ZORBA_NUMERIC_CONSTS_H
4936+#define ZORBA_NUMERIC_CONSTS_H
4937+
4938+namespace zorba {
4939+
4940+///////////////////////////////////////////////////////////////////////////////
4941+
4942+class integer_traits;
4943+class negative_traits;
4944+class nonNegative_traits;
4945+class nonPositive_traits;
4946+class positive_traits;
4947+
4948+template<class T> class IntegerImpl;
4949+typedef IntegerImpl<integer_traits> Integer;
4950+typedef IntegerImpl<negative_traits> NegativeInteger;
4951+typedef IntegerImpl<nonNegative_traits> NonNegativeInteger;
4952+typedef IntegerImpl<nonPositive_traits> NonPositiveInteger;
4953+typedef IntegerImpl<positive_traits> PositiveInteger;
4954+
4955+class Decimal;
4956+
4957+template<typename F> class FloatImpl;
4958+typedef FloatImpl<float> Float;
4959+typedef FloatImpl<double> Double;
4960+
4961+/**
4962+ * This contains references to singleton objects having constant values for the
4963+ * often-used numeric constants -1, 0, and +1.
4964+ *
4965+ * @tparam NumericType One of Integer, NegativeInteger, NonNegativeInteger,
4966+ * NonPositiveInteger, PositiveInteger, Decimal, Float, or Double.
4967+ */
4968+template<class NumericType>
4969+struct numeric_consts {
4970+ static NumericType const& neg_one();
4971+ static NumericType const& zero();
4972+ static NumericType const& one();
4973+};
4974+
4975+/**
4976+ * Specialization for NegativeInteger that has only a reference to a singleton
4977+ * object having the constant value -1.
4978+ */
4979+template<>
4980+struct numeric_consts<NegativeInteger> {
4981+ static NegativeInteger const& neg_one();
4982+};
4983+
4984+/**
4985+ * Specialization for NonNegativeInteger that has only references to the
4986+ * singleton objects having the constant values 0 and 1.
4987+ */
4988+template<>
4989+struct numeric_consts<NonNegativeInteger> {
4990+ static NonNegativeInteger const& zero();
4991+ static NonNegativeInteger const& one();
4992+};
4993+
4994+/**
4995+ * Specialization for NonPositiveInteger that has only references to the
4996+ * singleton objects having the constant values -1 and 0.
4997+ */
4998+template<>
4999+struct numeric_consts<NonPositiveInteger> {
5000+ static NonPositiveInteger const& neg_one();
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches