1use crate::rbase::consts::{K_IS_ON_HEAP, K_IS_REFERENCED};
2use crate::rbytes::rbuffer::RBuffer;
3use crate::rbytes::wbuffer::WBuffer;
4use crate::rbytes::{Marshaler, Unmarshaler};
5use crate::root::traits;
6use crate::rvers;
7
8#[derive(Debug, Clone)]
9pub(crate) struct Object {
10 id: u32,
11 bits: u32,
12}
13
14impl Object {
15 fn test_bits(&self, bits: u32) -> bool {
16 self.bits & bits != 0
17 }
18}
19impl traits::Object for Object {
20 fn class(&self) -> &'_ str {
21 "TObject"
22 }
23}
24
25impl Default for Object {
26 fn default() -> Self {
27 Object {
28 id: 0x0,
29 bits: 0x3000000,
30 }
31 }
32}
33
34impl Unmarshaler for Object {
35 fn unmarshal(&mut self, r: &mut RBuffer) -> crate::rbytes::Result<()> {
36 r.skip_version("")?;
37 self.id = r.read_u32()?;
38 self.bits = r.read_u32()?;
39
40 self.bits |= K_IS_ON_HEAP;
41
42 if self.test_bits(K_IS_REFERENCED) {
43 r.read_u16()?;
44 }
45
46 Ok(())
47 }
48}
49
50impl Marshaler for Object {
51 fn marshal(&self, w: &mut WBuffer) -> crate::rbytes::Result<i64> {
52 let n = w.pos();
53 w.write_u16(rvers::OBJECT as u16)?;
54
55 if self.test_bits(K_IS_REFERENCED) {
56 let uid = self.id & 0xffffff;
57 w.write_u32(uid)?;
58 w.write_u32(self.bits)?;
59 w.write_u16(0x0)?;
60 } else {
61 w.write_u32(self.id)?;
62 w.write_u32(self.bits)?;
63 }
64
65 Ok(w.pos() - n)
67 }
68}