| 15 | |
| 16 | impl<T: SimpleSerialize> TreeMapSerialize for TreeMapNode<T> { |
| 17 | fn serialize( |
| 18 | &self, |
| 19 | dim_bufman: &BufferManager, |
| 20 | data_bufmans: &BufferManagerFactory<VersionNumber>, |
| 21 | cursor: u64, |
| 22 | ) -> Result<u32, BufIoError> { |
| 23 | let offset_read_guard = self.offset.read(); |
| 24 | if let Some(offset) = *offset_read_guard { |
| 25 | dim_bufman.seek_with_cursor(cursor, offset.0 as u64 + 2)?; |
| 26 | for (idx, child) in self.children.items.iter().enumerate() { |
| 27 | let opt_child = unsafe { child.load(Ordering::Relaxed).as_ref() }; |
| 28 | let Some(child) = opt_child else { |
| 29 | dim_bufman.seek_with_cursor(cursor, offset.0 as u64 + 2 + (idx as u64 * 4))?; |
| 30 | dim_bufman.update_u32_with_cursor(cursor, u32::MAX)?; |
| 31 | continue; |
| 32 | }; |
| 33 | let child_offset = child.serialize(dim_bufman, data_bufmans, cursor)?; |
| 34 | dim_bufman.seek_with_cursor(cursor, offset.0 as u64 + 2 + (idx as u64 * 4))?; |
| 35 | dim_bufman.update_u32_with_cursor(cursor, child_offset)?; |
| 36 | } |
| 37 | |
| 38 | if self.dirty.swap(false, Ordering::Relaxed) { |
| 39 | let quotient_offset = self.quotients.serialize(dim_bufman, data_bufmans, cursor)?; |
| 40 | dim_bufman.seek_with_cursor(cursor, offset.0 as u64 + 34)?; |
| 41 | dim_bufman.update_u32_with_cursor(cursor, quotient_offset)?; |
| 42 | } |
| 43 | |
| 44 | return Ok(offset.0); |
| 45 | } |
| 46 | drop(offset_read_guard); |
| 47 | let mut offset_write_guard = self.offset.write(); |
| 48 | if let Some(offset) = *offset_write_guard { |
| 49 | dim_bufman.seek_with_cursor(cursor, offset.0 as u64 + 2)?; |
| 50 | for (idx, child) in self.children.items.iter().enumerate() { |
| 51 | let opt_child = unsafe { child.load(Ordering::Relaxed).as_ref() }; |
| 52 | let Some(child) = opt_child else { |
| 53 | dim_bufman.seek_with_cursor(cursor, offset.0 as u64 + 2 + (idx as u64 * 4))?; |
| 54 | dim_bufman.update_u32_with_cursor(cursor, u32::MAX)?; |
| 55 | continue; |
| 56 | }; |
| 57 | let child_offset = child.serialize(dim_bufman, data_bufmans, cursor)?; |
| 58 | dim_bufman.seek_with_cursor(cursor, offset.0 as u64 + 2 + (idx as u64 * 4))?; |
| 59 | dim_bufman.update_u32_with_cursor(cursor, child_offset)?; |
| 60 | } |
| 61 | |
| 62 | if self.dirty.swap(false, Ordering::Relaxed) { |
| 63 | let quotient_offset = self.quotients.serialize(dim_bufman, data_bufmans, cursor)?; |
| 64 | dim_bufman.seek_with_cursor(cursor, offset.0 as u64 + 34)?; |
| 65 | dim_bufman.update_u32_with_cursor(cursor, quotient_offset)?; |
| 66 | } |
| 67 | |
| 68 | return Ok(offset.0); |
| 69 | } |
| 70 | let mut buf = Vec::with_capacity(38); |
| 71 | buf.extend(self.node_idx.to_le_bytes()); |
| 72 | for child in &self.children.items { |
| 73 | let opt_child = unsafe { child.load(Ordering::Relaxed).as_ref() }; |
| 74 | let Some(child) = opt_child else { |