blob: 1b5a77fe50425842198ad7b460d66709db4d9a5b [file] [log] [blame]
Zoltan Szabadkae7650082014-03-20 14:32:35 +01001// Copyright 2013 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14//
15// Class to model the static dictionary.
16
17#ifndef BROTLI_ENC_STATIC_DICT_H_
18#define BROTLI_ENC_STATIC_DICT_H_
19
20#include <algorithm>
21#include <unordered_map>
22#include <string>
23
24namespace brotli {
25
26class StaticDictionary {
27 public:
28 StaticDictionary() {}
29 void Insert(const std::string &str, int len, int dist) {
30 int ix = (dist << 6) + len;
31 std::unordered_map<std::string, int>::const_iterator it = map_.find(str);
32 if (it != map_.end() && ix >= it->second) {
33 return;
34 }
35 map_[str] = ix;
36 int v = 0;
37 for (int i = 0; i < 4 && i < str.size(); ++i) {
38 v += str[i] << (8 * i);
39 }
40 if (prefix_map_[v] < str.size()) {
41 prefix_map_[v] = str.size();
42 }
43 }
44 int GetLength(int v) const {
45 std::unordered_map<int, int>::const_iterator it = prefix_map_.find(v);
46 if (it == prefix_map_.end()) {
47 return 0;
48 }
49 return it->second;
50 }
51 bool Get(const std::string &str, int *len, int *dist) const {
52 std::unordered_map<std::string, int>::const_iterator it = map_.find(str);
53 if (it == map_.end()) {
54 return false;
55 }
56 int v = it->second;
57 *len = v & 63;
58 *dist = v >> 6;
59 return true;
60 }
61 private:
62 std::unordered_map<std::string, int> map_;
63 std::unordered_map<int, int> prefix_map_;
64};
65
66} // namespace brotli
67
68#endif // BROTLI_ENC_STATIC_DICT_H_