Skip to main content

MapLengthPolicy

Enum MapLengthPolicy 

Source
pub enum MapLengthPolicy {
    SequenceEquivalent,
    Rule15Omits,
}
Expand description

Whether a delimited map carries an entry count.

This policy exists because XTypes 1.3 contradicts itself, not because two implementations were measured disagreeing. Nothing in crates/ast-layout/tests/fixtures/vendor_bytes.md has a map in it, so neither shape below is verified against a vendor.

§7.4.1.1.4 defines a map by an equivalence: it “shall be serialized as if” it were sequence<MapEntry_<key_type>_<value_type>>. A sequence under XCDR2 is rule (12) of §7.4.3.5.3, DHEADER then O.length then the elements. So the equivalence yields both words.

Rule (15) of the same clause, which is the rule written for MAP_TYPE itself under XCDR2, writes DHEADER and then the pairs — with no O.length. Rules (14) and (16), the primitive-map and the XCDR1 cases, both write O.length and no delimiter, so the omission is only in (15).

The two readings differ by four bytes. Both are decodable — with a delimiter a reader can consume entries until the byte extent is used — which is why neither can be ruled out from the stream alone.

§Both are in the field

Measured on 2026-08-09. Neither C generator parses map, so the implementations that can be asked are eProsima Fast DDS and OpenDDS 3.34.0, and they took one reading each. @final struct { map<long, Cell> entries; long tail; } with one entry 5 -> {1, 2}, XCDR2 little endian: Fast DDS writes 10000000 01000000 05000000 01000000 02000000 07000000 and OpenDDS writes 0c000000 05000000 01000000 02000000 07000000. Under XCDR1, where neither delimits, the two are identical. crates/ast-layout/tests/fixtures/vendor_bytes.md, “Where the three cannot answer”, has the run and a second shape.

Variants§

§

SequenceEquivalent

Write the entry count whether or not a delimiter precedes it.

The default, because it is the reading under which §7.4.1.1.4’s equivalence holds, because it is the only one of the two that makes a map’s bytes the same shape as the sequence the clause says it is, and because it is what Fast DDS writes.

§

Rule15Omits

Omit the entry count when the map is delimited, as rule (15) is written.

OpenDDS’s reading: its generated operator<< calls write_delimiter under XCDR2 and the << length in the else branch under XCDR1, so the count and the delimiter are alternatives rather than both.

Implementations§

Source§

impl MapLengthPolicy

Source

pub const ALL: [Self; 2]

Both readings.

Source

pub const fn is_default(self) -> bool

Whether this is the default.

Source

pub const fn as_str(self) -> &'static str

Short name, for configuration and diagnostics.

Source

pub fn parse(value: &str) -> Option<Self>

Parse a configuration value.

An unknown value returns None rather than the default: a typo in a wire-affecting setting must be loud.

Trait Implementations§

Source§

impl Clone for MapLengthPolicy

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for MapLengthPolicy

Source§

impl Debug for MapLengthPolicy

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MapLengthPolicy

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Eq for MapLengthPolicy

Source§

impl Hash for MapLengthPolicy

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for MapLengthPolicy

Source§

fn cmp(&self, other: &Self) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 (const: unstable) · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 (const: unstable) · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 (const: unstable) · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

fn clamp_to<R>(self, range: R) -> Self
where Self: Sized, R: ClampBounds<Self>,

🔬This is a nightly-only experimental API. (clamp_to)
Restrict a value to a certain range. Read more
Source§

impl PartialEq for MapLengthPolicy

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl PartialOrd for MapLengthPolicy

Source§

fn partial_cmp(&self, other: &Self) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 (const: unstable) · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 (const: unstable) · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 (const: unstable) · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 (const: unstable) · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl StructuralPartialEq for MapLengthPolicy

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.