qubit_codec/value/decode_lifecycle_progress.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//! Progress from a scratch-backed single-value decode lifecycle.
9
10/// Main decoded value and lifecycle output lengths written to caller storage.
11///
12/// # Type Parameters
13///
14/// - `V`: Logical value type produced by the codec.
15///
16/// # Examples
17///
18/// ```
19/// use qubit_codec::DecodeLifecycleProgress;
20///
21/// fn inspect<V>(progress: &DecodeLifecycleProgress<V>) -> usize {
22/// progress.reset_written() + progress.finish_written()
23/// }
24/// ```
25#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
26#[must_use]
27pub struct DecodeLifecycleProgress<V> {
28 /// Main value decoded from the supplied input.
29 value: V,
30 /// Number of reset values written to caller storage.
31 reset_written: usize,
32 /// Number of finish values written to caller storage.
33 finish_written: usize,
34}
35
36impl<V> DecodeLifecycleProgress<V> {
37 /// Creates progress for a completed decode lifecycle.
38 ///
39 /// # Parameters
40 ///
41 /// - `value`: Main value decoded from the supplied input.
42 /// - `reset_written`: Number of reset values written to caller storage.
43 /// - `finish_written`: Number of finish values written to caller storage.
44 ///
45 /// # Returns
46 ///
47 /// Returns completed lifecycle progress.
48 #[inline(always)]
49 pub(crate) const fn new(value: V, reset_written: usize, finish_written: usize) -> Self {
50 Self {
51 value,
52 reset_written,
53 finish_written,
54 }
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 the number of reset values written to caller storage.
69 ///
70 /// # Returns
71 ///
72 /// Returns the initialized reset output length.
73 #[inline(always)]
74 #[must_use]
75 pub const fn reset_written(&self) -> usize {
76 self.reset_written
77 }
78
79 /// Returns the number of finish values written to caller storage.
80 ///
81 /// # Returns
82 ///
83 /// Returns the initialized finish output length.
84 #[inline(always)]
85 #[must_use]
86 pub const fn finish_written(&self) -> usize {
87 self.finish_written
88 }
89
90 /// Consumes this progress and returns its components.
91 ///
92 /// # Returns
93 ///
94 /// Returns the main value, reset output length, and finish output length.
95 #[inline(always)]
96 #[must_use]
97 pub fn into_parts(self) -> (V, usize, usize) {
98 (self.value, self.reset_written, self.finish_written)
99 }
100}