toml_spanner/item/
to_toml.rs1use super::array::Array;
2use super::table::Table;
3use super::{FLAG_MASK, HINTS_BIT, Item, ItemMetadata, NOT_PROJECTED, TAG_MASK, TAG_SHIFT};
4
5pub(crate) const FULL_MATCH_BIT: u32 = 1 << 30;
7pub(crate) const IGNORE_SOURCE_ORDER_BIT: u32 = 1 << 29;
10pub(crate) const IGNORE_SOURCE_STYLE_BIT: u32 = 1 << 28;
13pub(crate) const ARRAY_REORDERED_BIT: u32 = 1 << 27;
18pub(crate) const EXPANDED_BIT: u32 = 1 << 25;
22pub(crate) const IGNORE_SOURCE_FORMATTING_RECURSIVELY_BIT: u32 = 1 << 24;
25
26impl ItemMetadata {
27 #[inline]
29 pub(crate) fn projected_index(&self) -> u32 {
30 self.start_and_tag >> TAG_SHIFT
31 }
32
33 #[inline]
36 fn hints_preserve_mask(&self) -> u32 {
37 ((self.end_and_flag as i32) >> 31) as u32 | FLAG_MASK
38 }
39
40 #[inline]
43 pub(crate) fn set_reprojected_index(&mut self, index: usize) -> bool {
44 if index <= (u32::MAX >> TAG_SHIFT) as usize {
45 self.start_and_tag = (self.start_and_tag & TAG_MASK) | ((index as u32) << TAG_SHIFT);
46 self.end_and_flag = (self.end_and_flag & self.hints_preserve_mask()) | HINTS_BIT;
47 true
48 } else {
49 false
50 }
51 }
52
53 #[inline]
56 pub(crate) fn set_reprojected_to_none(&mut self) {
57 self.start_and_tag |= NOT_PROJECTED;
58 self.end_and_flag =
59 (self.end_and_flag & (self.hints_preserve_mask() & !FULL_MATCH_BIT)) | HINTS_BIT;
60 }
61
62 #[inline]
63 pub(crate) fn set_reprojected_full_match(&mut self) {
64 self.end_and_flag |= FULL_MATCH_BIT;
65 }
66
67 #[inline]
68 pub(crate) fn is_reprojected_full_match(&self) -> bool {
69 self.end_and_flag & FULL_MATCH_BIT != 0
70 }
71
72 #[inline]
74 pub(crate) fn set_ignore_source_order(&mut self) {
75 self.end_and_flag |= HINTS_BIT | IGNORE_SOURCE_ORDER_BIT;
76 }
77
78 #[inline]
81 pub(crate) fn ignore_source_order(&self) -> bool {
82 self.end_and_flag & (HINTS_BIT | IGNORE_SOURCE_ORDER_BIT)
83 == (HINTS_BIT | IGNORE_SOURCE_ORDER_BIT)
84 }
85
86 #[inline]
88 pub(crate) fn set_array_reordered(&mut self) {
89 self.end_and_flag |= HINTS_BIT | ARRAY_REORDERED_BIT;
90 }
91
92 #[inline]
94 pub(crate) fn array_reordered(&self) -> bool {
95 self.end_and_flag & (HINTS_BIT | ARRAY_REORDERED_BIT) == (HINTS_BIT | ARRAY_REORDERED_BIT)
96 }
97
98 #[inline]
100 pub(crate) fn set_ignore_source_style(&mut self) {
101 self.end_and_flag |= HINTS_BIT | IGNORE_SOURCE_STYLE_BIT;
102 }
103
104 #[inline]
106 pub(crate) fn ignore_source_style(&self) -> bool {
107 self.end_and_flag & (HINTS_BIT | IGNORE_SOURCE_STYLE_BIT)
108 == (HINTS_BIT | IGNORE_SOURCE_STYLE_BIT)
109 }
110
111 #[inline]
112 pub(crate) fn set_expanded(&mut self) {
113 self.end_and_flag |= HINTS_BIT | EXPANDED_BIT;
114 }
115
116 #[inline]
117 pub(crate) fn is_expanded(&self) -> bool {
118 self.end_and_flag & (HINTS_BIT | EXPANDED_BIT) == (HINTS_BIT | EXPANDED_BIT)
119 }
120
121 #[inline]
122 pub(crate) fn clear_expanded(&mut self) {
123 self.end_and_flag &= !EXPANDED_BIT;
124 }
125
126 #[inline]
128 pub(crate) fn set_ignore_source_formatting_recursively(&mut self) {
129 self.end_and_flag |= HINTS_BIT | IGNORE_SOURCE_FORMATTING_RECURSIVELY_BIT;
130 }
131
132 #[inline]
134 pub(crate) fn ignore_source_formatting_recursively(&self) -> bool {
135 self.end_and_flag & (HINTS_BIT | IGNORE_SOURCE_FORMATTING_RECURSIVELY_BIT)
136 == (HINTS_BIT | IGNORE_SOURCE_FORMATTING_RECURSIVELY_BIT)
137 }
138}
139
140impl<'de> Item<'de> {
141 pub(crate) fn projected<'a>(&self, inputs: &[&'a Item<'a>]) -> Option<&'a Item<'a>> {
143 let index = self.meta.projected_index();
144 inputs.get(index as usize).copied()
145 }
146 pub(crate) fn set_reprojected_to_none(&mut self) {
147 self.meta.set_reprojected_to_none();
148 }
149 pub(crate) fn set_reprojected_index(&mut self, index: usize) -> bool {
150 self.meta.set_reprojected_index(index)
151 }
152 pub(crate) fn set_reprojected_full_match(&mut self) {
154 self.meta.set_reprojected_full_match();
155 }
156 pub(crate) fn is_reprojected_full_match(&self) -> bool {
158 self.meta.is_reprojected_full_match()
159 }
160
161 pub fn set_ignore_source_formatting_recursively(&mut self) {
166 self.meta.set_ignore_source_formatting_recursively();
167 }
168
169 #[must_use]
171 pub fn ignore_source_formatting_recursively(&self) -> bool {
172 self.meta.ignore_source_formatting_recursively()
173 }
174
175 #[inline]
179 pub(crate) fn is_subsection(&self) -> bool {
180 self.has_header_bit() || self.is_implicit_table() || self.is_aot()
181 }
182
183 #[inline]
184 #[cfg(test)]
185 pub(crate) fn set_flag(&mut self, flag: u32) {
186 self.meta.set_flag(flag);
187 }
188}
189
190impl<'de> Table<'de> {
191 pub fn set_ignore_source_order(&mut self) {
194 self.meta.set_ignore_source_order();
195 }
196
197 #[must_use]
199 pub fn ignore_source_order(&self) -> bool {
200 self.meta.ignore_source_order()
201 }
202
203 pub fn set_ignore_source_style(&mut self) {
207 self.meta.set_ignore_source_style();
208 }
209
210 #[must_use]
212 pub fn ignore_source_style(&self) -> bool {
213 self.meta.ignore_source_style()
214 }
215
216 #[must_use]
218 pub fn is_auto_style(&self) -> bool {
219 self.meta.is_auto_style()
220 }
221}
222
223impl<'de> Array<'de> {
224 #[must_use]
226 pub fn is_auto_style(&self) -> bool {
227 self.meta.is_auto_style()
228 }
229
230 #[must_use]
233 pub fn is_expanded(&self) -> bool {
234 self.meta.is_expanded()
235 }
236
237 pub fn set_expanded(&mut self) {
239 self.meta.set_expanded();
240 }
241
242 pub fn clear_expanded(&mut self) {
244 self.meta.clear_expanded();
245 }
246}