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//! Alle Flags sind 16-bit Bitmasks. Die Bits sind spec-definiert und
6//! werden wire-format-identisch enkodiert.
7
8/// Flags fuer einen Struct-Typ (StructTypeFlag §7.3.4.5).
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
10pub struct StructTypeFlag(pub u16);
11
12impl StructTypeFlag {
13    /// Extensibility = FINAL (strikte Gleichheit bei Assignability).
14    pub const IS_FINAL: u16 = 1 << 0;
15    /// Extensibility = APPENDABLE (Prefix-Match erlaubt).
16    pub const IS_APPENDABLE: u16 = 1 << 1;
17    /// Extensibility = MUTABLE (ID-basiertes Matching).
18    pub const IS_MUTABLE: u16 = 1 << 2;
19    /// Als `@nested` markiert — nicht selbstaendig topic-fuehrig.
20    pub const IS_NESTED: u16 = 1 << 3;
21    /// Member-IDs werden aus Namen gehasht (`@autoid(HASH)`).
22    pub const IS_AUTOID_HASH: u16 = 1 << 4;
23
24    /// Leer.
25    #[must_use]
26    pub const fn empty() -> Self {
27        Self(0)
28    }
29
30    /// Testet ob ein Bit gesetzt ist.
31    #[must_use]
32    pub const fn has(self, bit: u16) -> bool {
33        (self.0 & bit) != 0
34    }
35}
36
37/// Flags fuer einen 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` — hat Defaultwert (Unions).
55    pub const IS_DEFAULT: u16 = 1 << 6;
56
57    /// Leer.
58    #[must_use]
59    pub const fn empty() -> Self {
60        Self(0)
61    }
62
63    /// Testet ein Bit.
64    #[must_use]
65    pub const fn has(self, bit: u16) -> bool {
66        (self.0 & bit) != 0
67    }
68}
69
70/// Flags fuer einen Union-Typ.
71#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
72pub struct UnionTypeFlag(pub u16);
73
74/// Flags fuer einen 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 der Union.
80    pub const IS_DEFAULT: u16 = 1 << 6;
81    /// Leer.
82    #[must_use]
83    pub const fn empty() -> Self {
84        Self(0)
85    }
86}
87
88/// Flags fuer einen Union-Discriminator.
89#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
90pub struct UnionDiscriminatorFlag(pub u16);
91
92/// Flags fuer Enum-Typ.
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). Wenn gesetzt,
98    /// duerfen Compat-Vergleiche zwischen Enum-Literalen den Name-Hash
99    /// ignorieren und nur den Ordinalwert pruefen.
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 fuer 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 fuer Bitmask-Typ.
125#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
126pub struct BitmaskTypeFlag(pub u16);
127
128/// Flags fuer Bitflag (Bitmask-Member).
129#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
130pub struct BitflagFlag(pub u16);
131
132/// Flags fuer Collection (Sequence/Array/Map).
133#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
134pub struct CollectionTypeFlag(pub u16);
135
136/// Flags fuer Collection-Element.
137#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
138pub struct CollectionElementFlag(pub u16);
139
140/// Flags fuer Alias-Typ.
141#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
142pub struct AliasTypeFlag(pub u16);
143
144/// Flags fuer Alias-Member (ungebraucht in Minimal, für Wire-Symmetry).
145#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
146pub struct AliasMemberFlag(pub u16);
147
148/// Flags fuer Annotation-Typ.
149#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
150pub struct AnnotationTypeFlag(pub u16);
151
152/// Flags fuer Annotation-Parameter.
153#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
154pub struct AnnotationParameterFlag(pub u16);
155
156/// Flags fuer Bitset-Typ.
157#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
158pub struct BitsetTypeFlag(pub u16);
159
160/// Flags fuer Bitfield (Bitset-Member).
161#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
162pub struct BitfieldFlag(pub u16);