• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef MARISA_GRIMOIRE_VECTOR_RANK_INDEX_H_
2 #define MARISA_GRIMOIRE_VECTOR_RANK_INDEX_H_
3 
4 #include "marisa/base.h"
5 
6 namespace marisa {
7 namespace grimoire {
8 namespace vector {
9 
10 class RankIndex {
11  public:
RankIndex()12   RankIndex() : abs_(0), rel_lo_(0), rel_hi_(0) {}
13 
set_abs(std::size_t value)14   void set_abs(std::size_t value) {
15     MARISA_DEBUG_IF(value > MARISA_UINT32_MAX, MARISA_SIZE_ERROR);
16     abs_ = (UInt32)value;
17   }
set_rel1(std::size_t value)18   void set_rel1(std::size_t value) {
19     MARISA_DEBUG_IF(value > 64, MARISA_RANGE_ERROR);
20     rel_lo_ = (UInt32)((rel_lo_ & ~0x7FU) | (value & 0x7FU));
21   }
set_rel2(std::size_t value)22   void set_rel2(std::size_t value) {
23     MARISA_DEBUG_IF(value > 128, MARISA_RANGE_ERROR);
24     rel_lo_ = (UInt32)((rel_lo_ & ~(0xFFU << 7)) | ((value & 0xFFU) << 7));
25   }
set_rel3(std::size_t value)26   void set_rel3(std::size_t value) {
27     MARISA_DEBUG_IF(value > 192, MARISA_RANGE_ERROR);
28     rel_lo_ = (UInt32)((rel_lo_ & ~(0xFFU << 15)) | ((value & 0xFFU) << 15));
29   }
set_rel4(std::size_t value)30   void set_rel4(std::size_t value) {
31     MARISA_DEBUG_IF(value > 256, MARISA_RANGE_ERROR);
32     rel_lo_ = (UInt32)((rel_lo_ & ~(0x1FFU << 23)) | ((value & 0x1FFU) << 23));
33   }
set_rel5(std::size_t value)34   void set_rel5(std::size_t value) {
35     MARISA_DEBUG_IF(value > 320, MARISA_RANGE_ERROR);
36     rel_hi_ = (UInt32)((rel_hi_ & ~0x1FFU) | (value & 0x1FFU));
37   }
set_rel6(std::size_t value)38   void set_rel6(std::size_t value) {
39     MARISA_DEBUG_IF(value > 384, MARISA_RANGE_ERROR);
40     rel_hi_ = (UInt32)((rel_hi_ & ~(0x1FFU << 9)) | ((value & 0x1FFU) << 9));
41   }
set_rel7(std::size_t value)42   void set_rel7(std::size_t value) {
43     MARISA_DEBUG_IF(value > 448, MARISA_RANGE_ERROR);
44     rel_hi_ = (UInt32)((rel_hi_ & ~(0x1FFU << 18)) | ((value & 0x1FFU) << 18));
45   }
46 
abs()47   std::size_t abs() const {
48     return abs_;
49   }
rel1()50   std::size_t rel1() const {
51     return rel_lo_ & 0x7FU;
52   }
rel2()53   std::size_t rel2() const {
54     return (rel_lo_ >> 7) & 0xFFU;
55   }
rel3()56   std::size_t rel3() const {
57     return (rel_lo_ >> 15) & 0xFFU;
58   }
rel4()59   std::size_t rel4() const {
60     return (rel_lo_ >> 23) & 0x1FFU;
61   }
rel5()62   std::size_t rel5() const {
63     return rel_hi_ & 0x1FFU;
64   }
rel6()65   std::size_t rel6() const {
66     return (rel_hi_ >> 9) & 0x1FFU;
67   }
rel7()68   std::size_t rel7() const {
69     return (rel_hi_ >> 18) & 0x1FFU;
70   }
71 
72  private:
73   UInt32 abs_;
74   UInt32 rel_lo_;
75   UInt32 rel_hi_;
76 };
77 
78 }  // namespace vector
79 }  // namespace grimoire
80 }  // namespace marisa
81 
82 #endif  // MARISA_GRIMOIRE_VECTOR_RANK_INDEX_H_
83