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 {
44            reset,
45            value,
46            finish,
47        }
48    }
49
50    /// Returns values emitted while resetting decode state.
51    ///
52    /// # Returns
53    ///
54    /// Returns the reset output in emission order.
55    #[inline(always)]
56    #[must_use]
57    pub fn reset(&self) -> &[V] {
58        &self.reset
59    }
60
61    /// Returns the main value decoded from the supplied input.
62    ///
63    /// # Returns
64    ///
65    /// Returns a shared reference to the main decoded value.
66    #[inline(always)]
67    #[must_use]
68    pub const fn value(&self) -> &V {
69        &self.value
70    }
71
72    /// Returns values emitted while finishing decode state.
73    ///
74    /// # Returns
75    ///
76    /// Returns the finish output in emission order.
77    #[inline(always)]
78    #[must_use]
79    pub fn finish(&self) -> &[V] {
80        &self.finish
81    }
82
83    /// Consumes this result and returns all lifecycle phases.
84    ///
85    /// # Returns
86    ///
87    /// Returns reset values, the main decoded value, and finish values.
88    #[inline(always)]
89    #[must_use]
90    pub fn into_parts(self) -> (Vec<V>, V, Vec<V>) {
91        (self.reset, self.value, self.finish)
92    }
93}