Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: compiled/String.h

Issue 29548581: Issue 4128, 5138 - Add Parser and Serializer implemented in C++ Base URL: https://github.com/adblockplus/adblockpluscore.git
Patch Set: Created Sept. 18, 2017, 5:23 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | compiled/String.cpp » ('j') | compiled/String.cpp » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>, 2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-present eyeo GmbH 3 * Copyright (C) 2006-present eyeo GmbH
4 * 4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify 5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as 6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Adblock Plus is distributed in the hope that it will be useful, 9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details. 12 * GNU General Public License for more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License 14 * You should have received a copy of the GNU General Public License
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
16 */ 16 */
17 17
18 #pragma once 18 #pragma once
19 19
20 #include <algorithm> 20 #include <algorithm>
21 #include <cstddef> 21 #include <cstddef>
22 #include <cstring> 22 #include <cstring>
23 #include <type_traits> 23 #include <type_traits>
24 #include <utility>
24 25
25 #include "debug.h" 26 #include "debug.h"
26 #include "library.h" 27 #include "library.h"
27 28
28 inline void String_assert_writable(bool isWritable); 29 inline void String_assert_writable(bool isWritable);
29 30
30 class String 31 class String
31 { 32 {
32 friend class DependentString; 33 friend class DependentString;
33 friend class OwnedString; 34 friend class OwnedString;
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 // This should be more efficient with a lookup table but I couldn't measur e 185 // This should be more efficient with a lookup table but I couldn't measur e
185 // any performance difference. 186 // any performance difference.
186 if (currChar >= u'A' && currChar <= u'Z') 187 if (currChar >= u'A' && currChar <= u'Z')
187 mBuf[i] = currChar + u'a' - u'A'; 188 mBuf[i] = currChar + u'a' - u'A';
188 else if (currChar >= 128) 189 else if (currChar >= 128)
189 { 190 {
190 mBuf[i] = CharToLower(currChar); 191 mBuf[i] = CharToLower(currChar);
191 } 192 }
192 } 193 }
193 } 194 }
195
196 int64_t toInt64() const
197 {
198 size_type len = length();
199 if (len == 0)
200 return 0;
Wladimir Palant 2017/12/21 10:30:36 What about using StringScanner so that we won't ne
201 size_type pos = 0;
202 bool negative = mBuf[0] == u'-';
203 if (negative)
204 {
205 ++pos;
206 }
207 int64_t result = 0;
208 for (; pos < len && mBuf[pos] >= u'0' && mBuf[pos] <= u'9'; ++pos)
209 {
210 result *= 10;
211 result += mBuf[pos] - u'0';
212 }
hub 2017/11/22 15:40:12 No overflow checking? int64_t is quite a lot of s
hub 2017/11/30 21:35:37 std::numeric_limits<int64_t>::digit10 is the value
213 return negative ? -result : result;
214 }
215
216 uint64_t toUInt64() const
Wladimir Palant 2017/12/21 10:30:36 Nit: This should be called toUint64().
217 {
218 uint64_t result = 0;
219 size_type len = length();
220 for (size_type pos = 0; pos < len && mBuf[pos] >= u'0' && mBuf[pos] <= u'9'; ++pos)
221 {
222 result *= 10;
223 result += mBuf[pos] - u'0';
224 }
225 return result;
226 }
Wladimir Palant 2017/12/21 10:30:36 General note: this should be ok as a first iterati
194 }; 227 };
195 228
196 class DependentString : public String 229 class DependentString : public String
197 { 230 {
198 public: 231 public:
199 explicit DependentString() 232 explicit DependentString()
200 : String(nullptr, 0, INVALID) 233 : String(nullptr, 0, INVALID)
201 { 234 {
202 } 235 }
203 236
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 if (negative) 431 if (negative)
399 mBuf[pos++] = '-'; 432 mBuf[pos++] = '-';
400 433
401 for (int i = size - 1; i >= 0; i--) 434 for (int i = size - 1; i >= 0; i--)
402 { 435 {
403 mBuf[pos + i] = '0' + (num % 10); 436 mBuf[pos + i] = '0' + (num % 10);
404 num /= 10; 437 num /= 10;
405 } 438 }
406 } 439 }
407 }; 440 };
441
442 template<typename Type>
443 inline Type AdaptValue(const String& value);
hub 2017/11/22 15:40:12 I would have called this "lexical_cast<>" probably
Wladimir Palant 2017/12/21 10:30:36 Can't we have that as an instance method instead?
444
445 template<>
446 inline bool AdaptValue<bool>(const String& value)
447 {
448 return value == u"true"_str;
449 }
450 template<>
451 inline int AdaptValue<int>(const String& value)
452 {
453 return static_cast<int>(value.toInt64());
454 }
455 template<>
456 inline uint64_t AdaptValue<uint64_t>(const String& value)
457 {
458 return value.toUInt64();
459 }
460 template<>
461 inline OwnedString AdaptValue<OwnedString>(const String& value)
462 {
463 return OwnedString{value};
464 }
465
466 DependentString TrimSpaces(const String& value);
467
468 inline std::pair<DependentString, DependentString> SplitString(const String& val ue, String::size_type separatorPos)
469 {
470 const auto secondBeginPos = separatorPos < String::npos ? separatorPos + 1 : S tring::npos;
471 return {DependentString{value, 0, separatorPos},
472 DependentString{value, secondBeginPos, value.length() - secondBeginPos}};
Wladimir Palant 2017/12/21 10:30:36 What is `value.length() - secondBeginPos` going to
sergei 2018/03/01 15:05:25 It's handled by the constructor of DependentString
473 }
Wladimir Palant 2017/12/21 10:30:37 Why aren't these helpers methods of the String cla
sergei 2018/03/01 15:05:25 These functions are rather helper functions than m
OLDNEW
« no previous file with comments | « no previous file | compiled/String.cpp » ('j') | compiled/String.cpp » ('J')

Powered by Google App Engine
This is Rietveld