Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(631)

Side by Side Diff: net/tools/transport_security_state_generator/huffman/huffman_builder.cc

Issue 2632073002: Rename domain_security_preload_generator. (Closed)
Patch Set: rebase & comment rsleevi Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/tools/domain_security_preload_generator/huffman/huffman_frequency_ tracker.h" 5 #include "net/tools/transport_security_state_generator/huffman/huffman_builder.h "
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 10
11 namespace net { 11 namespace net {
12 12
13 namespace transport_security_state { 13 namespace transport_security_state {
14 14
15 namespace { 15 namespace {
(...skipping 26 matching lines...) Expand all
42 std::unique_ptr<HuffmanNode> right_; 42 std::unique_ptr<HuffmanNode> right_;
43 }; 43 };
44 44
45 bool CompareNodes(const std::unique_ptr<HuffmanNode>& lhs, 45 bool CompareNodes(const std::unique_ptr<HuffmanNode>& lhs,
46 const std::unique_ptr<HuffmanNode>& rhs) { 46 const std::unique_ptr<HuffmanNode>& rhs) {
47 return lhs->count() < rhs->count(); 47 return lhs->count() < rhs->count();
48 } 48 }
49 49
50 } // namespace 50 } // namespace
51 51
52 HuffmanFrequencyTracker::HuffmanFrequencyTracker() {} 52 HuffmanBuilder::HuffmanBuilder() {}
53 53
54 HuffmanFrequencyTracker::~HuffmanFrequencyTracker() {} 54 HuffmanBuilder::~HuffmanBuilder() {}
55 55
56 void HuffmanFrequencyTracker::RecordUsage(uint8_t character) { 56 void HuffmanBuilder::RecordUsage(uint8_t character) {
57 counts_[character] += 1; 57 counts_[character] += 1;
58 } 58 }
59 59
60 HuffmanRepresentationTable HuffmanFrequencyTracker::ToTable() { 60 HuffmanRepresentationTable HuffmanBuilder::ToTable() {
61 HuffmanRepresentationTable table; 61 HuffmanRepresentationTable table;
62 std::unique_ptr<HuffmanNode> node(BuildTree()); 62 std::unique_ptr<HuffmanNode> node(BuildTree());
63 63
64 TreeToTable(node.get(), 0, 0, &table); 64 TreeToTable(node.get(), 0, 0, &table);
65 return table; 65 return table;
66 } 66 }
67 67
68 void HuffmanFrequencyTracker::TreeToTable(HuffmanNode* node, 68 void HuffmanBuilder::TreeToTable(HuffmanNode* node,
69 uint32_t bits, 69 uint32_t bits,
70 uint32_t number_of_bits, 70 uint32_t number_of_bits,
71 HuffmanRepresentationTable* table) { 71 HuffmanRepresentationTable* table) {
72 if (node->IsLeaf()) { 72 if (node->IsLeaf()) {
73 HuffmanRepresentation item; 73 HuffmanRepresentation item;
74 item.bits = bits; 74 item.bits = bits;
75 item.number_of_bits = number_of_bits; 75 item.number_of_bits = number_of_bits;
76 76
77 table->insert(HuffmanRepresentationPair(node->value(), item)); 77 table->insert(HuffmanRepresentationPair(node->value(), item));
78 } else { 78 } else {
79 uint32_t new_bits = bits << 1; 79 uint32_t new_bits = bits << 1;
80 TreeToTable(node->left().get(), new_bits, number_of_bits + 1, table); 80 TreeToTable(node->left().get(), new_bits, number_of_bits + 1, table);
81 TreeToTable(node->right().get(), new_bits | 1, number_of_bits + 1, table); 81 TreeToTable(node->right().get(), new_bits | 1, number_of_bits + 1, table);
82 } 82 }
83 } 83 }
84 84
85 std::vector<uint8_t> HuffmanFrequencyTracker::ToVector() { 85 std::vector<uint8_t> HuffmanBuilder::ToVector() {
86 std::vector<uint8_t> bytes; 86 std::vector<uint8_t> bytes;
87 std::unique_ptr<HuffmanNode> node(BuildTree()); 87 std::unique_ptr<HuffmanNode> node(BuildTree());
88 WriteToVector(node.get(), &bytes); 88 WriteToVector(node.get(), &bytes);
89 return bytes; 89 return bytes;
90 } 90 }
91 91
92 uint32_t HuffmanFrequencyTracker::WriteToVector(HuffmanNode* node, 92 uint32_t HuffmanBuilder::WriteToVector(HuffmanNode* node,
93 std::vector<uint8_t>* vector) { 93 std::vector<uint8_t>* vector) {
94 uint8_t left_value; 94 uint8_t left_value;
95 uint8_t right_value; 95 uint8_t right_value;
96 uint32_t child_position; 96 uint32_t child_position;
97 97
98 if (node->left()->IsLeaf()) { 98 if (node->left()->IsLeaf()) {
99 left_value = 128 | node->left()->value(); 99 left_value = 128 | node->left()->value();
100 } else { 100 } else {
101 child_position = WriteToVector(node->left().get(), vector); 101 child_position = WriteToVector(node->left().get(), vector);
102 CHECK(child_position < 512) << "huffman tree too large"; 102 CHECK(child_position < 512) << "huffman tree too large";
103 left_value = child_position / 2; 103 left_value = child_position / 2;
104 } 104 }
105 105
106 if (node->right()->IsLeaf()) { 106 if (node->right()->IsLeaf()) {
107 right_value = 128 | node->right()->value(); 107 right_value = 128 | node->right()->value();
108 } else { 108 } else {
109 child_position = WriteToVector(node->right().get(), vector); 109 child_position = WriteToVector(node->right().get(), vector);
110 CHECK(child_position < 512) << "huffman tree to large"; 110 CHECK(child_position < 512) << "huffman tree to large";
111 right_value = child_position / 2; 111 right_value = child_position / 2;
112 } 112 }
113 113
114 uint32_t position = static_cast<uint32_t>(vector->size()); 114 uint32_t position = static_cast<uint32_t>(vector->size());
115 vector->push_back(left_value); 115 vector->push_back(left_value);
116 vector->push_back(right_value); 116 vector->push_back(right_value);
117 return position; 117 return position;
118 } 118 }
119 119
120 std::unique_ptr<HuffmanNode> HuffmanFrequencyTracker::BuildTree() { 120 std::unique_ptr<HuffmanNode> HuffmanBuilder::BuildTree() {
121 std::vector<std::unique_ptr<HuffmanNode>> nodes; 121 std::vector<std::unique_ptr<HuffmanNode>> nodes;
122 nodes.reserve(counts_.size()); 122 nodes.reserve(counts_.size());
123 123
124 for (const auto& item : counts_) { 124 for (const auto& item : counts_) {
125 if (item.second > 0) { 125 if (item.second > 0) {
126 std::unique_ptr<HuffmanNode> node( 126 std::unique_ptr<HuffmanNode> node(
127 new HuffmanNode(item.first, item.second, nullptr, nullptr)); 127 new HuffmanNode(item.first, item.second, nullptr, nullptr));
128 nodes.push_back(std::move(node)); 128 nodes.push_back(std::move(node));
129 } 129 }
130 } 130 }
(...skipping 19 matching lines...) Expand all
150 150
151 std::stable_sort(nodes.begin(), nodes.end(), CompareNodes); 151 std::stable_sort(nodes.begin(), nodes.end(), CompareNodes);
152 } 152 }
153 153
154 return std::move(nodes[0]); 154 return std::move(nodes[0]);
155 } 155 }
156 156
157 } // namespace transport_security_state 157 } // namespace transport_security_state
158 158
159 } // namespace net 159 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698