Skip to main content

qubit_codec/value/
decode_lifecycle_output.rs

1// =============================================================================
2//    Copyright (c) 2026 Haixing Hu.
3//
4//    SPDX-License-Identifier: Apache-2.0
5//
6//    Licensed under the Apache License, Version 2.0.
7// =============================================================================
8//! Owned output from a complete single-value decode lifecycle.
9
10/// Values produced by decode reset, the main decode, and decode finish.
11///
12/// This result keeps lifecycle output in phase order without allowing finish
13/// output to overwrite reset output.
14///
15/// # Type Parameters
16///
17/// - `V`: Logical value type produced by the codec.
18#[derive(Clone, Debug, Eq, Hash, PartialEq)]
19#[must_use]
20pub struct DecodeLifecycleOutput<V> {
21    /// Values emitted while resetting decode state.
22    reset: Vec<V>,
23    /// Main value decoded from the supplied input.
24    value: V,
25    /// Values emitted while finishing decode state.
26    finish: Vec<V>,
27}
28
29impl<V> DecodeLifecycleOutput<V> {
30    /// Creates owned output from the three decode lifecycle phases.
31    ///
32    /// # Parameters
33    ///
34    /// - `reset`: Values emitted while resetting decode state.
35    /// - `value`: Main value decoded from the supplied input.
36    /// - `finish`: Values emitted while finishing decode state.
37    ///
38    /// # Returns
39    ///
40    /// Returns output preserving all three lifecycle phases.
41    #[inline(always)]
42    pub(crate) fn new(reset: Vec<V>, value: V, finish: Vec<V>) -> Self {
43        Self { reset, value, finish }
44    }
45
46    /// Returns values emitted while resetting decode state.
47    ///
48    /// # Returns
49    ///
50    /// Returns the reset output in emission order.
51    #[inline(always)]
52    #[must_use]
53    pub fn reset(&self) -> &[V] {
54        &self.reset
55    }
56
57    /// Returns the main value decoded from the supplied input.
58    ///
59    /// # Returns
60    ///
61    /// Returns a shared reference to the main decoded value.
62    #[inline(always)]
63    #[must_use]
64    pub const fn value(&self) -> &V {
65        &self.value
66    }
67
68    /// Returns values emitted while finishing decode state.
69    ///
70    /// # Returns
71    ///
72    /// Returns the finish output in emission order.
73    #[inline(always)]
74    #[must_use]
75    pub fn finish(&self) -> &[V] {
76        &self.finish
77    }
78
79    /// Consumes this result and returns all lifecycle phases.
80    ///
81    /// # Returns
82    ///
83    /// Returns reset values, the main decoded value, and finish values.
84    #[inline(always)]
85    #[must_use]
86    pub fn into_parts(self) -> (Vec<V>, V, Vec<V>) {
87        (self.reset, self.value, self.finish)
88    }
89}