1use std::{io::Read, ops::Deref, rc::Rc, sync::Arc};
2
3use gix_hash::ObjectId;
4
5use crate::{Kind, WriteTo};
6
7impl<T> crate::Write for &T
8where
9 T: crate::Write,
10{
11 fn write(&self, object: &dyn WriteTo) -> Result<ObjectId, crate::write::Error> {
12 (*self).write(object)
13 }
14
15 fn write_buf(&self, object: Kind, from: &[u8]) -> Result<ObjectId, crate::write::Error> {
16 (*self).write_buf(object, from)
17 }
18
19 fn write_buf_with_known_id(
20 &self,
21 object: Kind,
22 from: &[u8],
23 id: ObjectId,
24 ) -> Result<ObjectId, crate::write::Error> {
25 (*self).write_buf_with_known_id(object, from, id)
26 }
27
28 fn write_stream(&self, kind: Kind, size: u64, from: &mut dyn Read) -> Result<ObjectId, crate::write::Error> {
29 (*self).write_stream(kind, size, from)
30 }
31
32 fn write_stream_with_known_id(
33 &self,
34 kind: Kind,
35 size: u64,
36 from: &mut dyn Read,
37 id: ObjectId,
38 ) -> Result<ObjectId, crate::write::Error> {
39 (*self).write_stream_with_known_id(kind, size, from, id)
40 }
41}
42
43impl<T> crate::Write for Arc<T>
44where
45 T: crate::Write,
46{
47 fn write(&self, object: &dyn WriteTo) -> Result<ObjectId, crate::write::Error> {
48 self.deref().write(object)
49 }
50
51 fn write_buf(&self, object: Kind, from: &[u8]) -> Result<ObjectId, crate::write::Error> {
52 self.deref().write_buf(object, from)
53 }
54
55 fn write_buf_with_known_id(
56 &self,
57 object: Kind,
58 from: &[u8],
59 id: ObjectId,
60 ) -> Result<ObjectId, crate::write::Error> {
61 self.deref().write_buf_with_known_id(object, from, id)
62 }
63
64 fn write_stream(&self, kind: Kind, size: u64, from: &mut dyn Read) -> Result<ObjectId, crate::write::Error> {
65 self.deref().write_stream(kind, size, from)
66 }
67
68 fn write_stream_with_known_id(
69 &self,
70 kind: Kind,
71 size: u64,
72 from: &mut dyn Read,
73 id: ObjectId,
74 ) -> Result<ObjectId, crate::write::Error> {
75 self.deref().write_stream_with_known_id(kind, size, from, id)
76 }
77}
78
79impl<T> crate::Write for Rc<T>
80where
81 T: crate::Write,
82{
83 fn write(&self, object: &dyn WriteTo) -> Result<ObjectId, crate::write::Error> {
84 self.deref().write(object)
85 }
86
87 fn write_buf(&self, object: Kind, from: &[u8]) -> Result<ObjectId, crate::write::Error> {
88 self.deref().write_buf(object, from)
89 }
90
91 fn write_buf_with_known_id(
92 &self,
93 object: Kind,
94 from: &[u8],
95 id: ObjectId,
96 ) -> Result<ObjectId, crate::write::Error> {
97 self.deref().write_buf_with_known_id(object, from, id)
98 }
99
100 fn write_stream(&self, kind: Kind, size: u64, from: &mut dyn Read) -> Result<ObjectId, crate::write::Error> {
101 self.deref().write_stream(kind, size, from)
102 }
103
104 fn write_stream_with_known_id(
105 &self,
106 kind: Kind,
107 size: u64,
108 from: &mut dyn Read,
109 id: ObjectId,
110 ) -> Result<ObjectId, crate::write::Error> {
111 self.deref().write_stream_with_known_id(kind, size, from, id)
112 }
113}
114
115impl<T> WriteTo for &T
116where
117 T: WriteTo,
118{
119 fn write_to(&self, out: &mut dyn std::io::Write) -> std::io::Result<()> {
120 <T as WriteTo>::write_to(self, out)
121 }
122
123 fn kind(&self) -> Kind {
124 <T as WriteTo>::kind(self)
125 }
126
127 fn size(&self) -> u64 {
128 <T as WriteTo>::size(self)
129 }
130}