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    /// Default case of the union.
80    pub const IS_DEFAULT: u16 = 1 << 6;
81    /// Empty.
82    #[must_use]
83    pub const fn empty() -> Self {
84        Self(0)
85    }
86}
87
88/// Flags for a union discriminator.
89#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
90pub struct UnionDiscriminatorFlag(pub u16);
91
92/// Flags for an enum type.
93#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
94pub struct EnumTypeFlag(pub u16);
95
96impl EnumTypeFlag {
97    /// `@ignore_literal_names` (XTypes 1.3 §7.2.4.4.7). When set,
98    /// compatibility comparisons between enum literals may ignore the
99    /// name hash and check only the ordinal value.
100    pub const IGNORE_LITERAL_NAMES: u16 = 1 << 0;
101
102    /// Empty.
103    #[must_use]
104    pub const fn empty() -> Self {
105        Self(0)
106    }
107
108    /// Bit test.
109    #[must_use]
110    pub const fn has(self, bit: u16) -> bool {
111        (self.0 & bit) != 0
112    }
113}
114
115/// Flags for an enum literal (`@default_literal` bit).
116#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
117pub struct EnumLiteralFlag(pub u16);
118
119impl EnumLiteralFlag {
120    /// `@default_literal`.
121    pub const IS_DEFAULT_LITERAL: u16 = 1 << 0;
122}
123
124/// Flags for a bitmask type.
125#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
126pub struct BitmaskTypeFlag(pub u16);
127
128/// Flags for a bitflag (bitmask member).
129#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
130pub struct BitflagFlag(pub u16);
131
132/// Flags for a collection (sequence/array/map).
133#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
134pub struct CollectionTypeFlag(pub u16);
135
136/// Flags for a collection element.
137#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
138pub struct CollectionElementFlag(pub u16);
139
140/// Flags for an alias type.
141#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
142pub struct AliasTypeFlag(pub u16);
143
144/// Flags for an alias member (unused in minimal, for wire symmetry).
145#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
146pub struct AliasMemberFlag(pub u16);
147
148/// Flags for an annotation type.
149#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
150pub struct AnnotationTypeFlag(pub u16);
151
152/// Flags for an annotation parameter.
153#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
154pub struct AnnotationParameterFlag(pub u16);
155
156/// Flags for a bitset type.
157#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
158pub struct BitsetTypeFlag(pub u16);
159
160/// Flags for a bitfield (bitset member).
161#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
162pub struct BitfieldFlag(pub u16);