blob: f9da360869610a05ed5bad948626f2ef9c5edafc (
plain) (
blame)
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
76
77
78
79
80
81
82
|
#pragma once
#ifndef MARISA_GRIMOIRE_TRIE_CACHE_H_
#define MARISA_GRIMOIRE_TRIE_CACHE_H_
#include <cfloat>
#include "../../base.h"
namespace marisa {
namespace grimoire {
namespace trie {
class Cache {
public:
Cache() : parent_(0), child_(0), union_() {
union_.weight = FLT_MIN;
}
Cache(const Cache &cache)
: parent_(cache.parent_), child_(cache.child_), union_(cache.union_) {}
Cache &operator=(const Cache &cache) {
parent_ = cache.parent_;
child_ = cache.child_;
union_ = cache.union_;
return *this;
}
void set_parent(std::size_t parent) {
MARISA_DEBUG_IF(parent > MARISA_UINT32_MAX, MARISA_SIZE_ERROR);
parent_ = (UInt32)parent;
}
void set_child(std::size_t child) {
MARISA_DEBUG_IF(child > MARISA_UINT32_MAX, MARISA_SIZE_ERROR);
child_ = (UInt32)child;
}
void set_base(UInt8 base) {
union_.link = (union_.link & ~0xFFU) | base;
}
void set_extra(std::size_t extra) {
MARISA_DEBUG_IF(extra > (MARISA_UINT32_MAX >> 8), MARISA_SIZE_ERROR);
union_.link = (UInt32)((union_.link & 0xFFU) | (extra << 8));
}
void set_weight(float weight) {
union_.weight = weight;
}
std::size_t parent() const {
return parent_;
}
std::size_t child() const {
return child_;
}
UInt8 base() const {
return (UInt8)(union_.link & 0xFFU);
}
std::size_t extra() const {
return union_.link >> 8;
}
char label() const {
return (char)base();
}
std::size_t link() const {
return union_.link;
}
float weight() const {
return union_.weight;
}
private:
UInt32 parent_;
UInt32 child_;
union Union {
UInt32 link;
float weight;
} union_;
};
} // namespace trie
} // namespace grimoire
} // namespace marisa
#endif // MARISA_GRIMOIRE_TRIE_CACHE_H_
|