commonlibsse_ng\re\e/
ExtraCount.rs

1//! # ExtraCount
2use crate::re::BSExtraData::{BSExtraData, DerivedBSExtraData};
3use crate::re::ExtraDataType::ExtraDataType;
4use crate::re::offsets_rtti::RTTI_ExtraCount;
5use crate::re::offsets_vtable::VTABLE_ExtraCount;
6use crate::rel::id::VariantID;
7
8/// Represents extra data for item counts.
9///
10/// Inherits from `BSExtraData` and includes the item count.
11///
12/// # Memory Layout:
13/// - `__base`: Base class `BSExtraData`
14/// - `count`: The item count (0x10)
15/// - `pad12`: Padding to align with C++ structure (0x12)
16/// - `pad14`: Additional padding for alignment (0x14)
17#[repr(C)]
18pub struct ExtraCount {
19    /// Base class `BSExtraData`.
20    pub __base: BSExtraData,
21
22    /// The item count.
23    /// Offset: `0x10`
24    pub count: i16,
25
26    /// Padding for alignment.
27    /// Offset: `0x12`
28    pub pad12: u16,
29
30    /// Additional padding to match the C++ memory layout.
31    /// Offset: `0x14`
32    pub pad14: i32,
33}
34
35const _: () = {
36    assert!(core::mem::offset_of!(ExtraCount, __base) == 0x0);
37    assert!(core::mem::offset_of!(ExtraCount, count) == 0x10);
38    assert!(core::mem::offset_of!(ExtraCount, pad12) == 0x12);
39    assert!(core::mem::offset_of!(ExtraCount, pad14) == 0x14);
40    assert!(core::mem::size_of::<ExtraCount>() == 0x18);
41};
42
43impl Default for ExtraCount {
44    #[inline]
45    fn default() -> Self {
46        Self::new()
47    }
48}
49
50impl DerivedBSExtraData for ExtraCount {
51    #[inline]
52    fn get_extra_data(&self) -> &BSExtraData {
53        &self.__base
54    }
55
56    #[inline]
57    fn get_extra_data_type() -> ExtraDataType {
58        Self::EXTRA_DATA_TYPE
59    }
60}
61
62impl ExtraCount {
63    /// Address & offset of the runtime type information (RTTI) identifier.
64    pub const RTTI: VariantID = RTTI_ExtraCount;
65
66    /// Address & offset of the virtual function table.
67    pub const VTABLE: [VariantID; 1] = VTABLE_ExtraCount;
68
69    /// The `ExtraDataType` value for item counts.
70    pub const EXTRA_DATA_TYPE: ExtraDataType = ExtraDataType::Count;
71
72    /// Creates a new `ExtraCount` instance with a default count of 0.
73    #[inline]
74    pub const fn new() -> Self {
75        Self { __base: BSExtraData::new(), count: 0, pad12: 0, pad14: 0 }
76    }
77
78    /// Creates a new `ExtraCount` instance with a specific count.
79    #[inline]
80    pub const fn from_count(count: i16) -> Self {
81        Self { __base: BSExtraData::new(), count, pad12: 0, pad14: 0 }
82    }
83
84    /// Retrieves the extra data type, always returning `ExtraDataType::Count`.
85    #[inline]
86    pub const fn get_type(&self) -> ExtraDataType {
87        ExtraDataType::Count
88    }
89
90    /// Checks if this `ExtraCount` is not equal to another.
91    #[inline]
92    pub const fn is_not_equal(&self, rhs: &Self) -> bool {
93        self.count != rhs.count
94    }
95}
96
97/// The virtual function table for `ExtraCount`.
98///
99/// This struct defines function pointers to simulate the C++ virtual functions.
100#[repr(C)]
101pub struct ExtraCountVtbl {
102    /// Destructor function pointer.
103    pub CxxDrop: fn(this: &mut ExtraCount),
104
105    /// Function pointer for retrieving the extra data type.
106    pub GetType: fn(this: &ExtraCount) -> ExtraDataType,
107
108    /// Function pointer for equality check.
109    pub IsNotEqual: fn(this: &ExtraCount, rhs: &ExtraCount) -> bool,
110}
111
112impl Default for ExtraCountVtbl {
113    #[inline]
114    fn default() -> Self {
115        Self::new()
116    }
117}
118
119impl ExtraCountVtbl {
120    /// Creates a new default virtual table with stubbed functions.
121    pub const fn new() -> Self {
122        const fn CxxDrop(_this: &mut ExtraCount) {}
123
124        const fn GetType(_this: &ExtraCount) -> ExtraDataType {
125            ExtraCount::EXTRA_DATA_TYPE
126        }
127
128        const fn IsNotEqual(this: &ExtraCount, rhs: &ExtraCount) -> bool {
129            this.count != rhs.count
130        }
131
132        Self { CxxDrop, GetType, IsNotEqual }
133    }
134}