Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Toolbox/GenericToolbox.h @ 1861:9290d2916150
SeriesList: order series by SeriesNumber + hide non displayable series
author | Alain Mazy <am@osimis.io> |
---|---|
date | Tue, 21 Sep 2021 12:44:40 +0200 |
parents | b6a6ad64192a |
children | 3889ae96d2e9 |
rev | line source |
---|---|
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
1 /** |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
2 * Stone of Orthanc |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
1739
9ac2a65d4172
upgrade to year 2021
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1679
diff
changeset
|
5 * Copyright (C) 2017-2021 Osimis S.A., Belgium |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
6 * |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public License |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
9 * as published by the Free Software Foundation, either version 3 of |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
10 * the License, or (at your option) any later version. |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
11 * |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, but |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
13 * WITHOUT ANY WARRANTY; without even the implied warranty of |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
15 * Lesser General Public License for more details. |
1596
4fb8fdf03314
removed annoying whitespace
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1591
diff
changeset
|
16 * |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
18 * License along with this program. If not, see |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
19 * <http://www.gnu.org/licenses/>. |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
20 **/ |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
21 |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
22 #pragma once |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
23 |
1455
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1331
diff
changeset
|
24 #include <Compatibility.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1331
diff
changeset
|
25 #include <OrthancException.h> |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
26 #include <Logging.h> |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
27 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
28 #include "LinearAlgebra.h" |
1328
fd616c4a5904
Added mechanism to prevent callbacks from being sent on dead WebAssemblyViewport objects
Benjamin Golinvaux <bgo@osimis.io>
parents:
1306
diff
changeset
|
29 |
fd616c4a5904
Added mechanism to prevent callbacks from being sent on dead WebAssemblyViewport objects
Benjamin Golinvaux <bgo@osimis.io>
parents:
1306
diff
changeset
|
30 #include <boost/shared_ptr.hpp> |
fd616c4a5904
Added mechanism to prevent callbacks from being sent on dead WebAssemblyViewport objects
Benjamin Golinvaux <bgo@osimis.io>
parents:
1306
diff
changeset
|
31 |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
32 #include <string> |
1101
141593f1aa88
fix build on ubuntu
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1080
diff
changeset
|
33 #include <stdint.h> |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
34 #include <math.h> |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
35 |
1328
fd616c4a5904
Added mechanism to prevent callbacks from being sent on dead WebAssemblyViewport objects
Benjamin Golinvaux <bgo@osimis.io>
parents:
1306
diff
changeset
|
36 #include <memory> |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
37 #include <vector> |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
38 |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
39 namespace OrthancStone |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
40 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
41 namespace GenericToolbox |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
42 { |
1306
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
43 /** |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
44 Fast floating point string validation. |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
45 No trimming applied, so the input must match regex |
1306
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
46 /^[-]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?$/ |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
47 The following are allowed as edge cases: "" and "-" |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
48 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
49 The parsing always stops if encountering either 0 or the stopChar |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
50 |
1306
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
51 */ |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
52 inline bool LegitDoubleString(const char* text, char stopChar = 0) |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
53 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
54 const char* p = text; |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
55 if (*p == '-') |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
56 p++; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
57 size_t period = 0; |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
58 while ((*p != 0) && (*p != stopChar) && (*p != ' ') && (*p != '\t')) |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
59 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
60 if (*p >= '0' && *p <= '9') |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
61 ++p; |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
62 else if (*p == '.') |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
63 { |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
64 if (period > 0) |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
65 return false; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
66 else |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
67 period++; |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
68 ++p; |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
69 } |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
70 else if (*p == 'e' || *p == 'E') |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
71 { |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
72 ++p; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
73 if (*p == '-' || *p == '+') |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
74 ++p; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
75 // "e+"/"E+" "e-"/"E-" or "e"/"E" must be followed by a number |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
76 if (!(*p >= '0' && *p <= '9')) |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
77 return false; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
78 |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
79 // these must be the last in the string |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
80 while (*p >= '0' && *p <= '9') |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
81 ++p; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
82 |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
83 // after that, there can only be spaces |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
84 while ((*p != 0) && (*p != stopChar)) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
85 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
86 if ((*p != ' ') && (*p != '\t')) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
87 return false; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
88 ++p; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
89 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
90 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
91 return ((*p == 0) || (*p == stopChar)); |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
92 } |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
93 else |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
94 { |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
95 return false; |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
96 } |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
97 } |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
98 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
99 // we only accept trailing whitespace |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
100 while ((*p != 0) && (*p != stopChar)) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
101 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
102 if( (*p != ' ') && (*p != '\t')) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
103 return false; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
104 ++p; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
105 } |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
106 return true; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
107 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
108 |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
109 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
110 |
1306
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
111 /** |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
112 Fast integer string validation. |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
113 No trimming applied, so the input must match regex /^-?[0-9]*$/ |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
114 The following are allowed as edge cases: "" and "-" |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
115 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
116 The parsing always stops if encountering either 0 or the stopChar |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
117 |
1306
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
118 */ |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
119 inline bool LegitIntegerString(const char* text, char stopChar = 0) |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
120 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
121 const char* p = text; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
122 if (*p == '-') |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
123 p++; |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
124 while ((*p != 0) && (*p != stopChar)) |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
125 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
126 if (*p >= '0' && *p <= '9') |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
127 ++p; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
128 else |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
129 return false; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
130 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
131 return true; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
132 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
133 |
1306
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
134 |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
135 static const double FRAC_FACTORS[] = |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
136 { |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
137 1.0, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
138 0.1, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
139 0.01, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
140 0.001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
141 0.0001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
142 0.00001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
143 0.000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
144 0.0000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
145 0.00000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
146 0.000000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
147 0.0000000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
148 0.00000000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
149 0.000000000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
150 0.0000000000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
151 0.00000000000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
152 0.000000000000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
153 0.0000000000000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
154 0.00000000000000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
155 0.000000000000000001, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
156 0.0000000000000000001 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
157 }; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
158 static const size_t FRAC_FACTORS_LEN = sizeof(FRAC_FACTORS) / sizeof(double); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
159 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
160 /** |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
161 Technical version of StringToDouble, meant for parsing bigger strings in-place. |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
162 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
163 Only works for dot decimal numbers without digit separation |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
164 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
165 The parsing stops when encountering EITHER \x00 or stopChar. |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
166 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
167 Instead of filling r and returning true if number is legit, it fills r then |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
168 returns the number of parsed characters (NOT including the end character (which |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
169 can be zero, since an empty string is an allowed edge case) BUT including the trailing |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
170 spaces), or -1 if a parsing error occurred. |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
171 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
172 Please note that if stopChar is a number, a minus sign, the decimal separator |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
173 or the letters e and E, the behavior is UNDEFINED!!! |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
174 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
175 In order to allow the containing string not to be space-stripped: |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
176 - Spaces and tabs are ignored if they occur before the scientific notation e or E letter |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
177 - Spaces and tabs are ignored between the end of the number and the \x00 or stopChar |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
178 - Spaces and tabs cause errors anywhere else |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
179 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
180 It is up to the caller to detect whether a successful parsing has reached the |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
181 terminator (\x00) or stopChar. |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
182 |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
183 In case of an error returned, in a parsing scenario where multiple numbers |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
184 are to be read in a bigger surrounding string, it is up to the caller to |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
185 recover from the error by advancing the read pointer to the next character, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
186 if desirable. |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
187 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
188 Example: |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
189 ------ |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
190 const char* s = "0.0/.123/3/12.5//-43.1"; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
191 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
192 int size; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
193 double r; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
194 const char* p = s; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
195 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
196 size = StringToDoubleEx(r, p, '/'); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
197 // --> |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
198 // r = 0 and size = 3 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
199 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
200 p += size + 1; // gobble the separator |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
201 size = StringToDoubleEx(r, p, '/'); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
202 // --> |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
203 // r = 0.123 and size = 4 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
204 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
205 p += size + 1; // gobble the separator |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
206 size = StringToDoubleEx(r, p, '/'); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
207 // --> |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
208 // r = 3.0 and size = 1 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
209 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
210 p += size + 1; // gobble the separator |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
211 size = StringToDoubleEx(r, p, '/'); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
212 // --> |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
213 // r = 12.5 and size = 3 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
214 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
215 p += size + 1; // gobble the separator |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
216 size = StringToDoubleEx(r, p, '/'); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
217 // --> |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
218 // r = 0 and size = 0 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
219 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
220 p += size + 1; // gobble the separator |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
221 size = StringToDoubleEx(r, p, '/'); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
222 // --> |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
223 // r = 0 and size = 0 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
224 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
225 p += size |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
226 if(p == 0) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
227 ...stop parsing! |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
228 */ |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
229 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
230 inline int32_t StringToDoubleEx(double& r, const char* text, char stopChar = 0) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
231 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
232 if (!LegitDoubleString(text,stopChar)) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
233 return -1; |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
234 |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
235 r = 0.0; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
236 double neg = 1.0; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
237 const char* p = text; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
238 |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
239 if (*p == '-') |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
240 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
241 neg = -1.0; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
242 ++p; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
243 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
244 // 12345.67890 |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
245 while (*p >= '0' && *p <= '9') |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
246 { |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
247 r = (r * 10.0) + (*p - '0'); // 1 12 123 123 12345 |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
248 ++p; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
249 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
250 if (*p == '.') |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
251 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
252 double f = 0.0; |
1192 | 253 size_t n = 1; |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
254 ++p; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
255 while (*p >= '0' && *p <= '9' && n < FRAC_FACTORS_LEN) |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
256 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
257 f += (*p - '0') * FRAC_FACTORS[n]; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
258 ++p; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
259 ++n; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
260 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
261 r += f; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
262 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
263 r *= neg; |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
264 |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
265 // skip the remaining numbers until we reach not-a-digit (either the |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
266 // end of the string OR the scientific notation symbol) |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
267 // spaces are skipped in this phase here |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
268 while ((*p >= '0' && *p <= '9') || *p == ' ' || *p == '\t') |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
269 ++p; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
270 |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
271 if ( (*p == 0) || (*p == stopChar)) |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
272 { |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
273 return static_cast<int32_t>(p - text); |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
274 } |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
275 else if ((*p == 'e') || (*p == 'E')) |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
276 { |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
277 // process the scientific notation |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
278 double sign; // no init is safe (read below) |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
279 ++p; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
280 if (*p == '-') |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
281 { |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
282 sign = -1.0; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
283 // point to first number |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
284 ++p; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
285 } |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
286 else if (*p == '+') |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
287 { |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
288 sign = 1.0; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
289 // point to first number |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
290 ++p; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
291 } |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
292 else if (*p >= '0' && *p <= '9') |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
293 { |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
294 sign = 1.0; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
295 } |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
296 else |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
297 { |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
298 // only a sign char or a number is allowed |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
299 return -1; |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
300 } |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
301 // now p points to the absolute value of the exponent |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
302 double exp = 0; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
303 while (*p >= '0' && *p <= '9') |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
304 { |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
305 exp = (exp * 10.0) + static_cast<double>(*p - '0'); // 1 12 123 123 12345 |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
306 ++p; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
307 } |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
308 // now we have our exponent. put a sign on it. |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
309 exp *= sign; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
310 double scFac = ::pow(10.0, exp); |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
311 r *= scFac; |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
312 |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
313 // skip the trailing spaces |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
314 while (*p == ' ' || *p == '\t') |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
315 ++p; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
316 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
317 // only allowed symbol here is EOS or stopChar |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
318 if ((*p == 0) || (*p == stopChar)) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
319 return static_cast<int32_t>(p - text); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
320 else |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
321 return -1; |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
322 } |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
323 else |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
324 { |
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
325 // not allowed |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
326 return -1; |
1166
f68da12e852b
Added scientific notation support to StringToDouble
Benjamin Golinvaux <bgo@osimis.io>
parents:
1101
diff
changeset
|
327 } |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
328 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
329 |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
330 /** |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
331 Fast string --> double conversion. |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
332 Must pass the LegitDoubleString test |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
333 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
334 String to doubles with at most 18 digits |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
335 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
336 Returns true if okay and false if failed. |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
337 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
338 The end-of-substring is character \x00 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
339 */ |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
340 inline bool StringToDouble(double& r, const char* text) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
341 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
342 int32_t size = StringToDoubleEx(r, text, 0); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
343 return (size != -1); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
344 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
345 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
346 /** |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
347 See main overload |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
348 */ |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
349 inline bool StringToDouble(double& r, const std::string& text) |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
350 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
351 return StringToDouble(r, text.c_str()); |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
352 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
353 |
1306
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
354 /** |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
355 Fast string to integer conversion. Leading zeroes and minus are accepted, |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
356 but a leading + sign is NOT. |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
357 Must pass the LegitIntegerString function test. |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
358 In addition, an empty string (or lone minus sign) yields 0. |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
359 */ |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
360 |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
361 template<typename T> |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
362 inline bool StringToInteger(T& r, const char* text) |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
363 { |
1306
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
364 if (!LegitIntegerString(text)) |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
365 return false; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
366 |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
367 r = 0; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
368 T neg = 1; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
369 const char* p = text; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
370 |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
371 if (*p == '-') |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
372 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
373 neg = -1; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
374 ++p; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
375 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
376 while (*p >= '0' && *p <= '9') |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
377 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
378 r = (r * 10) + static_cast<T>(*p - '0'); // 1 12 123 123 12345 |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
379 ++p; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
380 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
381 r *= neg; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
382 if (*p == 0) |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
383 return true; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
384 else |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
385 return false; |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
386 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
387 |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
388 template<typename T> |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
389 inline bool StringToInteger(T& r, const std::string& text) |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
390 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
391 return StringToInteger<T>(r, text.c_str()); |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
392 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
393 |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
394 /** |
1306
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
395 if input is "rgb(12,23,255)" --> function fills `red`, `green` and `blue` and returns true |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
396 else ("everything else") --> function returns false and leaves all values untouched |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
397 */ |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
398 bool GetRgbValuesFromString(uint8_t& red, uint8_t& green, uint8_t& blue, const char* text); |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
399 |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
400 /** |
1306
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
401 See main overload |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
402 */ |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
403 inline bool GetRgbValuesFromString(uint8_t& red, uint8_t& green, uint8_t& blue, const std::string& text) |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
404 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
405 return GetRgbValuesFromString(red, green, blue, text.c_str()); |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
406 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
407 |
1306
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
408 /** |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
409 Same as GetRgbValuesFromString |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
410 */ |
1328
fd616c4a5904
Added mechanism to prevent callbacks from being sent on dead WebAssemblyViewport objects
Benjamin Golinvaux <bgo@osimis.io>
parents:
1306
diff
changeset
|
411 bool GetRgbaValuesFromString(uint8_t& red, |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
412 uint8_t& green, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
413 uint8_t& blue, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
414 uint8_t& alpha, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
415 const char* text); |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
416 |
1306
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
417 /** |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
418 Same as GetRgbValuesFromString |
fef1ec42a7db
Some docs + headers added to CMake for easier VS browsing + tiny predecl
Benjamin Golinvaux <bgo@osimis.io>
parents:
1279
diff
changeset
|
419 */ |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
420 inline bool GetRgbaValuesFromString(uint8_t& red, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
421 uint8_t& green, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
422 uint8_t& blue, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
423 uint8_t& alpha, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
424 const std::string& text) |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
425 { |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
426 return GetRgbaValuesFromString(red, green, blue, alpha, text.c_str()); |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
427 } |
1591
5887a4f8594b
moving platform-specific files out of the "OrthancStone" folder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1512
diff
changeset
|
428 |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
429 |
1591
5887a4f8594b
moving platform-specific files out of the "OrthancStone" folder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1512
diff
changeset
|
430 /** |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
431 This method could have been called StripSpacesAndChangeToLower but we might want to |
1591
5887a4f8594b
moving platform-specific files out of the "OrthancStone" folder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1512
diff
changeset
|
432 add some UUID validation to the argument |
5887a4f8594b
moving platform-specific files out of the "OrthancStone" folder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1512
diff
changeset
|
433 */ |
5887a4f8594b
moving platform-specific files out of the "OrthancStone" folder
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1512
diff
changeset
|
434 void NormalizeUuid(std::string& uuid); |
1748
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
435 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
436 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
437 inline void FastTokenizeString(std::vector<std::string>& result, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
438 const std::string& value, |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
439 char separator) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
440 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
441 size_t countSeparators = 0; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
442 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
443 for (size_t i = 0; i < value.size(); i++) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
444 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
445 if (value[i] == separator) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
446 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
447 countSeparators++; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
448 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
449 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
450 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
451 result.clear(); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
452 result.reserve(countSeparators + 1); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
453 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
454 std::string currentItem; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
455 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
456 for (size_t i = 0; i < value.size(); i++) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
457 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
458 if (value[i] == separator) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
459 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
460 result.push_back(currentItem); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
461 currentItem.clear(); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
462 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
463 else |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
464 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
465 currentItem.push_back(value[i]); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
466 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
467 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
468 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
469 result.push_back(currentItem); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
470 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
471 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
472 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
473 inline std::string FastStripSpaces(const std::string& source) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
474 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
475 size_t first = 0; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
476 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
477 while (first < source.length() && |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
478 isspace(source[first])) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
479 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
480 first++; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
481 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
482 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
483 if (first == source.length()) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
484 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
485 // String containing only spaces |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
486 return ""; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
487 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
488 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
489 size_t last = source.length(); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
490 while (last > first && |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
491 isspace(source[last - 1])) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
492 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
493 last--; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
494 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
495 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
496 assert(first <= last); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
497 return source.substr(first, last - first); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
498 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
499 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
500 /** |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
501 Return the raw numbers of occurrences of `separator` in s (starting at s up to \x00) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
502 */ |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
503 inline size_t GetCharCount(const char* s, const char separator) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
504 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
505 const char* p = s; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
506 size_t sepCount = 0; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
507 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
508 while (*p != 0) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
509 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
510 if(*p == separator) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
511 sepCount++; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
512 ++p; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
513 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
514 return sepCount; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
515 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
516 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
517 inline bool FastParseVector(Vector& target, const std::string& value) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
518 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
519 const char* s = value.c_str(); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
520 const char SEP = '\\'; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
521 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
522 size_t sepCount = GetCharCount(s, SEP); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
523 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
524 size_t itemCount = sepCount + 1; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
525 target.resize(itemCount); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
526 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
527 while (*s == ' ' || *s == '\t') |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
528 ++s; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
529 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
530 const char* p = s; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
531 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
532 double r; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
533 for (size_t i = 0; i < itemCount; i++) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
534 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
535 int32_t numberCharCount = StringToDoubleEx(r, p, SEP); |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
536 if (numberCharCount == -1) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
537 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
538 LOG(ERROR) << "Parsing error for vector \"" << value << "\". Current position (0-based) = " << i; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
539 return false; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
540 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
541 p += numberCharCount; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
542 if (*p == 0) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
543 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
544 // if we are at the end of the string, it means we have processed the last character |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
545 // let's check this. this is a small price to pay for a useful check |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
546 if (i != (itemCount - 1)) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
547 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
548 LOG(ERROR) << "Parsing error for vector \"" << value << "\". Reached end of the string without consuming the right # of items! Current position (0-based) = " << i; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
549 return false; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
550 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
551 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
552 else |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
553 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
554 if (*p != SEP) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
555 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
556 LOG(ERROR) << "Parsing error for vector \"" << value << "\". Character past end of number Reached end of the string without consuming the right # of items! Current position (0-based) = " << i << " and r = " << r; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
557 return false; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
558 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
559 if (i == (itemCount - 1)) |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
560 { |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
561 LOG(ERROR) << "Parsing error for vector \"" << value << "\". Reached end of the vector too soon. Current position (0-based) = " << i << " and r = " << r; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
562 return false; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
563 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
564 // advance to next number |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
565 p += 1; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
566 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
567 target[i] = r; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
568 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
569 return true; |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
570 } |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
571 |
b6a6ad64192a
FastParseVector : manually written code to parse strings like 3.1315\-1.2e12\2344.5\123 into boost::numeric::ublas::vector<double> + tests
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
572 |
1080
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
573 } |
287ec78f63b4
GenericToolbox (fast c-string --> double or integer) + refactoring to be able
Benjamin Golinvaux <bgo@osimis.io>
parents:
diff
changeset
|
574 } |