@@ -6,13 +6,139 @@ pub enum Parent {
6
6
Id ( Id ) ,
7
7
}
8
8
9
+ #[ rustfmt:: skip]
10
+ #[ allow( dead_code) ]
11
+ pub mod item_flags {
12
+ pub const ITEM_KEEP : u8 = 0b0000_0001 ;
13
+ pub const ITEM_COUNTABLE : u8 = 0b0000_0010 ;
14
+ pub const ITEM_DELETED : u8 = 0b0000_0100 ;
15
+ pub const ITEM_MARKED : u8 = 0b0000_1000 ;
16
+ pub const ITEM_HAS_PARENT_SUB : u8 = 0b0010_0000 ;
17
+ pub const ITEM_HAS_RIGHT_ID : u8 = 0b0100_0000 ;
18
+ pub const ITEM_HAS_LEFT_ID : u8 = 0b1000_0000 ;
19
+ }
20
+
21
+ #[ derive( Debug , Copy , Clone , PartialEq , Eq ) ]
22
+ pub struct ItemFlags ( u8 ) ;
23
+
24
+ impl From < u8 > for ItemFlags {
25
+ fn from ( flags : u8 ) -> Self {
26
+ Self ( flags)
27
+ }
28
+ }
29
+
30
+ impl ItemFlags {
31
+ #[ inline( always) ]
32
+ pub fn set ( & mut self , flag : u8 ) {
33
+ self . 0 |= flag;
34
+ }
35
+
36
+ #[ inline( always) ]
37
+ pub fn clear ( & mut self , flag : u8 ) {
38
+ self . 0 &= !flag;
39
+ }
40
+
41
+ #[ inline( always) ]
42
+ pub fn check ( & self , flag : u8 ) -> bool {
43
+ self . 0 & flag == flag
44
+ }
45
+
46
+ #[ inline( always) ]
47
+ pub fn not ( & self , flag : u8 ) -> bool {
48
+ self . 0 & flag == 0
49
+ }
50
+
51
+ #[ inline( always) ]
52
+ pub fn keep ( & self ) -> bool {
53
+ self . check ( item_flags:: ITEM_KEEP )
54
+ }
55
+
56
+ #[ inline( always) ]
57
+ pub fn set_keep ( & mut self ) {
58
+ self . set ( item_flags:: ITEM_KEEP ) ;
59
+ }
60
+
61
+ #[ inline( always) ]
62
+ pub fn clear_keep ( & mut self ) {
63
+ self . clear ( item_flags:: ITEM_KEEP ) ;
64
+ }
65
+
66
+ #[ inline( always) ]
67
+ pub fn countable ( & self ) -> bool {
68
+ self . check ( item_flags:: ITEM_COUNTABLE )
69
+ }
70
+
71
+ #[ inline( always) ]
72
+ pub fn set_countable ( & mut self ) {
73
+ self . set ( item_flags:: ITEM_COUNTABLE ) ;
74
+ }
75
+
76
+ #[ inline( always) ]
77
+ pub fn clear_countable ( & mut self ) {
78
+ self . clear ( item_flags:: ITEM_COUNTABLE ) ;
79
+ }
80
+
81
+ #[ inline( always) ]
82
+ pub fn deleted ( & self ) -> bool {
83
+ self . check ( item_flags:: ITEM_DELETED )
84
+ }
85
+
86
+ #[ inline( always) ]
87
+ pub fn set_deleted ( & mut self ) {
88
+ self . set ( item_flags:: ITEM_DELETED ) ;
89
+ }
90
+
91
+ #[ inline( always) ]
92
+ pub fn clear_deleted ( & mut self ) {
93
+ self . clear ( item_flags:: ITEM_DELETED ) ;
94
+ }
95
+ }
96
+
9
97
#[ derive( Debug , Clone , PartialEq ) ]
10
98
pub struct Item {
11
99
pub left_id : Option < Id > ,
12
100
pub right_id : Option < Id > ,
13
101
pub parent : Option < Parent > ,
14
102
pub parent_sub : Option < String > ,
15
103
pub content : Content ,
104
+ pub flags : ItemFlags ,
105
+ }
106
+
107
+ impl Default for Item {
108
+ fn default ( ) -> Self {
109
+ Self {
110
+ left_id : None ,
111
+ right_id : None ,
112
+ parent : None ,
113
+ parent_sub : None ,
114
+ content : Content :: String ( "" . into ( ) ) ,
115
+ flags : ItemFlags :: from ( item_flags:: ITEM_COUNTABLE ) ,
116
+ }
117
+ }
118
+ }
119
+
120
+ impl Item {
121
+ pub fn is_empty ( & self ) -> bool {
122
+ self . len ( ) == 0
123
+ }
124
+
125
+ pub fn len ( & self ) -> u64 {
126
+ self . content . clock_len ( )
127
+ }
128
+
129
+ pub fn deleted ( & self ) -> bool {
130
+ self . flags . deleted ( )
131
+ }
132
+
133
+ pub fn delete ( & mut self ) {
134
+ if self . deleted ( ) {
135
+ return ;
136
+ }
137
+
138
+ // self.content.delete();
139
+
140
+ self . flags . deleted ( ) ;
141
+ }
16
142
}
17
143
18
144
fn read_has_parent ( input : & [ u8 ] ) -> IResult < & [ u8 ] , bool > {
@@ -23,14 +149,15 @@ fn read_has_parent(input: &[u8]) -> IResult<&[u8], bool> {
23
149
24
150
pub fn read_item ( input : & [ u8 ] , info : u8 , first_5_bit : u8 ) -> IResult < & [ u8 ] , Item > {
25
151
let mut input = input;
26
- let has_left_id = info & 0b1000_0000 == 0b1000_0000 ;
27
- let has_right_id = info & 0b0100_0000 == 0b0100_0000 ;
28
- let has_parent_sub = info & 0b0010_0000 == 0b0010_0000 ;
29
- let has_not_parent_info = info & 0b1100_0000 == 0 ;
152
+ let flags: ItemFlags = info. into ( ) ;
153
+ let has_left_id = flags. check ( item_flags:: ITEM_HAS_LEFT_ID ) ;
154
+ let has_right_id = flags. check ( item_flags:: ITEM_HAS_RIGHT_ID ) ;
155
+ let has_parent_sub = flags. check ( item_flags:: ITEM_HAS_PARENT_SUB ) ;
156
+ let has_not_parent_info = !( has_left_id || has_right_id) ;
30
157
31
158
// NOTE: read order must keep the same as the order in yjs
32
159
// TODO: this data structure design will break the cpu OOE, need to be optimized
33
- let item = Item {
160
+ let mut item = Item {
34
161
left_id : if has_left_id {
35
162
let ( tail, id) = read_item_id ( input) ?;
36
163
input = tail;
@@ -77,7 +204,12 @@ pub fn read_item(input: &[u8], info: u8, first_5_bit: u8) -> IResult<&[u8], Item
77
204
input = tail;
78
205
content
79
206
} ,
207
+ flags : ItemFlags :: from ( 0 ) ,
80
208
} ;
81
209
210
+ if item. content . countable ( ) {
211
+ item. flags . set_countable ( ) ;
212
+ }
213
+
82
214
Ok ( ( input, item) )
83
215
}
0 commit comments