Chromium Code Reviews| Index: net/tools/transport_security_state_generator/huffman/huffman_builder.cc |
| diff --git a/net/tools/transport_security_state_generator/huffman/huffman_builder.cc b/net/tools/transport_security_state_generator/huffman/huffman_builder.cc |
| index 9e715a7e59b42628e0c09786b6b5a4fba05ecb6e..7cae407823c3893eaab4f0ad21ecaee49474fa72 100644 |
| --- a/net/tools/transport_security_state_generator/huffman/huffman_builder.cc |
| +++ b/net/tools/transport_security_state_generator/huffman/huffman_builder.cc |
| @@ -7,6 +7,7 @@ |
| #include <algorithm> |
| #include "base/logging.h" |
| +#include "base/memory/ptr_util.h" |
| namespace net { |
| @@ -54,7 +55,8 @@ HuffmanBuilder::HuffmanBuilder() {} |
| HuffmanBuilder::~HuffmanBuilder() {} |
| void HuffmanBuilder::RecordUsage(uint8_t character) { |
| - counts_[character] += 1; |
| + DCHECK(character < 128); |
| + counts_[character & 127] += 1; |
| } |
| HuffmanRepresentationTable HuffmanBuilder::ToTable() { |
| @@ -99,7 +101,7 @@ uint32_t HuffmanBuilder::WriteToVector(HuffmanNode* node, |
| left_value = 128 | node->left()->value(); |
| } else { |
| child_position = WriteToVector(node->left().get(), vector); |
| - CHECK(child_position < 512) << "huffman tree too large"; |
| + DCHECK(child_position < 512) << "huffman tree too large"; |
| left_value = child_position / 2; |
| } |
| @@ -107,7 +109,7 @@ uint32_t HuffmanBuilder::WriteToVector(HuffmanNode* node, |
| right_value = 128 | node->right()->value(); |
| } else { |
| child_position = WriteToVector(node->right().get(), vector); |
| - CHECK(child_position < 512) << "huffman tree to large"; |
| + DCHECK(child_position < 512) << "huffman tree to large"; |
| right_value = child_position / 2; |
| } |
| @@ -122,15 +124,20 @@ std::unique_ptr<HuffmanNode> HuffmanBuilder::BuildTree() { |
| nodes.reserve(counts_.size()); |
| for (const auto& item : counts_) { |
| - if (item.second > 0) { |
|
martijnc
2017/02/08 20:58:21
This condition is always true because if the value
|
| - std::unique_ptr<HuffmanNode> node( |
| - new HuffmanNode(item.first, item.second, nullptr, nullptr)); |
| - nodes.push_back(std::move(node)); |
| - } |
| + nodes.push_back(base::MakeUnique<HuffmanNode>(item.first, item.second, |
| + nullptr, nullptr)); |
| } |
| - if (nodes.size() < 2) { |
| - return std::move(nodes[0]); |
| + // At least 2 nodes are required for everything to work properly. Add |
|
martijnc
2017/02/08 20:58:21
ToVector() expects at least 2 nodes.
|
| + // arbitrary nodes to fill the tree. |
| + for (uint8_t i = 0; nodes.size() < 2 && i < 2; ++i) { |
| + for (const auto& node : nodes) { |
| + if (node->value() == i) { |
| + break; |
| + } |
| + } |
| + |
| + nodes.push_back(base::MakeUnique<HuffmanNode>(i, 0, nullptr, nullptr)); |
| } |
| std::stable_sort(nodes.begin(), nodes.end(), CompareNodes); |