605 Commits

Author SHA1 Message Date
Milo Yip
a425ad5552 Trimming leading/trailing zeros and correct underflow case 2014-09-16 10:52:40 +08:00
miloyip
50fc3fedb2 Fix round towards even 2014-09-15 16:53:57 +08:00
miloyip
b29acfb90d Limit significand to 17 digits for fast path
Should fix gcc debug error in tranvis. May need further refactoring.
2014-09-15 15:54:15 +08:00
Milo Yip
bea4fa7f6a Remove unused BigInteger::operator+=(const BigInteger&) 2014-09-15 00:31:38 +08:00
Milo Yip
cbd7475242 Fix normal-subnormal boundary and add more boundary cases in unit tests. 2014-09-15 00:30:22 +08:00
Milo Yip
fa52a26909 Fix a unit test warning and suppress a failing case 2014-09-14 12:52:07 +08:00
Milo Yip
4c2128818f Add 32-bit support for custom strtod 2014-09-14 12:42:58 +08:00
Milo Yip
855da06d0f Makes gcc x64 runnable, but failed on one case. [ci skip] 2014-09-14 10:52:33 +08:00
Milo Yip
98dd0a0a64 Make custom strtod work for denormal numbers and some boundary cases [ci skip] 2014-09-13 23:24:40 +08:00
Milo Yip
4bd240abee Implementing custom strtod, fail on some cases [ci skip] 2014-09-12 23:03:20 +08:00
Milo Yip
359ebc78c0 Extract conversion code to strtod.h [ci skip] 2014-09-10 23:36:09 +08:00
miloyip
30ea2a32d1 Prepare custom strtod data. (cannot pass unit test) [ci skip] 2014-09-10 18:54:41 +08:00
miloyip
774a4aa2b2 Fix VC2010 which don't have std::isnan() et al. 2014-09-10 09:28:52 +08:00
Milo Yip
86d63ff10c Update document for kParseFullPrecisionFlag 2014-09-06 10:28:54 +08:00
miloyip
add0d9c8f9 Compute error statistics of normal precision 2014-09-05 22:18:40 +08:00
miloyip
c4a657d430 Fix ParseNumber_Integer test 2014-09-05 20:06:03 +08:00
miloyip
a71f2e60ff Optimize ParseNumber() 2014-09-05 19:51:20 +08:00
Milo Yip
881c91d696 Merge master and implement kParseFullPrecision 2014-09-05 13:22:56 +08:00
Milo Yip
d875f16ad7 Refactor ParseNumber for two modes (incomplete) 2014-09-05 10:45:44 +08:00
Milo Yip
5e03cbf1b3 Merge pull request #134 from Kosta-Github/Kosta/add_key_method
add `Key()` method to the `Handler` concept
2014-09-05 09:50:24 +08:00
Kosta
f0d9ab4ec9 finally fixing Reader::ParseString()
It was a copy-n-paste error for the last argument of `Key()` and `String()`...
2014-09-04 18:00:05 +02:00
Kosta
00ac1024ee more changes 2014-09-04 17:37:13 +02:00
Kosta
e70494bc00 fix for Reader::ParseString() implementation plus some minor code cleanups and additions 2014-09-04 17:29:52 +02:00
Kosta
4a71dc6d58 reunified ParseKey, ParseString, and ParseStringOrKey again 2014-09-04 16:54:01 +02:00
Kosta
25f4892aa1 removed unused argument names 2014-09-04 15:56:21 +02:00
Kosta
8b2faff981 enhance IterativeParsingReaderHandler to check for Key() events 2014-09-04 15:51:09 +02:00
Kosta
c8da4d86fc add Key()->String() forwarding to the capitalize example 2014-09-04 15:35:01 +02:00
Kosta
0f4071046f fix simplereader.cpp and the Key()->String() forwarding in BaseReaderHandler 2014-09-04 15:30:44 +02:00
Kosta
23b3d24355 add Key() to IterativeParsingReaderHandler in readertest.cpp` 2014-09-04 15:24:52 +02:00
Kosta
17b1a14d62 add Key() method to Writer and PrettyWriter 2014-09-04 15:20:05 +02:00
Kosta
57e1c87553 add Key() method to the Handler concept
For more details see: https://github.com/miloyip/rapidjson/issues/132

This commit tries to minimize the required code changes and forwards the `Handler::Key()` calls to `Handler::String()` wherever possible in order to not break existing code; or at least not code deriving from `BaseReaderHandler` when implementing a custom `Handler`.
2014-09-04 15:14:18 +02:00
miloyip
b0436911a8 Check "fast path cases in disguise" in strtod 2014-09-03 14:45:37 +08:00
miloyip
818f6f1f2e Add random tests for ParseNumber 2014-09-03 13:27:43 +08:00
Milo Yip
bc9d7866be Merge pull request #128 from pah/feature/cxx11-move
Initial C++11 move support
2014-09-03 09:37:35 +08:00
Milo Yip
15d70d6a7b Merge pull request #127 from pah/feature/value-different-allocators
GenericValue: accept values with different allocators for read-only access
2014-09-03 09:37:15 +08:00
miloyip
0580d42d11 Fallback strtod() when not able to do fast-path
This shall generate best possible precision (if strtod() is correctly
implemented). Need more unit tests and performance tests. May add an
option for accepting precision error. Otherwise LUT in Pow10() can be
reduced.
2014-09-03 01:02:38 +08:00
Milo Yip
c6e6bca22f Merge pull request #130 from pah/fixes/capacity-growth
GenericValue: reduce growth factor for array/object reallocations
2014-09-02 22:11:34 +08:00
Milo Yip
9289f3270d Merge pull request #131 from Kosta-Github/Kosta/short_string_optimization
short string optimization
2014-09-02 21:52:10 +08:00
Kosta
08e81097eb final fix for the unit test case... 2014-09-01 12:54:50 +02:00
Kosta
ba05ea52cf use rapidjson::Value::SizeType as the type for storing and comparing the string length 2014-09-01 12:52:36 +02:00
Kosta
609997565c unit test simplification for short string optimization 2014-09-01 12:46:04 +02:00
Kosta
88debcf02e typo fixed for the unit test implementation 2014-09-01 12:40:28 +02:00
Kosta
056d0dafe4 add unit test for testing edge cases of the short string optimization 2014-09-01 12:34:43 +02:00
Kosta
697cf407c2 fixed a compiler error not caught by VS2012... 2014-09-01 12:01:25 +02:00
Kosta
d2a374b40c allow the short string optimization to store one more character
The `ShortString` can represent zero-terminated strings up to `MaxSize` chars (excluding the terminating zero) and store a value to determine the length of the contained string in the last character `str[LenPos]` by storing `MaxSize - length` there. If the string to store has the maximal length of `MaxSize` (excluding the terminating zero) then `str[LenPos]` will store `0` and therefore act as the string terminator as well. For getting the string length back from that value just use `MaxSize - str[LenPos]`.

This allows to store `11`-chars strings in 32-bit mode and `15`-chars strings in 64-bit mode inline (for `UTF8`-encoded strings).
2014-09-01 11:52:09 +02:00
Philipp A. Hartmann
0d2761a59c GenericValue: round up during capacity growth
Suggested-by: @miloyip
2014-09-01 11:31:25 +02:00
Kosta
b92d0ebd1b code cleanup for StringEqual()
Instead of replicating the functionality of `GetString()` and `GetStringLength()` in `StringEqual()` it now calls these methods instead.
2014-09-01 11:15:52 +02:00
Kosta
3caa86c923 short string optimization
Since the payload (the `Data` union) of the current implementation of `GenericValue` is `12 bytes` (32 bit) or `16 bytes` (64 bit) it could store `UTF8`-encoded strings up to `10` or `14` chars plus the `terminating zero` character plus the string length:
``` C++
    struct ShortString {
        enum { MaxSize = sizeof(GenericValue::String) / sizeof(Ch) - sizeof(unsigned char) };
        Ch str[MaxSize];
        unsigned char length;
    };  // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode

```

This is achieved by introducing additional `kInlineStrFlag` and `kShortStringFlag` flags. When setting a new string value in `SetStringRaw(s, alloc)` it is first checked if the string is short enough to fit into the `inline string buffer` and if so the given source string will be copied into the new `ShortString` target instead of allocating additional memory for it.
2014-09-01 11:11:26 +02:00
Philipp A. Hartmann
f4f432801a GenericValue: reduce growth factor for array/object reallocations
As mentioned by @kosta-github in http://git.io/0gkYSg, the currently
used growth factor of 2 is suboptimal for memory performance.  An
extensive discussion can be found at [1].

This patch reduces the array/object capacity growth factor to 1.5, as
many C++ implementations have chosen to use.  In order to avoid
floating-point arithmetics for computing the new capacity, I did not
add any customization parameter for the factor and used a shift+add
instead.

[1] https://github.com/facebook/folly/blob/master/folly/docs/FBVector.md
2014-09-01 08:57:21 +02:00
Milo Yip
2a4e055590 Merge pull request #129 from pah/bug/compare-uint64-double
Failing comparisons between certain (Ui|I)nt64 numbers
2014-09-01 12:09:31 +08:00