diff options
author | Abseil Team <absl-team@google.com> | 2020-03-12T16·41-0700 |
---|---|---|
committer | Derek Mauro <dmauro@google.com> | 2020-03-12T16·46-0400 |
commit | c6954897f7ece5011f0126db9117361dc1a6ff36 (patch) | |
tree | 77751f0d6868522e891c8dd816fbc4a01448bc18 /absl/strings/cord.cc | |
parent | b92f35f65fa5298d430eab49c1831b5f3e9594c8 (diff) |
Export of internal Abseil changes
-- 66a0a46462692378f77518f9db766a218bfac40b by Derek Mauro <dmauro@google.com>: Internal change PiperOrigin-RevId: 300565981 -- 2a1ad67662b2e22beec7d3be019e6bba23c41c7f by Derek Mauro <dmauro@google.com>: Fix CompressedTuple move constructor on MSVC Imports GitHub #637 PiperOrigin-RevId: 300545840 -- a3ee3ad036bbb6b0031121fd58299e5c59a243e1 by Derek Mauro <dmauro@google.com>: Disable LLVM's XRay instrumentation on Android Fixes #626 PiperOrigin-RevId: 300540906 -- 87999244b1f825e585ec12a431086cb60daeb24f by Gennadiy Rozental <rogeeff@google.com>: Increase max cord depth by 2. After reviewing of the paper we can prove that the algorithm in fact can lead to slightly larger max depth. PiperOrigin-RevId: 300422376 -- 98de175ee8ad33290ef883c167c2de4414a11007 by Abseil Team <absl-team@google.com>: Use *opt/opt-> instead of opt.value() in an example, after checking the optional has a value. PiperOrigin-RevId: 300253502 -- 1107aa0acf0fe743ef50173e02e48f0d4eb572ef by Derek Mauro <dmauro@google.com>: Stop overriding the default system C++ dialect in CMake CMake on MacOS has some very strange defaults, like Wno-c++11-extensions, and doesn't seem to respect CMAKE_CXX_STANDARD, so use CMAKE_CXX_FLAGS instead. PiperOrigin-RevId: 300180753 GitOrigin-RevId: 66a0a46462692378f77518f9db766a218bfac40b Change-Id: Icd7b84c49306441b012cb87f244cc92a11697db8
Diffstat (limited to 'absl/strings/cord.cc')
-rw-r--r-- | absl/strings/cord.cc | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/absl/strings/cord.cc b/absl/strings/cord.cc index 9b32b3cc46b6..415b239b0e9c 100644 --- a/absl/strings/cord.cc +++ b/absl/strings/cord.cc @@ -187,19 +187,20 @@ static constexpr size_t TagToLength(uint8_t tag) { // Enforce that kMaxFlatSize maps to a well-known exact tag value. static_assert(TagToAllocatedSize(224) == kMaxFlatSize, "Bad tag logic"); -constexpr uint64_t Fibonacci(uint8_t n, uint64_t a = 0, uint64_t b = 1) { - return n == 0 ? a : n == 1 ? b : Fibonacci(n - 1, b, a + b); +constexpr size_t Fibonacci(uint8_t n, const size_t a = 0, const size_t b = 1) { + return n == 0 + ? a + : n == 1 ? b + : Fibonacci(n - 1, b, + (a > (size_t(-1) - b)) ? size_t(-1) : a + b); } -static_assert(Fibonacci(63) == 6557470319842, - "Fibonacci values computed incorrectly"); - // Minimum length required for a given depth tree -- a tree is considered // balanced if // length(t) >= kMinLength[depth(t)] // The node depth is allowed to become larger to reduce rebalancing // for larger strings (see ShouldRebalance). -constexpr uint64_t kMinLength[] = { +constexpr size_t kMinLength[] = { Fibonacci(2), Fibonacci(3), Fibonacci(4), Fibonacci(5), Fibonacci(6), Fibonacci(7), Fibonacci(8), Fibonacci(9), Fibonacci(10), Fibonacci(11), Fibonacci(12), Fibonacci(13), Fibonacci(14), Fibonacci(15), Fibonacci(16), @@ -218,9 +219,9 @@ constexpr uint64_t kMinLength[] = { Fibonacci(77), Fibonacci(78), Fibonacci(79), Fibonacci(80), Fibonacci(81), Fibonacci(82), Fibonacci(83), Fibonacci(84), Fibonacci(85), Fibonacci(86), Fibonacci(87), Fibonacci(88), Fibonacci(89), Fibonacci(90), Fibonacci(91), - Fibonacci(92), Fibonacci(93)}; + Fibonacci(92), Fibonacci(93), Fibonacci(94), Fibonacci(95)}; -static_assert(sizeof(kMinLength) / sizeof(uint64_t) == +static_assert(sizeof(kMinLength) / sizeof(size_t) >= (cord_internal::MaxCordDepth() + 1), "Not enough elements in kMinLength array to cover all the " "supported Cord depth(s)"); @@ -1169,9 +1170,9 @@ class CordForest { void AddNode(CordRep* node) { CordRep* sum = nullptr; - // Collect together everything with which we will merge node + // Collect together everything with which we will merge with node int i = 0; - for (; node->length > kMinLength[i + 1]; ++i) { + for (; node->length >= kMinLength[i + 1]; ++i) { auto& tree_at_i = trees_[i]; if (tree_at_i == nullptr) continue; |