1pub const FLAG_COMPRESSED: u16 = 0b0000_0000_0000_0001;
8
9pub const FLAG_EMBEDDINGS: u16 = 0b0000_0000_0000_0010;
11
12pub const FLAG_TOKENIZED: u16 = 0b0000_0000_0000_0100;
14
15pub const FLAG_WEIGHTED: u16 = 0b0000_0000_0000_1000;
17
18pub const FLAG_MODEL_HINTS: u16 = 0b0000_0000_0001_0000;
20
21pub const FLAG_SIGNED: u16 = 0b0000_0000_0010_0000;
23
24pub const FLAG_STRING_TABLE: u16 = 0b0000_0000_0100_0000;
26
27pub const FLAG_RESOLVED: u16 = 0b0000_0000_1000_0000;
29
30pub const FLAG_PROVENANCE: u16 = 0b0000_0001_0000_0000;
32
33pub const FLAG_MEMBERS: u16 = 0b0000_0010_0000_0000;
35
36#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
40pub struct Flags(pub u16);
41
42impl Flags {
43 pub const fn new() -> Self {
45 Self(0)
46 }
47
48 pub const fn from_raw(raw: u16) -> Self {
50 Self(raw)
51 }
52
53 pub const fn raw(&self) -> u16 {
55 self.0
56 }
57
58 pub const fn is_compressed(&self) -> bool {
60 self.0 & FLAG_COMPRESSED != 0
61 }
62
63 pub const fn has_embeddings(&self) -> bool {
65 self.0 & FLAG_EMBEDDINGS != 0
66 }
67
68 pub const fn is_tokenized(&self) -> bool {
70 self.0 & FLAG_TOKENIZED != 0
71 }
72
73 pub const fn has_weights(&self) -> bool {
75 self.0 & FLAG_WEIGHTED != 0
76 }
77
78 pub const fn has_model_hints(&self) -> bool {
80 self.0 & FLAG_MODEL_HINTS != 0
81 }
82
83 pub const fn is_signed(&self) -> bool {
85 self.0 & FLAG_SIGNED != 0
86 }
87
88 pub fn set_compressed(&mut self, value: bool) {
90 if value {
91 self.0 |= FLAG_COMPRESSED;
92 } else {
93 self.0 &= !FLAG_COMPRESSED;
94 }
95 }
96
97 pub fn set_embeddings(&mut self, value: bool) {
99 if value {
100 self.0 |= FLAG_EMBEDDINGS;
101 } else {
102 self.0 &= !FLAG_EMBEDDINGS;
103 }
104 }
105
106 pub fn set_tokenized(&mut self, value: bool) {
108 if value {
109 self.0 |= FLAG_TOKENIZED;
110 } else {
111 self.0 &= !FLAG_TOKENIZED;
112 }
113 }
114
115 pub fn set_weighted(&mut self, value: bool) {
117 if value {
118 self.0 |= FLAG_WEIGHTED;
119 } else {
120 self.0 &= !FLAG_WEIGHTED;
121 }
122 }
123
124 pub fn set_model_hints(&mut self, value: bool) {
126 if value {
127 self.0 |= FLAG_MODEL_HINTS;
128 } else {
129 self.0 &= !FLAG_MODEL_HINTS;
130 }
131 }
132
133 pub fn set_signed(&mut self, value: bool) {
135 if value {
136 self.0 |= FLAG_SIGNED;
137 } else {
138 self.0 &= !FLAG_SIGNED;
139 }
140 }
141
142 pub const fn has_string_table(&self) -> bool {
144 self.0 & FLAG_STRING_TABLE != 0
145 }
146
147 pub fn set_string_table(&mut self, value: bool) {
149 if value {
150 self.0 |= FLAG_STRING_TABLE;
151 } else {
152 self.0 &= !FLAG_STRING_TABLE;
153 }
154 }
155
156 pub const fn is_resolved(&self) -> bool {
158 self.0 & FLAG_RESOLVED != 0
159 }
160
161 pub fn set_resolved(&mut self, value: bool) {
163 if value {
164 self.0 |= FLAG_RESOLVED;
165 } else {
166 self.0 &= !FLAG_RESOLVED;
167 }
168 }
169}
170
171impl From<u16> for Flags {
172 fn from(raw: u16) -> Self {
173 Self(raw)
174 }
175}
176
177impl From<Flags> for u16 {
178 fn from(flags: Flags) -> Self {
179 flags.0
180 }
181}
182
183#[cfg(test)]
184mod tests {
185 use super::*;
186
187 #[test]
188 fn test_flag_bits() {
189 assert_eq!(FLAG_COMPRESSED, 1);
190 assert_eq!(FLAG_EMBEDDINGS, 2);
191 assert_eq!(FLAG_TOKENIZED, 4);
192 assert_eq!(FLAG_WEIGHTED, 8);
193 assert_eq!(FLAG_MODEL_HINTS, 16);
194 assert_eq!(FLAG_SIGNED, 32);
195 assert_eq!(FLAG_STRING_TABLE, 64);
196 assert_eq!(FLAG_RESOLVED, 128);
197 assert_eq!(FLAG_PROVENANCE, 256);
198 assert_eq!(FLAG_MEMBERS, 512);
199 }
200
201 #[test]
202 fn test_flags_default() {
203 let flags = Flags::new();
204 assert_eq!(flags.raw(), 0);
205 assert!(!flags.is_compressed());
206 assert!(!flags.has_embeddings());
207 }
208
209 #[test]
210 fn test_flags_set_get() {
211 let mut flags = Flags::new();
212 flags.set_compressed(true);
213 flags.set_embeddings(true);
214
215 assert!(flags.is_compressed());
216 assert!(flags.has_embeddings());
217 assert!(!flags.is_tokenized());
218
219 assert_eq!(flags.raw(), FLAG_COMPRESSED | FLAG_EMBEDDINGS);
220 }
221
222 #[test]
223 fn test_flags_unset() {
224 let mut flags = Flags::from_raw(FLAG_COMPRESSED | FLAG_EMBEDDINGS);
225 flags.set_compressed(false);
226
227 assert!(!flags.is_compressed());
228 assert!(flags.has_embeddings());
229 }
230
231 #[test]
232 fn test_resolved_flag() {
233 let mut flags = Flags::new();
234 assert!(!flags.is_resolved());
235 flags.set_resolved(true);
236 assert!(flags.is_resolved());
237 assert_eq!(flags.raw() & FLAG_RESOLVED, FLAG_RESOLVED);
238 }
239}