Skip to main content

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}