1use std::ops::{Deref, Range};
2
3use ps_buffer::{Buffer, SharedBuffer};
4
5use crate::cow::Cow;
6
7#[derive(Debug, Hash, PartialEq, Eq)]
8pub struct Codeword<'lt> {
9 pub codeword: Cow<'lt>,
10 pub range: Range<usize>,
11}
12
13impl<'lt> Codeword<'lt> {
14 #[must_use]
15 pub fn into_inner(self) -> Cow<'lt> {
16 self.codeword
17 }
18}
19
20impl Deref for Codeword<'_> {
21 type Target = [u8];
22
23 fn deref(&self) -> &Self::Target {
24 &self.codeword[self.range.clone()]
25 }
26}
27
28impl<'lt> From<Cow<'lt>> for Codeword<'lt> {
29 fn from(value: Cow<'lt>) -> Self {
30 let range = 0..value.len();
31 let codeword = value;
32
33 Self { codeword, range }
34 }
35}
36
37impl<'lt> From<&'lt [u8]> for Codeword<'lt> {
38 fn from(value: &'lt [u8]) -> Self {
39 let range = 0..value.len();
40 let codeword = value.into();
41
42 Self { codeword, range }
43 }
44}
45
46impl From<Buffer> for Codeword<'_> {
47 fn from(value: Buffer) -> Self {
48 let range = 0..value.len();
49 let codeword = value.into();
50
51 Self { codeword, range }
52 }
53}
54
55impl From<SharedBuffer> for Codeword<'_> {
56 fn from(value: SharedBuffer) -> Self {
57 let range = 0..value.len();
58 let codeword = value.into();
59
60 Self { codeword, range }
61 }
62}
63
64impl AsRef<[u8]> for Codeword<'_> {
65 fn as_ref(&self) -> &[u8] {
66 self
67 }
68}