Skip to main content

zerodds_types/type_object/
flags.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3//! Type/member flags (XTypes 1.3 §7.3.4.5).
4//!
5//! All flags are 16-bit bitmasks. The bits are spec-defined and are
6//! encoded wire-format-identically.
7
8/// Flags for a struct type (StructTypeFlag §7.3.4.5).
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
10pub struct StructTypeFlag(pub u16);
11
12impl StructTypeFlag {
13    /// Extensibility = FINAL (strict equality for assignability).
14    pub const IS_FINAL: u16 = 1 << 0;
15    /// Extensibility = APPENDABLE (prefix match allowed).
16    pub const IS_APPENDABLE: u16 = 1 << 1;
17    /// Extensibility = MUTABLE (ID-based matching).
18    pub const IS_MUTABLE: u16 = 1 << 2;
19    /// Marked as `@nested` — not a standalone topic type.
20    pub const IS_NESTED: u16 = 1 << 3;
21    /// Member IDs are hashed from names (`@autoid(HASH)`).
22    pub const IS_AUTOID_HASH: u16 = 1 << 4;
23
24    /// Empty.
25    #[must_use]
26    pub const fn empty() -> Self {
27        Self(0)
28    }
29
30    /// Tests whether a bit is set.
31    #[must_use]
32    pub const fn has(self, bit: u16) -> bool {
33        (self.0 & bit) != 0
34    }
35}
36
37/// Flags for a struct member (StructMemberFlag §7.3.4.5).
38#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
39pub struct StructMemberFlag(pub u16);
40
41impl StructMemberFlag {
42    /// Try-construct bit 1 (§7.2.4.4.1).
43    pub const TRY_CONSTRUCT1: u16 = 1 << 0;
44    /// Try-construct bit 2.
45    pub const TRY_CONSTRUCT2: u16 = 1 << 1;
46    /// `@external` — indirect storage.
47    pub const IS_EXTERNAL: u16 = 1 << 2;
48    /// `@optional`.
49    pub const IS_OPTIONAL: u16 = 1 << 3;
50    /// `@must_understand`.
51    pub const IS_MUST_UNDERSTAND: u16 = 1 << 4;
52    /// `@key`.
53    pub const IS_KEY: u16 = 1 << 5;
54    /// `@default` — has a default value (unions).
55    pub const IS_DEFAULT: u16 = 1 << 6;
56
57    /// Empty.
58    #[must_use]
59    pub const fn empty() -> Self {
60        Self(0)
61    }
62
63    /// Tests a bit.
64    #[must_use]
65    pub const fn has(self, bit: u16) -> bool {
66        (self.0 & bit) != 0
67    }
68}
69
70/// Flags for a union type.
71#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
72pub struct UnionTypeFlag(pub u16);
73
74/// Flags for a union member (§7.3.4.5 UnionMemberFlag).
75#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
76pub struct UnionMemberFlag(pub u16);
77
78impl UnionMemberFlag {
79    /// TryConstruct = DISCARD (the default TryConstructKind for a member,
80    /// §7.3.4.5). Set on every union member by the vendors (byte-verified
81    /// against Cyclone + FastDDS).
82    pub const TRY_CONSTRUCT1: u16 = 1 << 0;
83    /// Default case of the union.
84    pub const IS_DEFAULT: u16 = 1 << 6;
85    /// Empty.
86    #[must_use]
87    pub const fn empty() -> Self {
88        Self(0)
89    }
90}
91
92/// Flags for a union discriminator.
93#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
94pub struct UnionDiscriminatorFlag(pub u16);
95
96impl UnionDiscriminatorFlag {
97    /// TryConstruct = DISCARD (default TryConstructKind, §7.3.4.5).
98    pub const TRY_CONSTRUCT1: u16 = 1 << 0;
99    /// The discriminator is always must-understand (§7.3.4.4.2): a reader
100    /// that does not understand the discriminator cannot interpret the union.
101    pub const IS_MUST_UNDERSTAND: u16 = 1 << 4;
102    /// The default discriminator flags as emitted by Cyclone + FastDDS:
103    /// `IS_MUST_UNDERSTAND | TRY_CONSTRUCT1` = 0x11 (byte-verified).
104    #[must_use]
105    pub const fn discriminator_default() -> Self {
106        Self(Self::IS_MUST_UNDERSTAND | Self::TRY_CONSTRUCT1)
107    }
108}
109
110/// Flags for an enum type.
111#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
112pub struct EnumTypeFlag(pub u16);
113
114impl EnumTypeFlag {
115    /// `@ignore_literal_names` (XTypes 1.3 §7.2.4.4.7). When set,
116    /// compatibility comparisons between enum literals may ignore the
117    /// name hash and check only the ordinal value.
118    pub const IGNORE_LITERAL_NAMES: u16 = 1 << 0;
119
120    /// Empty.
121    #[must_use]
122    pub const fn empty() -> Self {
123        Self(0)
124    }
125
126    /// Bit test.
127    #[must_use]
128    pub const fn has(self, bit: u16) -> bool {
129        (self.0 & bit) != 0
130    }
131}
132
133/// Flags for an enum literal (`@default_literal` bit).
134#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
135pub struct EnumLiteralFlag(pub u16);
136
137impl EnumLiteralFlag {
138    /// `@default_literal`.
139    pub const IS_DEFAULT_LITERAL: u16 = 1 << 0;
140}
141
142/// Flags for a bitmask type.
143#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
144pub struct BitmaskTypeFlag(pub u16);
145
146/// Flags for a bitflag (bitmask member).
147#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
148pub struct BitflagFlag(pub u16);
149
150/// Flags for a collection (sequence/array/map).
151#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
152pub struct CollectionTypeFlag(pub u16);
153
154/// Flags for a collection element.
155#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
156pub struct CollectionElementFlag(pub u16);
157
158/// Flags for an alias type.
159#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
160pub struct AliasTypeFlag(pub u16);
161
162/// Flags for an alias member (unused in minimal, for wire symmetry).
163#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
164pub struct AliasMemberFlag(pub u16);
165
166/// Flags for an annotation type.
167#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
168pub struct AnnotationTypeFlag(pub u16);
169
170/// Flags for an annotation parameter.
171#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
172pub struct AnnotationParameterFlag(pub u16);
173
174/// Flags for a bitset type.
175#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
176pub struct BitsetTypeFlag(pub u16);
177
178/// Flags for a bitfield (bitset member).
179#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
180pub struct BitfieldFlag(pub u16);