@@ -2,7 +2,6 @@ use std::result::Result;
2
2
use std:: io:: Read ;
3
3
use std:: collections:: HashMap ;
4
4
use std:: hash:: Hash ;
5
- use std:: mem;
6
5
7
6
use secp256k1:: { Secp256k1 , Signature } ;
8
7
use secp256k1:: key:: PublicKey ;
@@ -163,43 +162,61 @@ impl<R, K, V> Readable<R> for HashMap<K, V>
163
162
}
164
163
165
164
// Vectors
166
- impl < W : Writer , T : Writeable < W > > Writeable < W > for Vec < T > {
165
+ impl < W : Writer > Writeable < W > for Vec < u8 > {
166
+ #[ inline]
167
+ fn write ( & self , w : & mut W ) -> Result < ( ) , DecodeError > {
168
+ ( self . len ( ) as u16 ) . write ( w) ?;
169
+ Ok ( w. write_all ( & self ) ?)
170
+ }
171
+ }
172
+
173
+ impl < R : Read > Readable < R > for Vec < u8 > {
174
+ #[ inline]
175
+ fn read ( r : & mut R ) -> Result < Self , DecodeError > {
176
+ let len: u16 = Readable :: read ( r) ?;
177
+ let mut ret = Vec :: with_capacity ( len as usize ) ;
178
+ ret. resize ( len as usize , 0 ) ;
179
+ r. read_exact ( & mut ret) ?;
180
+ Ok ( ret)
181
+ }
182
+ }
183
+ impl < W : Writer > Writeable < W > for Vec < Signature > {
167
184
#[ inline]
168
185
fn write ( & self , w : & mut W ) -> Result < ( ) , DecodeError > {
169
186
let byte_size = ( self . len ( ) as usize )
170
- . checked_mul ( mem :: size_of :: < T > ( ) )
187
+ . checked_mul ( 33 )
171
188
. ok_or ( DecodeError :: BadLengthDescriptor ) ?;
172
189
if byte_size > MAX_BUF_SIZE {
173
190
return Err ( DecodeError :: BadLengthDescriptor ) ;
174
191
}
175
192
( self . len ( ) as u16 ) . write ( w) ?;
176
- // performance with Vec<u8>
177
193
for e in self . iter ( ) {
178
194
e. write ( w) ?;
179
195
}
180
196
Ok ( ( ) )
181
197
}
182
198
}
183
199
184
- impl < R : Read , T : Readable < R > > Readable < R > for Vec < T > {
200
+ impl < R : Read > Readable < R > for Vec < Signature > {
185
201
#[ inline]
186
202
fn read ( r : & mut R ) -> Result < Self , DecodeError > {
187
203
let len: u16 = Readable :: read ( r) ?;
188
204
let byte_size = ( len as usize )
189
- . checked_mul ( mem :: size_of :: < T > ( ) )
205
+ . checked_mul ( 33 )
190
206
. ok_or ( DecodeError :: BadLengthDescriptor ) ?;
191
207
if byte_size > MAX_BUF_SIZE {
192
208
return Err ( DecodeError :: BadLengthDescriptor ) ;
193
209
}
194
210
let mut ret = Vec :: with_capacity ( len as usize ) ;
195
- for _ in 0 ..len { ret. push ( T :: read ( r) ?) ; }
211
+ for _ in 0 ..len { ret. push ( Signature :: read ( r) ?) ; }
196
212
Ok ( ret)
197
213
}
198
214
}
199
215
200
216
impl < W : Writer > Writeable < W > for Script {
201
217
fn write ( & self , w : & mut W ) -> Result < ( ) , DecodeError > {
202
- self . to_bytes ( ) . to_vec ( ) . write ( w)
218
+ ( self . len ( ) as u16 ) . write ( w) ?;
219
+ Ok ( w. write_all ( self . as_bytes ( ) ) ?)
203
220
}
204
221
}
205
222
0 commit comments