ps_datachunk/shared/
mod.rs

1use crate::DataChunk;
2use crate::DataChunkTrait;
3use ps_hash::Hash;
4use std::sync::Arc;
5
6pub struct SharedDataChunk {
7    data: Arc<[u8]>,
8    hash: Arc<Hash>,
9}
10
11impl SharedDataChunk {
12    pub fn data(&self) -> Arc<[u8]> {
13        self.data.clone()
14    }
15
16    pub fn hash(&self) -> Arc<Hash> {
17        self.hash.clone()
18    }
19}
20
21impl DataChunkTrait for SharedDataChunk {
22    fn data_ref(&self) -> &[u8] {
23        &self.data
24    }
25
26    fn hash_ref(&self) -> &[u8] {
27        self.hash.as_bytes()
28    }
29
30    fn hash(&self) -> Arc<Hash> {
31        self.hash.clone()
32    }
33
34    fn to_owned(&self) -> crate::OwnedDataChunk {
35        crate::OwnedDataChunk::from_data_ref_and_hash(self.data_ref(), self.hash())
36    }
37}
38
39impl SharedDataChunk {
40    pub fn from_data_and_hash(data: Arc<[u8]>, hash: Arc<Hash>) -> Self {
41        Self { data, hash }
42    }
43
44    pub fn from_data(data: Arc<[u8]>) -> Self {
45        let hash = Arc::from(ps_hash::hash(&data));
46
47        Self::from_data_and_hash(data, hash)
48    }
49}
50
51impl From<Arc<[u8]>> for SharedDataChunk {
52    fn from(data: Arc<[u8]>) -> Self {
53        Self::from_data(data)
54    }
55}
56
57impl From<&Arc<[u8]>> for SharedDataChunk {
58    fn from(data: &Arc<[u8]>) -> Self {
59        Self::from_data(data.clone())
60    }
61}
62
63impl<'lt> From<Arc<[u8]>> for DataChunk<'lt> {
64    fn from(data: Arc<[u8]>) -> Self {
65        DataChunk::Shared(data.into())
66    }
67}
68
69impl<'lt> From<&Arc<[u8]>> for DataChunk<'lt> {
70    fn from(data: &Arc<[u8]>) -> Self {
71        DataChunk::Shared(data.into())
72    }
73}