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}