@@ -25,9 +25,9 @@ use core::fmt::Debug;
25
25
use std:: collections:: { btree_map, BTreeSet } ;
26
26
use std:: hash:: Hash ;
27
27
28
- use amplify:: confinement:: { Confined , SmallVec , TinyOrdMap } ;
28
+ use amplify:: confinement:: { Confined , NonEmptyVec , TinyOrdMap , U16 } ;
29
29
use commit_verify:: { Conceal , ReservedBytes } ;
30
- use strict_encoding:: { StrictDumb , StrictEncode } ;
30
+ use strict_encoding:: { StrictDecode , StrictDumb , StrictEncode } ;
31
31
32
32
use super :: ExposedState ;
33
33
use crate :: operation:: seal:: GenesisSeal ;
@@ -36,6 +36,34 @@ use crate::{
36
36
SecretSeal , StateType , VoidState , LIB_NAME_RGB_COMMIT ,
37
37
} ;
38
38
39
+ #[ derive( Wrapper , WrapperMut , Clone , PartialEq , Eq , PartialOrd , Ord , Debug , From ) ]
40
+ #[ wrapper( Deref ) ]
41
+ #[ wrapper_mut( DerefMut ) ]
42
+ #[ derive( StrictType , StrictDumb , StrictEncode , StrictDecode ) ]
43
+ #[ strict_type( lib = LIB_NAME_RGB_COMMIT , dumb = Self ( NonEmptyVec :: with( A :: strict_dumb( ) ) ) ) ]
44
+ #[ cfg_attr(
45
+ feature = "serde" ,
46
+ derive( Serialize , Deserialize ) ,
47
+ serde(
48
+ crate = "serde_crate" ,
49
+ transparent,
50
+ bound = "A: serde::Serialize + serde::de::DeserializeOwned"
51
+ )
52
+ ) ]
53
+ pub struct AssignVec < A > ( NonEmptyVec < A , U16 > )
54
+ where A : StrictDumb + StrictEncode + StrictDecode ;
55
+
56
+ impl < A : StrictDumb + StrictEncode + StrictDecode > AssignVec < A > {
57
+ pub fn with ( vec : NonEmptyVec < A , U16 > ) -> Self { Self ( vec) }
58
+ }
59
+
60
+ impl < A : StrictDumb + StrictEncode + StrictDecode > IntoIterator for AssignVec < A > {
61
+ type Item = A ;
62
+ type IntoIter = std:: vec:: IntoIter < A > ;
63
+
64
+ fn into_iter ( self ) -> Self :: IntoIter { self . 0 . into_iter ( ) }
65
+ }
66
+
39
67
#[ derive( Clone , Copy , PartialEq , Eq , Hash , Debug , Display , Error ) ]
40
68
#[ display( doc_comments) ]
41
69
/// the requested data are not present.
@@ -231,15 +259,14 @@ impl<State: ExposedState> Assign<State, GenesisSeal> {
231
259
)
232
260
) ]
233
261
pub enum TypedAssigns < Seal : ExposedSeal > {
234
- // TODO: Consider using non-empty variants
235
262
#[ strict_type( tag = 0x00 ) ]
236
- Declarative ( SmallVec < AssignRights < Seal > > ) ,
263
+ Declarative ( AssignVec < AssignRights < Seal > > ) ,
237
264
#[ strict_type( tag = 0x01 ) ]
238
- Fungible ( SmallVec < AssignFungible < Seal > > ) ,
265
+ Fungible ( AssignVec < AssignFungible < Seal > > ) ,
239
266
#[ strict_type( tag = 0x02 ) ]
240
- Structured ( SmallVec < AssignData < Seal > > ) ,
267
+ Structured ( AssignVec < AssignData < Seal > > ) ,
241
268
#[ strict_type( tag = 0xFF ) ]
242
- Attachment ( SmallVec < AssignAttach < Seal > > ) ,
269
+ Attachment ( AssignVec < AssignAttach < Seal > > ) ,
243
270
}
244
271
245
272
impl < Seal : ExposedSeal > Conceal for TypedAssigns < Seal > {
@@ -248,23 +275,23 @@ impl<Seal: ExposedSeal> Conceal for TypedAssigns<Seal> {
248
275
match self {
249
276
TypedAssigns :: Declarative ( s) => {
250
277
let concealed_iter = s. iter ( ) . map ( AssignRights :: < Seal > :: conceal) ;
251
- let inner = SmallVec :: try_from_iter ( concealed_iter) . expect ( "same size" ) ;
252
- TypedAssigns :: Declarative ( inner)
278
+ let inner = NonEmptyVec :: try_from_iter ( concealed_iter) . expect ( "same size" ) ;
279
+ TypedAssigns :: Declarative ( AssignVec :: with ( inner) )
253
280
}
254
281
TypedAssigns :: Fungible ( s) => {
255
282
let concealed_iter = s. iter ( ) . map ( AssignFungible :: < Seal > :: conceal) ;
256
- let inner = SmallVec :: try_from_iter ( concealed_iter) . expect ( "same size" ) ;
257
- TypedAssigns :: Fungible ( inner)
283
+ let inner = NonEmptyVec :: try_from_iter ( concealed_iter) . expect ( "same size" ) ;
284
+ TypedAssigns :: Fungible ( AssignVec :: with ( inner) )
258
285
}
259
286
TypedAssigns :: Structured ( s) => {
260
287
let concealed_iter = s. iter ( ) . map ( AssignData :: < Seal > :: conceal) ;
261
- let inner = SmallVec :: try_from_iter ( concealed_iter) . expect ( "same size" ) ;
262
- TypedAssigns :: Structured ( inner)
288
+ let inner = NonEmptyVec :: try_from_iter ( concealed_iter) . expect ( "same size" ) ;
289
+ TypedAssigns :: Structured ( AssignVec :: with ( inner) )
263
290
}
264
291
TypedAssigns :: Attachment ( s) => {
265
292
let concealed_iter = s. iter ( ) . map ( AssignAttach :: < Seal > :: conceal) ;
266
- let inner = SmallVec :: try_from_iter ( concealed_iter) . expect ( "same size" ) ;
267
- TypedAssigns :: Attachment ( inner)
293
+ let inner = NonEmptyVec :: try_from_iter ( concealed_iter) . expect ( "same size" ) ;
294
+ TypedAssigns :: Attachment ( AssignVec :: with ( inner) )
268
295
}
269
296
}
270
297
}
@@ -344,31 +371,31 @@ impl<Seal: ExposedSeal> TypedAssigns<Seal> {
344
371
}
345
372
346
373
#[ inline]
347
- pub fn as_declarative_mut ( & mut self ) -> Option < & mut SmallVec < AssignRights < Seal > > > {
374
+ pub fn as_declarative_mut ( & mut self ) -> Option < & mut NonEmptyVec < AssignRights < Seal > , U16 > > {
348
375
match self {
349
376
TypedAssigns :: Declarative ( set) => Some ( set) ,
350
377
_ => None ,
351
378
}
352
379
}
353
380
354
381
#[ inline]
355
- pub fn as_fungible_mut ( & mut self ) -> Option < & mut SmallVec < AssignFungible < Seal > > > {
382
+ pub fn as_fungible_mut ( & mut self ) -> Option < & mut NonEmptyVec < AssignFungible < Seal > , U16 > > {
356
383
match self {
357
384
TypedAssigns :: Fungible ( set) => Some ( set) ,
358
385
_ => None ,
359
386
}
360
387
}
361
388
362
389
#[ inline]
363
- pub fn as_structured_mut ( & mut self ) -> Option < & mut SmallVec < AssignData < Seal > > > {
390
+ pub fn as_structured_mut ( & mut self ) -> Option < & mut NonEmptyVec < AssignData < Seal > , U16 > > {
364
391
match self {
365
392
TypedAssigns :: Structured ( set) => Some ( set) ,
366
393
_ => None ,
367
394
}
368
395
}
369
396
370
397
#[ inline]
371
- pub fn as_attachment_mut ( & mut self ) -> Option < & mut SmallVec < AssignAttach < Seal > > > {
398
+ pub fn as_attachment_mut ( & mut self ) -> Option < & mut NonEmptyVec < AssignAttach < Seal > , U16 > > {
372
399
match self {
373
400
TypedAssigns :: Attachment ( set) => Some ( set) ,
374
401
_ => None ,
@@ -446,7 +473,7 @@ impl<Seal: ExposedSeal> TypedAssigns<Seal> {
446
473
if index as usize >= vec. len ( ) {
447
474
return Err ( UnknownDataError ) ;
448
475
}
449
- Ok ( vec. release ( ) . remove ( index as usize ) . into_revealed_state ( ) )
476
+ Ok ( vec. 0 . release ( ) . remove ( index as usize ) . into_revealed_state ( ) )
450
477
}
451
478
_ => Err ( UnknownDataError ) ,
452
479
}
@@ -458,7 +485,7 @@ impl<Seal: ExposedSeal> TypedAssigns<Seal> {
458
485
if index as usize >= vec. len ( ) {
459
486
return Err ( UnknownDataError ) ;
460
487
}
461
- Ok ( vec. release ( ) . remove ( index as usize ) . into_revealed_state ( ) )
488
+ Ok ( vec. 0 . release ( ) . remove ( index as usize ) . into_revealed_state ( ) )
462
489
}
463
490
_ => Err ( UnknownDataError ) ,
464
491
}
@@ -468,22 +495,22 @@ impl<Seal: ExposedSeal> TypedAssigns<Seal> {
468
495
impl TypedAssigns < GenesisSeal > {
469
496
pub fn transmutate_seals ( & self ) -> TypedAssigns < GraphSeal > {
470
497
match self {
471
- TypedAssigns :: Declarative ( a) => TypedAssigns :: Declarative (
498
+ TypedAssigns :: Declarative ( a) => TypedAssigns :: Declarative ( AssignVec :: with (
472
499
Confined :: try_from_iter ( a. iter ( ) . map ( |a| a. transmutate_seals ( ) ) )
473
500
. expect ( "same size" ) ,
474
- ) ,
475
- TypedAssigns :: Fungible ( a) => TypedAssigns :: Fungible (
501
+ ) ) ,
502
+ TypedAssigns :: Fungible ( a) => TypedAssigns :: Fungible ( AssignVec :: with (
476
503
Confined :: try_from_iter ( a. iter ( ) . map ( |a| a. transmutate_seals ( ) ) )
477
504
. expect ( "same size" ) ,
478
- ) ,
479
- TypedAssigns :: Structured ( a) => TypedAssigns :: Structured (
505
+ ) ) ,
506
+ TypedAssigns :: Structured ( a) => TypedAssigns :: Structured ( AssignVec :: with (
480
507
Confined :: try_from_iter ( a. iter ( ) . map ( |a| a. transmutate_seals ( ) ) )
481
508
. expect ( "same size" ) ,
482
- ) ,
483
- TypedAssigns :: Attachment ( a) => TypedAssigns :: Attachment (
509
+ ) ) ,
510
+ TypedAssigns :: Attachment ( a) => TypedAssigns :: Attachment ( AssignVec :: with (
484
511
Confined :: try_from_iter ( a. iter ( ) . map ( |a| a. transmutate_seals ( ) ) )
485
512
. expect ( "same size" ) ,
486
- ) ,
513
+ ) ) ,
487
514
}
488
515
}
489
516
}
0 commit comments