Struct icu_datetime::provider::PackedPatternsV1
source · pub struct PackedPatternsV1<'data> {
pub header: u32,
pub elements: VarZeroVec<'data, PluralElementsPackedULE<ZeroSlice<PatternItem>>>,
}
Expand description
Main data struct for packed datetime patterns.
📏 This item has a stack size of 32 bytes on the stable toolchain at release date.
§Variants
This supports a set of “standard” patterns plus up to two “variants”. The variants are currently used by year formatting:
- Standard: Year, which could be partial precision (2-digit Gregorain)
- Variant 0: Full Year, which is always full precision
- Variant 1: Year With Era
Variants should be used when the pattern could depend on the value being
formatted. For example, with YearStyle::Auto
, any of these three
patterns could be selected based on the year value.
§Representation
Currently, there are at most 9 patterns that need to be stored together, named according to this table:
Standard | Variant 0 | Variant 1 | |
---|---|---|---|
Long | La | Lb | Lc |
Medium | Ma | Mb | Mc |
Short | Sa | Sb | Sc |
The header byte encodes which pattern in the patterns array corresponds to a particular cell in the table. It contains the following information:
- Bits 0-1: “LMS” value of the standard column
- Bit 2: “Q” value: 1 for directly-indexed variants; 0 for per-cell offsets
- Bits 3-20: Packed offset into patterns table for each variant cell
- Bits 21-31: unused/reserved
The LMS value determines which pattern index is used for the first column:
LMS Value | Long Index | Medium Index | Short Index |
---|---|---|---|
0 (L=M=S) | 0 | 0 | 0 |
1 (L, M=S) | 0 | 1 | 1 |
2 (L=M, S) | 0 | 0 | 1 |
3 (L, M, S) | 0 | 1 | 2 |
If bit 2 is 1 (Q=1), it means there is one pattern per table cell,
with the index offset by the short index S
from the table above.
However, this requires storing multiple, possibly duplicate, patterns in
the packed structure. The more common case is Q=0 and then to store
per-cell offsets in chunks of 3 bits per cell:
- Chunk = 0: Inherit according to the table below
- Chunk = 1-7: Use pattern index Chunk - 1
This is summarized below:
Cell in Table | Q=1 Pattern Index | Q=0 Header Bits | Inheritance |
---|---|---|---|
Lb | S + 1 | 3-5 | La |
Mb | S + 2 | 6-8 | Ma |
Sb | S + 3 | 9-11 | Sa |
Lc | S + 4 | 12-14 | La |
Mc | S + 5 | 15-17 | Ma |
Sc | S + 6 | 18-20 | Sa |
As a result, if there are no variants, bits 2 and higher will be all zero, making the header int suitable for varint packing, such as that used by postcard and other size-optimized serialization formats.
Fields§
§header: u32
An encoding of which standard/variant cell corresponds to which entry in the patterns table. See class docs.
elements: VarZeroVec<'data, PluralElementsPackedULE<ZeroSlice<PatternItem>>>
The list of patterns. Length should be between 1 and 9, depending on the header.
Implementations§
source§impl PackedPatternsV1<'_>
impl PackedPatternsV1<'_>
sourcepub fn to_builder(&self) -> PackedPatternsBuilder<'_>
pub fn to_builder(&self) -> PackedPatternsBuilder<'_>
Converts this packed data to a builder that can be mutated.
Trait Implementations§
source§impl<'data> Bake for PackedPatternsV1<'data>
impl<'data> Bake for PackedPatternsV1<'data>
source§fn bake(&self, env: &CrateEnv) -> TokenStream
fn bake(&self, env: &CrateEnv) -> TokenStream
source§impl<'data> BakeSize for PackedPatternsV1<'data>
impl<'data> BakeSize for PackedPatternsV1<'data>
source§fn borrows_size(&self) -> usize
fn borrows_size(&self) -> usize
source§impl<'data> Clone for PackedPatternsV1<'data>
impl<'data> Clone for PackedPatternsV1<'data>
source§fn clone(&self) -> PackedPatternsV1<'data>
fn clone(&self) -> PackedPatternsV1<'data>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<'data> Debug for PackedPatternsV1<'data>
impl<'data> Debug for PackedPatternsV1<'data>
source§impl<'de, 'data> Deserialize<'de> for PackedPatternsV1<'data>where
'de: 'data,
impl<'de, 'data> Deserialize<'de> for PackedPatternsV1<'data>where
'de: 'data,
source§fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
source§impl<'data> PartialEq for PackedPatternsV1<'data>
impl<'data> PartialEq for PackedPatternsV1<'data>
source§impl Serialize for PackedPatternsV1<'_>
impl Serialize for PackedPatternsV1<'_>
source§impl<'a> Yokeable<'a> for PackedPatternsV1<'static>
impl<'a> Yokeable<'a> for PackedPatternsV1<'static>
source§type Output = PackedPatternsV1<'a>
type Output = PackedPatternsV1<'a>
Self
with the 'static
replaced with 'a
, i.e. Self<'a>
source§fn transform_owned(self) -> Self::Output
fn transform_owned(self) -> Self::Output
source§unsafe fn make(this: Self::Output) -> Self
unsafe fn make(this: Self::Output) -> Self
Self<'a>
’s lifetime. Read moresource§fn transform_mut<F>(&'a mut self, f: F)where
F: 'static + for<'b> FnOnce(&'b mut Self::Output),
fn transform_mut<F>(&'a mut self, f: F)where
F: 'static + for<'b> FnOnce(&'b mut Self::Output),
self
between &'a mut Self<'static>
and &'a mut Self<'a>
,
and pass it to f
. Read moresource§impl<'zf, 'zf_inner> ZeroFrom<'zf, PackedPatternsV1<'zf_inner>> for PackedPatternsV1<'zf>
impl<'zf, 'zf_inner> ZeroFrom<'zf, PackedPatternsV1<'zf_inner>> for PackedPatternsV1<'zf>
source§fn zero_from(this: &'zf PackedPatternsV1<'zf_inner>) -> Self
fn zero_from(this: &'zf PackedPatternsV1<'zf_inner>) -> Self
C
into a struct that may retain references into C
.impl<'data> Eq for PackedPatternsV1<'data>
impl<'data> StructuralPartialEq for PackedPatternsV1<'data>
Auto Trait Implementations§
impl<'data> Freeze for PackedPatternsV1<'data>
impl<'data> RefUnwindSafe for PackedPatternsV1<'data>
impl<'data> Send for PackedPatternsV1<'data>
impl<'data> Sync for PackedPatternsV1<'data>
impl<'data> Unpin for PackedPatternsV1<'data>
impl<'data> UnwindSafe for PackedPatternsV1<'data>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more