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}