File: s2langquadtree.cc

package info (click to toggle)
chromium 139.0.7258.127-2
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 6,122,156 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (75 lines) | stat: -rw-r--r-- 2,568 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/language/content/browser/ulp_language_code_locator/s2langquadtree.h"

#include <string>

#include "third_party/s2cellid/src/s2/s2cellid.h"

S2LangQuadTreeNode::S2LangQuadTreeNode() = default;
S2LangQuadTreeNode::S2LangQuadTreeNode(S2LangQuadTreeNode&& other) = default;
S2LangQuadTreeNode& S2LangQuadTreeNode::operator=(S2LangQuadTreeNode&& other) =
    default;
S2LangQuadTreeNode::~S2LangQuadTreeNode() = default;

std::string S2LangQuadTreeNode::Get(const S2CellId& cell,
                                    int* level_ptr) const {
  const S2LangQuadTreeNode* node = this;
  for (int current_level = 0; current_level <= cell.level(); current_level++) {
    if (node->IsLeaf()) {
      *level_ptr = current_level;
      return node->language_;
    }
    if (current_level < cell.level())
      node = &(node->GetChild(cell.child_position(current_level + 1)));
  }
  *level_ptr = -1;
  return "";
}

S2LangQuadTreeNode S2LangQuadTreeNode::Deserialize(
    const SerializedLanguageTree* serialized_langtree) {
  S2LangQuadTreeNode root;
  int bits_per_lang_index = serialized_langtree->GetBitsPerLanguageIndex();
  DeserializeSubtree(serialized_langtree, bits_per_lang_index, 0, &root);
  return root;
}

size_t S2LangQuadTreeNode::DeserializeSubtree(
    const SerializedLanguageTree* serialized_langtree,
    int bits_per_lang_index,
    size_t bit_offset,
    S2LangQuadTreeNode* root) {
  if (serialized_langtree->GetBitAt(bit_offset)) {
    int index = 0;
    for (int bit_index = 1; bit_index <= bits_per_lang_index; bit_index++) {
      index <<= 1;
      index += serialized_langtree->GetBitAt(bit_offset + bit_index);
    }
    if (index != 0)
      root->language_ = serialized_langtree->GetLanguageAt(index - 1);
    return bits_per_lang_index + 1;
  } else {
    size_t subtree_size = 1;
    root->children_.reserve(4);
    for (int child_index = 0; child_index < 4; child_index++) {
      S2LangQuadTreeNode child;
      subtree_size +=
          DeserializeSubtree(serialized_langtree, bits_per_lang_index,
                             bit_offset + subtree_size, &child);
      root->children_.push_back(std::move(child));
    }
    return subtree_size;
  }
}

const S2LangQuadTreeNode& S2LangQuadTreeNode::GetChild(
    const int child_index) const {
  DCHECK(!children_.empty());
  return children_[child_index];
}

bool S2LangQuadTreeNode::IsLeaf() const {
  return children_.empty();
}