ps_datachunk/shared/
mod.rs1use 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}