ckbfs_types/generated/
ckbfs.rs

1// Generated by Molecule 0.7.5
2
3use molecule::prelude::*;
4#[derive(Clone)]
5pub struct Uint32(molecule::bytes::Bytes);
6impl ::core::fmt::LowerHex for Uint32 {
7    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
8        use molecule::hex_string;
9        if f.alternate() {
10            write!(f, "0x")?;
11        }
12        write!(f, "{}", hex_string(self.as_slice()))
13    }
14}
15impl ::core::fmt::Debug for Uint32 {
16    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
17        write!(f, "{}({:#x})", Self::NAME, self)
18    }
19}
20impl ::core::fmt::Display for Uint32 {
21    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
22        use molecule::hex_string;
23        let raw_data = hex_string(&self.raw_data());
24        write!(f, "{}(0x{})", Self::NAME, raw_data)
25    }
26}
27impl ::core::default::Default for Uint32 {
28    fn default() -> Self {
29        let v = molecule::bytes::Bytes::from_static(&Self::DEFAULT_VALUE);
30        Uint32::new_unchecked(v)
31    }
32}
33impl Uint32 {
34    const DEFAULT_VALUE: [u8; 4] = [0, 0, 0, 0];
35    pub const TOTAL_SIZE: usize = 4;
36    pub const ITEM_SIZE: usize = 1;
37    pub const ITEM_COUNT: usize = 4;
38    pub fn nth0(&self) -> Byte {
39        Byte::new_unchecked(self.0.slice(0..1))
40    }
41    pub fn nth1(&self) -> Byte {
42        Byte::new_unchecked(self.0.slice(1..2))
43    }
44    pub fn nth2(&self) -> Byte {
45        Byte::new_unchecked(self.0.slice(2..3))
46    }
47    pub fn nth3(&self) -> Byte {
48        Byte::new_unchecked(self.0.slice(3..4))
49    }
50    pub fn raw_data(&self) -> molecule::bytes::Bytes {
51        self.as_bytes()
52    }
53    pub fn as_reader<'r>(&'r self) -> Uint32Reader<'r> {
54        Uint32Reader::new_unchecked(self.as_slice())
55    }
56}
57impl molecule::prelude::Entity for Uint32 {
58    type Builder = Uint32Builder;
59    const NAME: &'static str = "Uint32";
60    fn new_unchecked(data: molecule::bytes::Bytes) -> Self {
61        Uint32(data)
62    }
63    fn as_bytes(&self) -> molecule::bytes::Bytes {
64        self.0.clone()
65    }
66    fn as_slice(&self) -> &[u8] {
67        &self.0[..]
68    }
69    fn from_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
70        Uint32Reader::from_slice(slice).map(|reader| reader.to_entity())
71    }
72    fn from_compatible_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
73        Uint32Reader::from_compatible_slice(slice).map(|reader| reader.to_entity())
74    }
75    fn new_builder() -> Self::Builder {
76        ::core::default::Default::default()
77    }
78    fn as_builder(self) -> Self::Builder {
79        Self::new_builder().set([self.nth0(), self.nth1(), self.nth2(), self.nth3()])
80    }
81}
82#[derive(Clone, Copy)]
83pub struct Uint32Reader<'r>(&'r [u8]);
84impl<'r> ::core::fmt::LowerHex for Uint32Reader<'r> {
85    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
86        use molecule::hex_string;
87        if f.alternate() {
88            write!(f, "0x")?;
89        }
90        write!(f, "{}", hex_string(self.as_slice()))
91    }
92}
93impl<'r> ::core::fmt::Debug for Uint32Reader<'r> {
94    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
95        write!(f, "{}({:#x})", Self::NAME, self)
96    }
97}
98impl<'r> ::core::fmt::Display for Uint32Reader<'r> {
99    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
100        use molecule::hex_string;
101        let raw_data = hex_string(&self.raw_data());
102        write!(f, "{}(0x{})", Self::NAME, raw_data)
103    }
104}
105impl<'r> Uint32Reader<'r> {
106    pub const TOTAL_SIZE: usize = 4;
107    pub const ITEM_SIZE: usize = 1;
108    pub const ITEM_COUNT: usize = 4;
109    pub fn nth0(&self) -> ByteReader<'r> {
110        ByteReader::new_unchecked(&self.as_slice()[0..1])
111    }
112    pub fn nth1(&self) -> ByteReader<'r> {
113        ByteReader::new_unchecked(&self.as_slice()[1..2])
114    }
115    pub fn nth2(&self) -> ByteReader<'r> {
116        ByteReader::new_unchecked(&self.as_slice()[2..3])
117    }
118    pub fn nth3(&self) -> ByteReader<'r> {
119        ByteReader::new_unchecked(&self.as_slice()[3..4])
120    }
121    pub fn raw_data(&self) -> &'r [u8] {
122        self.as_slice()
123    }
124}
125impl<'r> molecule::prelude::Reader<'r> for Uint32Reader<'r> {
126    type Entity = Uint32;
127    const NAME: &'static str = "Uint32Reader";
128    fn to_entity(&self) -> Self::Entity {
129        Self::Entity::new_unchecked(self.as_slice().to_owned().into())
130    }
131    fn new_unchecked(slice: &'r [u8]) -> Self {
132        Uint32Reader(slice)
133    }
134    fn as_slice(&self) -> &'r [u8] {
135        self.0
136    }
137    fn verify(slice: &[u8], _compatible: bool) -> molecule::error::VerificationResult<()> {
138        use molecule::verification_error as ve;
139        let slice_len = slice.len();
140        if slice_len != Self::TOTAL_SIZE {
141            return ve!(Self, TotalSizeNotMatch, Self::TOTAL_SIZE, slice_len);
142        }
143        Ok(())
144    }
145}
146pub struct Uint32Builder(pub(crate) [Byte; 4]);
147impl ::core::fmt::Debug for Uint32Builder {
148    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
149        write!(f, "{}({:?})", Self::NAME, &self.0[..])
150    }
151}
152impl ::core::default::Default for Uint32Builder {
153    fn default() -> Self {
154        Uint32Builder([
155            Byte::default(),
156            Byte::default(),
157            Byte::default(),
158            Byte::default(),
159        ])
160    }
161}
162impl Uint32Builder {
163    pub const TOTAL_SIZE: usize = 4;
164    pub const ITEM_SIZE: usize = 1;
165    pub const ITEM_COUNT: usize = 4;
166    pub fn set(mut self, v: [Byte; 4]) -> Self {
167        self.0 = v;
168        self
169    }
170    pub fn nth0(mut self, v: Byte) -> Self {
171        self.0[0] = v;
172        self
173    }
174    pub fn nth1(mut self, v: Byte) -> Self {
175        self.0[1] = v;
176        self
177    }
178    pub fn nth2(mut self, v: Byte) -> Self {
179        self.0[2] = v;
180        self
181    }
182    pub fn nth3(mut self, v: Byte) -> Self {
183        self.0[3] = v;
184        self
185    }
186}
187impl molecule::prelude::Builder for Uint32Builder {
188    type Entity = Uint32;
189    const NAME: &'static str = "Uint32Builder";
190    fn expected_length(&self) -> usize {
191        Self::TOTAL_SIZE
192    }
193    fn write<W: molecule::io::Write>(&self, writer: &mut W) -> molecule::io::Result<()> {
194        writer.write_all(self.0[0].as_slice())?;
195        writer.write_all(self.0[1].as_slice())?;
196        writer.write_all(self.0[2].as_slice())?;
197        writer.write_all(self.0[3].as_slice())?;
198        Ok(())
199    }
200    fn build(&self) -> Self::Entity {
201        let mut inner = Vec::with_capacity(self.expected_length());
202        self.write(&mut inner)
203            .unwrap_or_else(|_| panic!("{} build should be ok", Self::NAME));
204        Uint32::new_unchecked(inner.into())
205    }
206}
207#[derive(Clone)]
208pub struct Byte32(molecule::bytes::Bytes);
209impl ::core::fmt::LowerHex for Byte32 {
210    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
211        use molecule::hex_string;
212        if f.alternate() {
213            write!(f, "0x")?;
214        }
215        write!(f, "{}", hex_string(self.as_slice()))
216    }
217}
218impl ::core::fmt::Debug for Byte32 {
219    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
220        write!(f, "{}({:#x})", Self::NAME, self)
221    }
222}
223impl ::core::fmt::Display for Byte32 {
224    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
225        use molecule::hex_string;
226        let raw_data = hex_string(&self.raw_data());
227        write!(f, "{}(0x{})", Self::NAME, raw_data)
228    }
229}
230impl ::core::default::Default for Byte32 {
231    fn default() -> Self {
232        let v = molecule::bytes::Bytes::from_static(&Self::DEFAULT_VALUE);
233        Byte32::new_unchecked(v)
234    }
235}
236impl Byte32 {
237    const DEFAULT_VALUE: [u8; 32] = [
238        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
239        0, 0,
240    ];
241    pub const TOTAL_SIZE: usize = 32;
242    pub const ITEM_SIZE: usize = 1;
243    pub const ITEM_COUNT: usize = 32;
244    pub fn nth0(&self) -> Byte {
245        Byte::new_unchecked(self.0.slice(0..1))
246    }
247    pub fn nth1(&self) -> Byte {
248        Byte::new_unchecked(self.0.slice(1..2))
249    }
250    pub fn nth2(&self) -> Byte {
251        Byte::new_unchecked(self.0.slice(2..3))
252    }
253    pub fn nth3(&self) -> Byte {
254        Byte::new_unchecked(self.0.slice(3..4))
255    }
256    pub fn nth4(&self) -> Byte {
257        Byte::new_unchecked(self.0.slice(4..5))
258    }
259    pub fn nth5(&self) -> Byte {
260        Byte::new_unchecked(self.0.slice(5..6))
261    }
262    pub fn nth6(&self) -> Byte {
263        Byte::new_unchecked(self.0.slice(6..7))
264    }
265    pub fn nth7(&self) -> Byte {
266        Byte::new_unchecked(self.0.slice(7..8))
267    }
268    pub fn nth8(&self) -> Byte {
269        Byte::new_unchecked(self.0.slice(8..9))
270    }
271    pub fn nth9(&self) -> Byte {
272        Byte::new_unchecked(self.0.slice(9..10))
273    }
274    pub fn nth10(&self) -> Byte {
275        Byte::new_unchecked(self.0.slice(10..11))
276    }
277    pub fn nth11(&self) -> Byte {
278        Byte::new_unchecked(self.0.slice(11..12))
279    }
280    pub fn nth12(&self) -> Byte {
281        Byte::new_unchecked(self.0.slice(12..13))
282    }
283    pub fn nth13(&self) -> Byte {
284        Byte::new_unchecked(self.0.slice(13..14))
285    }
286    pub fn nth14(&self) -> Byte {
287        Byte::new_unchecked(self.0.slice(14..15))
288    }
289    pub fn nth15(&self) -> Byte {
290        Byte::new_unchecked(self.0.slice(15..16))
291    }
292    pub fn nth16(&self) -> Byte {
293        Byte::new_unchecked(self.0.slice(16..17))
294    }
295    pub fn nth17(&self) -> Byte {
296        Byte::new_unchecked(self.0.slice(17..18))
297    }
298    pub fn nth18(&self) -> Byte {
299        Byte::new_unchecked(self.0.slice(18..19))
300    }
301    pub fn nth19(&self) -> Byte {
302        Byte::new_unchecked(self.0.slice(19..20))
303    }
304    pub fn nth20(&self) -> Byte {
305        Byte::new_unchecked(self.0.slice(20..21))
306    }
307    pub fn nth21(&self) -> Byte {
308        Byte::new_unchecked(self.0.slice(21..22))
309    }
310    pub fn nth22(&self) -> Byte {
311        Byte::new_unchecked(self.0.slice(22..23))
312    }
313    pub fn nth23(&self) -> Byte {
314        Byte::new_unchecked(self.0.slice(23..24))
315    }
316    pub fn nth24(&self) -> Byte {
317        Byte::new_unchecked(self.0.slice(24..25))
318    }
319    pub fn nth25(&self) -> Byte {
320        Byte::new_unchecked(self.0.slice(25..26))
321    }
322    pub fn nth26(&self) -> Byte {
323        Byte::new_unchecked(self.0.slice(26..27))
324    }
325    pub fn nth27(&self) -> Byte {
326        Byte::new_unchecked(self.0.slice(27..28))
327    }
328    pub fn nth28(&self) -> Byte {
329        Byte::new_unchecked(self.0.slice(28..29))
330    }
331    pub fn nth29(&self) -> Byte {
332        Byte::new_unchecked(self.0.slice(29..30))
333    }
334    pub fn nth30(&self) -> Byte {
335        Byte::new_unchecked(self.0.slice(30..31))
336    }
337    pub fn nth31(&self) -> Byte {
338        Byte::new_unchecked(self.0.slice(31..32))
339    }
340    pub fn raw_data(&self) -> molecule::bytes::Bytes {
341        self.as_bytes()
342    }
343    pub fn as_reader<'r>(&'r self) -> Byte32Reader<'r> {
344        Byte32Reader::new_unchecked(self.as_slice())
345    }
346}
347impl molecule::prelude::Entity for Byte32 {
348    type Builder = Byte32Builder;
349    const NAME: &'static str = "Byte32";
350    fn new_unchecked(data: molecule::bytes::Bytes) -> Self {
351        Byte32(data)
352    }
353    fn as_bytes(&self) -> molecule::bytes::Bytes {
354        self.0.clone()
355    }
356    fn as_slice(&self) -> &[u8] {
357        &self.0[..]
358    }
359    fn from_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
360        Byte32Reader::from_slice(slice).map(|reader| reader.to_entity())
361    }
362    fn from_compatible_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
363        Byte32Reader::from_compatible_slice(slice).map(|reader| reader.to_entity())
364    }
365    fn new_builder() -> Self::Builder {
366        ::core::default::Default::default()
367    }
368    fn as_builder(self) -> Self::Builder {
369        Self::new_builder().set([
370            self.nth0(),
371            self.nth1(),
372            self.nth2(),
373            self.nth3(),
374            self.nth4(),
375            self.nth5(),
376            self.nth6(),
377            self.nth7(),
378            self.nth8(),
379            self.nth9(),
380            self.nth10(),
381            self.nth11(),
382            self.nth12(),
383            self.nth13(),
384            self.nth14(),
385            self.nth15(),
386            self.nth16(),
387            self.nth17(),
388            self.nth18(),
389            self.nth19(),
390            self.nth20(),
391            self.nth21(),
392            self.nth22(),
393            self.nth23(),
394            self.nth24(),
395            self.nth25(),
396            self.nth26(),
397            self.nth27(),
398            self.nth28(),
399            self.nth29(),
400            self.nth30(),
401            self.nth31(),
402        ])
403    }
404}
405#[derive(Clone, Copy)]
406pub struct Byte32Reader<'r>(&'r [u8]);
407impl<'r> ::core::fmt::LowerHex for Byte32Reader<'r> {
408    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
409        use molecule::hex_string;
410        if f.alternate() {
411            write!(f, "0x")?;
412        }
413        write!(f, "{}", hex_string(self.as_slice()))
414    }
415}
416impl<'r> ::core::fmt::Debug for Byte32Reader<'r> {
417    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
418        write!(f, "{}({:#x})", Self::NAME, self)
419    }
420}
421impl<'r> ::core::fmt::Display for Byte32Reader<'r> {
422    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
423        use molecule::hex_string;
424        let raw_data = hex_string(&self.raw_data());
425        write!(f, "{}(0x{})", Self::NAME, raw_data)
426    }
427}
428impl<'r> Byte32Reader<'r> {
429    pub const TOTAL_SIZE: usize = 32;
430    pub const ITEM_SIZE: usize = 1;
431    pub const ITEM_COUNT: usize = 32;
432    pub fn nth0(&self) -> ByteReader<'r> {
433        ByteReader::new_unchecked(&self.as_slice()[0..1])
434    }
435    pub fn nth1(&self) -> ByteReader<'r> {
436        ByteReader::new_unchecked(&self.as_slice()[1..2])
437    }
438    pub fn nth2(&self) -> ByteReader<'r> {
439        ByteReader::new_unchecked(&self.as_slice()[2..3])
440    }
441    pub fn nth3(&self) -> ByteReader<'r> {
442        ByteReader::new_unchecked(&self.as_slice()[3..4])
443    }
444    pub fn nth4(&self) -> ByteReader<'r> {
445        ByteReader::new_unchecked(&self.as_slice()[4..5])
446    }
447    pub fn nth5(&self) -> ByteReader<'r> {
448        ByteReader::new_unchecked(&self.as_slice()[5..6])
449    }
450    pub fn nth6(&self) -> ByteReader<'r> {
451        ByteReader::new_unchecked(&self.as_slice()[6..7])
452    }
453    pub fn nth7(&self) -> ByteReader<'r> {
454        ByteReader::new_unchecked(&self.as_slice()[7..8])
455    }
456    pub fn nth8(&self) -> ByteReader<'r> {
457        ByteReader::new_unchecked(&self.as_slice()[8..9])
458    }
459    pub fn nth9(&self) -> ByteReader<'r> {
460        ByteReader::new_unchecked(&self.as_slice()[9..10])
461    }
462    pub fn nth10(&self) -> ByteReader<'r> {
463        ByteReader::new_unchecked(&self.as_slice()[10..11])
464    }
465    pub fn nth11(&self) -> ByteReader<'r> {
466        ByteReader::new_unchecked(&self.as_slice()[11..12])
467    }
468    pub fn nth12(&self) -> ByteReader<'r> {
469        ByteReader::new_unchecked(&self.as_slice()[12..13])
470    }
471    pub fn nth13(&self) -> ByteReader<'r> {
472        ByteReader::new_unchecked(&self.as_slice()[13..14])
473    }
474    pub fn nth14(&self) -> ByteReader<'r> {
475        ByteReader::new_unchecked(&self.as_slice()[14..15])
476    }
477    pub fn nth15(&self) -> ByteReader<'r> {
478        ByteReader::new_unchecked(&self.as_slice()[15..16])
479    }
480    pub fn nth16(&self) -> ByteReader<'r> {
481        ByteReader::new_unchecked(&self.as_slice()[16..17])
482    }
483    pub fn nth17(&self) -> ByteReader<'r> {
484        ByteReader::new_unchecked(&self.as_slice()[17..18])
485    }
486    pub fn nth18(&self) -> ByteReader<'r> {
487        ByteReader::new_unchecked(&self.as_slice()[18..19])
488    }
489    pub fn nth19(&self) -> ByteReader<'r> {
490        ByteReader::new_unchecked(&self.as_slice()[19..20])
491    }
492    pub fn nth20(&self) -> ByteReader<'r> {
493        ByteReader::new_unchecked(&self.as_slice()[20..21])
494    }
495    pub fn nth21(&self) -> ByteReader<'r> {
496        ByteReader::new_unchecked(&self.as_slice()[21..22])
497    }
498    pub fn nth22(&self) -> ByteReader<'r> {
499        ByteReader::new_unchecked(&self.as_slice()[22..23])
500    }
501    pub fn nth23(&self) -> ByteReader<'r> {
502        ByteReader::new_unchecked(&self.as_slice()[23..24])
503    }
504    pub fn nth24(&self) -> ByteReader<'r> {
505        ByteReader::new_unchecked(&self.as_slice()[24..25])
506    }
507    pub fn nth25(&self) -> ByteReader<'r> {
508        ByteReader::new_unchecked(&self.as_slice()[25..26])
509    }
510    pub fn nth26(&self) -> ByteReader<'r> {
511        ByteReader::new_unchecked(&self.as_slice()[26..27])
512    }
513    pub fn nth27(&self) -> ByteReader<'r> {
514        ByteReader::new_unchecked(&self.as_slice()[27..28])
515    }
516    pub fn nth28(&self) -> ByteReader<'r> {
517        ByteReader::new_unchecked(&self.as_slice()[28..29])
518    }
519    pub fn nth29(&self) -> ByteReader<'r> {
520        ByteReader::new_unchecked(&self.as_slice()[29..30])
521    }
522    pub fn nth30(&self) -> ByteReader<'r> {
523        ByteReader::new_unchecked(&self.as_slice()[30..31])
524    }
525    pub fn nth31(&self) -> ByteReader<'r> {
526        ByteReader::new_unchecked(&self.as_slice()[31..32])
527    }
528    pub fn raw_data(&self) -> &'r [u8] {
529        self.as_slice()
530    }
531}
532impl<'r> molecule::prelude::Reader<'r> for Byte32Reader<'r> {
533    type Entity = Byte32;
534    const NAME: &'static str = "Byte32Reader";
535    fn to_entity(&self) -> Self::Entity {
536        Self::Entity::new_unchecked(self.as_slice().to_owned().into())
537    }
538    fn new_unchecked(slice: &'r [u8]) -> Self {
539        Byte32Reader(slice)
540    }
541    fn as_slice(&self) -> &'r [u8] {
542        self.0
543    }
544    fn verify(slice: &[u8], _compatible: bool) -> molecule::error::VerificationResult<()> {
545        use molecule::verification_error as ve;
546        let slice_len = slice.len();
547        if slice_len != Self::TOTAL_SIZE {
548            return ve!(Self, TotalSizeNotMatch, Self::TOTAL_SIZE, slice_len);
549        }
550        Ok(())
551    }
552}
553pub struct Byte32Builder(pub(crate) [Byte; 32]);
554impl ::core::fmt::Debug for Byte32Builder {
555    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
556        write!(f, "{}({:?})", Self::NAME, &self.0[..])
557    }
558}
559impl ::core::default::Default for Byte32Builder {
560    fn default() -> Self {
561        Byte32Builder([
562            Byte::default(),
563            Byte::default(),
564            Byte::default(),
565            Byte::default(),
566            Byte::default(),
567            Byte::default(),
568            Byte::default(),
569            Byte::default(),
570            Byte::default(),
571            Byte::default(),
572            Byte::default(),
573            Byte::default(),
574            Byte::default(),
575            Byte::default(),
576            Byte::default(),
577            Byte::default(),
578            Byte::default(),
579            Byte::default(),
580            Byte::default(),
581            Byte::default(),
582            Byte::default(),
583            Byte::default(),
584            Byte::default(),
585            Byte::default(),
586            Byte::default(),
587            Byte::default(),
588            Byte::default(),
589            Byte::default(),
590            Byte::default(),
591            Byte::default(),
592            Byte::default(),
593            Byte::default(),
594        ])
595    }
596}
597impl Byte32Builder {
598    pub const TOTAL_SIZE: usize = 32;
599    pub const ITEM_SIZE: usize = 1;
600    pub const ITEM_COUNT: usize = 32;
601    pub fn set(mut self, v: [Byte; 32]) -> Self {
602        self.0 = v;
603        self
604    }
605    pub fn nth0(mut self, v: Byte) -> Self {
606        self.0[0] = v;
607        self
608    }
609    pub fn nth1(mut self, v: Byte) -> Self {
610        self.0[1] = v;
611        self
612    }
613    pub fn nth2(mut self, v: Byte) -> Self {
614        self.0[2] = v;
615        self
616    }
617    pub fn nth3(mut self, v: Byte) -> Self {
618        self.0[3] = v;
619        self
620    }
621    pub fn nth4(mut self, v: Byte) -> Self {
622        self.0[4] = v;
623        self
624    }
625    pub fn nth5(mut self, v: Byte) -> Self {
626        self.0[5] = v;
627        self
628    }
629    pub fn nth6(mut self, v: Byte) -> Self {
630        self.0[6] = v;
631        self
632    }
633    pub fn nth7(mut self, v: Byte) -> Self {
634        self.0[7] = v;
635        self
636    }
637    pub fn nth8(mut self, v: Byte) -> Self {
638        self.0[8] = v;
639        self
640    }
641    pub fn nth9(mut self, v: Byte) -> Self {
642        self.0[9] = v;
643        self
644    }
645    pub fn nth10(mut self, v: Byte) -> Self {
646        self.0[10] = v;
647        self
648    }
649    pub fn nth11(mut self, v: Byte) -> Self {
650        self.0[11] = v;
651        self
652    }
653    pub fn nth12(mut self, v: Byte) -> Self {
654        self.0[12] = v;
655        self
656    }
657    pub fn nth13(mut self, v: Byte) -> Self {
658        self.0[13] = v;
659        self
660    }
661    pub fn nth14(mut self, v: Byte) -> Self {
662        self.0[14] = v;
663        self
664    }
665    pub fn nth15(mut self, v: Byte) -> Self {
666        self.0[15] = v;
667        self
668    }
669    pub fn nth16(mut self, v: Byte) -> Self {
670        self.0[16] = v;
671        self
672    }
673    pub fn nth17(mut self, v: Byte) -> Self {
674        self.0[17] = v;
675        self
676    }
677    pub fn nth18(mut self, v: Byte) -> Self {
678        self.0[18] = v;
679        self
680    }
681    pub fn nth19(mut self, v: Byte) -> Self {
682        self.0[19] = v;
683        self
684    }
685    pub fn nth20(mut self, v: Byte) -> Self {
686        self.0[20] = v;
687        self
688    }
689    pub fn nth21(mut self, v: Byte) -> Self {
690        self.0[21] = v;
691        self
692    }
693    pub fn nth22(mut self, v: Byte) -> Self {
694        self.0[22] = v;
695        self
696    }
697    pub fn nth23(mut self, v: Byte) -> Self {
698        self.0[23] = v;
699        self
700    }
701    pub fn nth24(mut self, v: Byte) -> Self {
702        self.0[24] = v;
703        self
704    }
705    pub fn nth25(mut self, v: Byte) -> Self {
706        self.0[25] = v;
707        self
708    }
709    pub fn nth26(mut self, v: Byte) -> Self {
710        self.0[26] = v;
711        self
712    }
713    pub fn nth27(mut self, v: Byte) -> Self {
714        self.0[27] = v;
715        self
716    }
717    pub fn nth28(mut self, v: Byte) -> Self {
718        self.0[28] = v;
719        self
720    }
721    pub fn nth29(mut self, v: Byte) -> Self {
722        self.0[29] = v;
723        self
724    }
725    pub fn nth30(mut self, v: Byte) -> Self {
726        self.0[30] = v;
727        self
728    }
729    pub fn nth31(mut self, v: Byte) -> Self {
730        self.0[31] = v;
731        self
732    }
733}
734impl molecule::prelude::Builder for Byte32Builder {
735    type Entity = Byte32;
736    const NAME: &'static str = "Byte32Builder";
737    fn expected_length(&self) -> usize {
738        Self::TOTAL_SIZE
739    }
740    fn write<W: molecule::io::Write>(&self, writer: &mut W) -> molecule::io::Result<()> {
741        writer.write_all(self.0[0].as_slice())?;
742        writer.write_all(self.0[1].as_slice())?;
743        writer.write_all(self.0[2].as_slice())?;
744        writer.write_all(self.0[3].as_slice())?;
745        writer.write_all(self.0[4].as_slice())?;
746        writer.write_all(self.0[5].as_slice())?;
747        writer.write_all(self.0[6].as_slice())?;
748        writer.write_all(self.0[7].as_slice())?;
749        writer.write_all(self.0[8].as_slice())?;
750        writer.write_all(self.0[9].as_slice())?;
751        writer.write_all(self.0[10].as_slice())?;
752        writer.write_all(self.0[11].as_slice())?;
753        writer.write_all(self.0[12].as_slice())?;
754        writer.write_all(self.0[13].as_slice())?;
755        writer.write_all(self.0[14].as_slice())?;
756        writer.write_all(self.0[15].as_slice())?;
757        writer.write_all(self.0[16].as_slice())?;
758        writer.write_all(self.0[17].as_slice())?;
759        writer.write_all(self.0[18].as_slice())?;
760        writer.write_all(self.0[19].as_slice())?;
761        writer.write_all(self.0[20].as_slice())?;
762        writer.write_all(self.0[21].as_slice())?;
763        writer.write_all(self.0[22].as_slice())?;
764        writer.write_all(self.0[23].as_slice())?;
765        writer.write_all(self.0[24].as_slice())?;
766        writer.write_all(self.0[25].as_slice())?;
767        writer.write_all(self.0[26].as_slice())?;
768        writer.write_all(self.0[27].as_slice())?;
769        writer.write_all(self.0[28].as_slice())?;
770        writer.write_all(self.0[29].as_slice())?;
771        writer.write_all(self.0[30].as_slice())?;
772        writer.write_all(self.0[31].as_slice())?;
773        Ok(())
774    }
775    fn build(&self) -> Self::Entity {
776        let mut inner = Vec::with_capacity(self.expected_length());
777        self.write(&mut inner)
778            .unwrap_or_else(|_| panic!("{} build should be ok", Self::NAME));
779        Byte32::new_unchecked(inner.into())
780    }
781}
782#[derive(Clone)]
783pub struct Bytes(molecule::bytes::Bytes);
784impl ::core::fmt::LowerHex for Bytes {
785    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
786        use molecule::hex_string;
787        if f.alternate() {
788            write!(f, "0x")?;
789        }
790        write!(f, "{}", hex_string(self.as_slice()))
791    }
792}
793impl ::core::fmt::Debug for Bytes {
794    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
795        write!(f, "{}({:#x})", Self::NAME, self)
796    }
797}
798impl ::core::fmt::Display for Bytes {
799    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
800        use molecule::hex_string;
801        let raw_data = hex_string(&self.raw_data());
802        write!(f, "{}(0x{})", Self::NAME, raw_data)
803    }
804}
805impl ::core::default::Default for Bytes {
806    fn default() -> Self {
807        let v = molecule::bytes::Bytes::from_static(&Self::DEFAULT_VALUE);
808        Bytes::new_unchecked(v)
809    }
810}
811impl Bytes {
812    const DEFAULT_VALUE: [u8; 4] = [0, 0, 0, 0];
813    pub const ITEM_SIZE: usize = 1;
814    pub fn total_size(&self) -> usize {
815        molecule::NUMBER_SIZE + Self::ITEM_SIZE * self.item_count()
816    }
817    pub fn item_count(&self) -> usize {
818        molecule::unpack_number(self.as_slice()) as usize
819    }
820    pub fn len(&self) -> usize {
821        self.item_count()
822    }
823    pub fn is_empty(&self) -> bool {
824        self.len() == 0
825    }
826    pub fn get(&self, idx: usize) -> Option<Byte> {
827        if idx >= self.len() {
828            None
829        } else {
830            Some(self.get_unchecked(idx))
831        }
832    }
833    pub fn get_unchecked(&self, idx: usize) -> Byte {
834        let start = molecule::NUMBER_SIZE + Self::ITEM_SIZE * idx;
835        let end = start + Self::ITEM_SIZE;
836        Byte::new_unchecked(self.0.slice(start..end))
837    }
838    pub fn raw_data(&self) -> molecule::bytes::Bytes {
839        self.0.slice(molecule::NUMBER_SIZE..)
840    }
841    pub fn as_reader<'r>(&'r self) -> BytesReader<'r> {
842        BytesReader::new_unchecked(self.as_slice())
843    }
844}
845impl molecule::prelude::Entity for Bytes {
846    type Builder = BytesBuilder;
847    const NAME: &'static str = "Bytes";
848    fn new_unchecked(data: molecule::bytes::Bytes) -> Self {
849        Bytes(data)
850    }
851    fn as_bytes(&self) -> molecule::bytes::Bytes {
852        self.0.clone()
853    }
854    fn as_slice(&self) -> &[u8] {
855        &self.0[..]
856    }
857    fn from_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
858        BytesReader::from_slice(slice).map(|reader| reader.to_entity())
859    }
860    fn from_compatible_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
861        BytesReader::from_compatible_slice(slice).map(|reader| reader.to_entity())
862    }
863    fn new_builder() -> Self::Builder {
864        ::core::default::Default::default()
865    }
866    fn as_builder(self) -> Self::Builder {
867        Self::new_builder().extend(self.into_iter())
868    }
869}
870#[derive(Clone, Copy)]
871pub struct BytesReader<'r>(&'r [u8]);
872impl<'r> ::core::fmt::LowerHex for BytesReader<'r> {
873    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
874        use molecule::hex_string;
875        if f.alternate() {
876            write!(f, "0x")?;
877        }
878        write!(f, "{}", hex_string(self.as_slice()))
879    }
880}
881impl<'r> ::core::fmt::Debug for BytesReader<'r> {
882    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
883        write!(f, "{}({:#x})", Self::NAME, self)
884    }
885}
886impl<'r> ::core::fmt::Display for BytesReader<'r> {
887    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
888        use molecule::hex_string;
889        let raw_data = hex_string(&self.raw_data());
890        write!(f, "{}(0x{})", Self::NAME, raw_data)
891    }
892}
893impl<'r> BytesReader<'r> {
894    pub const ITEM_SIZE: usize = 1;
895    pub fn total_size(&self) -> usize {
896        molecule::NUMBER_SIZE + Self::ITEM_SIZE * self.item_count()
897    }
898    pub fn item_count(&self) -> usize {
899        molecule::unpack_number(self.as_slice()) as usize
900    }
901    pub fn len(&self) -> usize {
902        self.item_count()
903    }
904    pub fn is_empty(&self) -> bool {
905        self.len() == 0
906    }
907    pub fn get(&self, idx: usize) -> Option<ByteReader<'r>> {
908        if idx >= self.len() {
909            None
910        } else {
911            Some(self.get_unchecked(idx))
912        }
913    }
914    pub fn get_unchecked(&self, idx: usize) -> ByteReader<'r> {
915        let start = molecule::NUMBER_SIZE + Self::ITEM_SIZE * idx;
916        let end = start + Self::ITEM_SIZE;
917        ByteReader::new_unchecked(&self.as_slice()[start..end])
918    }
919    pub fn raw_data(&self) -> &'r [u8] {
920        &self.as_slice()[molecule::NUMBER_SIZE..]
921    }
922}
923impl<'r> molecule::prelude::Reader<'r> for BytesReader<'r> {
924    type Entity = Bytes;
925    const NAME: &'static str = "BytesReader";
926    fn to_entity(&self) -> Self::Entity {
927        Self::Entity::new_unchecked(self.as_slice().to_owned().into())
928    }
929    fn new_unchecked(slice: &'r [u8]) -> Self {
930        BytesReader(slice)
931    }
932    fn as_slice(&self) -> &'r [u8] {
933        self.0
934    }
935    fn verify(slice: &[u8], _compatible: bool) -> molecule::error::VerificationResult<()> {
936        use molecule::verification_error as ve;
937        let slice_len = slice.len();
938        if slice_len < molecule::NUMBER_SIZE {
939            return ve!(Self, HeaderIsBroken, molecule::NUMBER_SIZE, slice_len);
940        }
941        let item_count = molecule::unpack_number(slice) as usize;
942        if item_count == 0 {
943            if slice_len != molecule::NUMBER_SIZE {
944                return ve!(Self, TotalSizeNotMatch, molecule::NUMBER_SIZE, slice_len);
945            }
946            return Ok(());
947        }
948        let total_size = molecule::NUMBER_SIZE + Self::ITEM_SIZE * item_count;
949        if slice_len != total_size {
950            return ve!(Self, TotalSizeNotMatch, total_size, slice_len);
951        }
952        Ok(())
953    }
954}
955#[derive(Debug, Default)]
956pub struct BytesBuilder(pub(crate) Vec<Byte>);
957impl BytesBuilder {
958    pub const ITEM_SIZE: usize = 1;
959    pub fn set(mut self, v: Vec<Byte>) -> Self {
960        self.0 = v;
961        self
962    }
963    pub fn push(mut self, v: Byte) -> Self {
964        self.0.push(v);
965        self
966    }
967    pub fn extend<T: ::core::iter::IntoIterator<Item = Byte>>(mut self, iter: T) -> Self {
968        for elem in iter {
969            self.0.push(elem);
970        }
971        self
972    }
973    pub fn replace(&mut self, index: usize, v: Byte) -> Option<Byte> {
974        self.0
975            .get_mut(index)
976            .map(|item| ::core::mem::replace(item, v))
977    }
978}
979impl molecule::prelude::Builder for BytesBuilder {
980    type Entity = Bytes;
981    const NAME: &'static str = "BytesBuilder";
982    fn expected_length(&self) -> usize {
983        molecule::NUMBER_SIZE + Self::ITEM_SIZE * self.0.len()
984    }
985    fn write<W: molecule::io::Write>(&self, writer: &mut W) -> molecule::io::Result<()> {
986        writer.write_all(&molecule::pack_number(self.0.len() as molecule::Number))?;
987        for inner in &self.0[..] {
988            writer.write_all(inner.as_slice())?;
989        }
990        Ok(())
991    }
992    fn build(&self) -> Self::Entity {
993        let mut inner = Vec::with_capacity(self.expected_length());
994        self.write(&mut inner)
995            .unwrap_or_else(|_| panic!("{} build should be ok", Self::NAME));
996        Bytes::new_unchecked(inner.into())
997    }
998}
999pub struct BytesIterator(Bytes, usize, usize);
1000impl ::core::iter::Iterator for BytesIterator {
1001    type Item = Byte;
1002    fn next(&mut self) -> Option<Self::Item> {
1003        if self.1 >= self.2 {
1004            None
1005        } else {
1006            let ret = self.0.get_unchecked(self.1);
1007            self.1 += 1;
1008            Some(ret)
1009        }
1010    }
1011}
1012impl ::core::iter::ExactSizeIterator for BytesIterator {
1013    fn len(&self) -> usize {
1014        self.2 - self.1
1015    }
1016}
1017impl ::core::iter::IntoIterator for Bytes {
1018    type Item = Byte;
1019    type IntoIter = BytesIterator;
1020    fn into_iter(self) -> Self::IntoIter {
1021        let len = self.len();
1022        BytesIterator(self, 0, len)
1023    }
1024}
1025#[derive(Clone)]
1026pub struct Uint32Opt(molecule::bytes::Bytes);
1027impl ::core::fmt::LowerHex for Uint32Opt {
1028    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1029        use molecule::hex_string;
1030        if f.alternate() {
1031            write!(f, "0x")?;
1032        }
1033        write!(f, "{}", hex_string(self.as_slice()))
1034    }
1035}
1036impl ::core::fmt::Debug for Uint32Opt {
1037    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1038        write!(f, "{}({:#x})", Self::NAME, self)
1039    }
1040}
1041impl ::core::fmt::Display for Uint32Opt {
1042    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1043        if let Some(v) = self.to_opt() {
1044            write!(f, "{}(Some({}))", Self::NAME, v)
1045        } else {
1046            write!(f, "{}(None)", Self::NAME)
1047        }
1048    }
1049}
1050impl ::core::default::Default for Uint32Opt {
1051    fn default() -> Self {
1052        let v = molecule::bytes::Bytes::from_static(&Self::DEFAULT_VALUE);
1053        Uint32Opt::new_unchecked(v)
1054    }
1055}
1056impl Uint32Opt {
1057    const DEFAULT_VALUE: [u8; 0] = [];
1058    pub fn is_none(&self) -> bool {
1059        self.0.is_empty()
1060    }
1061    pub fn is_some(&self) -> bool {
1062        !self.0.is_empty()
1063    }
1064    pub fn to_opt(&self) -> Option<Uint32> {
1065        if self.is_none() {
1066            None
1067        } else {
1068            Some(Uint32::new_unchecked(self.0.clone()))
1069        }
1070    }
1071    pub fn as_reader<'r>(&'r self) -> Uint32OptReader<'r> {
1072        Uint32OptReader::new_unchecked(self.as_slice())
1073    }
1074}
1075impl molecule::prelude::Entity for Uint32Opt {
1076    type Builder = Uint32OptBuilder;
1077    const NAME: &'static str = "Uint32Opt";
1078    fn new_unchecked(data: molecule::bytes::Bytes) -> Self {
1079        Uint32Opt(data)
1080    }
1081    fn as_bytes(&self) -> molecule::bytes::Bytes {
1082        self.0.clone()
1083    }
1084    fn as_slice(&self) -> &[u8] {
1085        &self.0[..]
1086    }
1087    fn from_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
1088        Uint32OptReader::from_slice(slice).map(|reader| reader.to_entity())
1089    }
1090    fn from_compatible_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
1091        Uint32OptReader::from_compatible_slice(slice).map(|reader| reader.to_entity())
1092    }
1093    fn new_builder() -> Self::Builder {
1094        ::core::default::Default::default()
1095    }
1096    fn as_builder(self) -> Self::Builder {
1097        Self::new_builder().set(self.to_opt())
1098    }
1099}
1100#[derive(Clone, Copy)]
1101pub struct Uint32OptReader<'r>(&'r [u8]);
1102impl<'r> ::core::fmt::LowerHex for Uint32OptReader<'r> {
1103    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1104        use molecule::hex_string;
1105        if f.alternate() {
1106            write!(f, "0x")?;
1107        }
1108        write!(f, "{}", hex_string(self.as_slice()))
1109    }
1110}
1111impl<'r> ::core::fmt::Debug for Uint32OptReader<'r> {
1112    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1113        write!(f, "{}({:#x})", Self::NAME, self)
1114    }
1115}
1116impl<'r> ::core::fmt::Display for Uint32OptReader<'r> {
1117    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1118        if let Some(v) = self.to_opt() {
1119            write!(f, "{}(Some({}))", Self::NAME, v)
1120        } else {
1121            write!(f, "{}(None)", Self::NAME)
1122        }
1123    }
1124}
1125impl<'r> Uint32OptReader<'r> {
1126    pub fn is_none(&self) -> bool {
1127        self.0.is_empty()
1128    }
1129    pub fn is_some(&self) -> bool {
1130        !self.0.is_empty()
1131    }
1132    pub fn to_opt(&self) -> Option<Uint32Reader<'r>> {
1133        if self.is_none() {
1134            None
1135        } else {
1136            Some(Uint32Reader::new_unchecked(self.as_slice()))
1137        }
1138    }
1139}
1140impl<'r> molecule::prelude::Reader<'r> for Uint32OptReader<'r> {
1141    type Entity = Uint32Opt;
1142    const NAME: &'static str = "Uint32OptReader";
1143    fn to_entity(&self) -> Self::Entity {
1144        Self::Entity::new_unchecked(self.as_slice().to_owned().into())
1145    }
1146    fn new_unchecked(slice: &'r [u8]) -> Self {
1147        Uint32OptReader(slice)
1148    }
1149    fn as_slice(&self) -> &'r [u8] {
1150        self.0
1151    }
1152    fn verify(slice: &[u8], compatible: bool) -> molecule::error::VerificationResult<()> {
1153        if !slice.is_empty() {
1154            Uint32Reader::verify(&slice[..], compatible)?;
1155        }
1156        Ok(())
1157    }
1158}
1159#[derive(Debug, Default)]
1160pub struct Uint32OptBuilder(pub(crate) Option<Uint32>);
1161impl Uint32OptBuilder {
1162    pub fn set(mut self, v: Option<Uint32>) -> Self {
1163        self.0 = v;
1164        self
1165    }
1166}
1167impl molecule::prelude::Builder for Uint32OptBuilder {
1168    type Entity = Uint32Opt;
1169    const NAME: &'static str = "Uint32OptBuilder";
1170    fn expected_length(&self) -> usize {
1171        self.0
1172            .as_ref()
1173            .map(|ref inner| inner.as_slice().len())
1174            .unwrap_or(0)
1175    }
1176    fn write<W: molecule::io::Write>(&self, writer: &mut W) -> molecule::io::Result<()> {
1177        self.0
1178            .as_ref()
1179            .map(|ref inner| writer.write_all(inner.as_slice()))
1180            .unwrap_or(Ok(()))
1181    }
1182    fn build(&self) -> Self::Entity {
1183        let mut inner = Vec::with_capacity(self.expected_length());
1184        self.write(&mut inner)
1185            .unwrap_or_else(|_| panic!("{} build should be ok", Self::NAME));
1186        Uint32Opt::new_unchecked(inner.into())
1187    }
1188}
1189#[derive(Clone)]
1190pub struct Indexes(molecule::bytes::Bytes);
1191impl ::core::fmt::LowerHex for Indexes {
1192    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1193        use molecule::hex_string;
1194        if f.alternate() {
1195            write!(f, "0x")?;
1196        }
1197        write!(f, "{}", hex_string(self.as_slice()))
1198    }
1199}
1200impl ::core::fmt::Debug for Indexes {
1201    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1202        write!(f, "{}({:#x})", Self::NAME, self)
1203    }
1204}
1205impl ::core::fmt::Display for Indexes {
1206    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1207        write!(f, "{} [", Self::NAME)?;
1208        for i in 0..self.len() {
1209            if i == 0 {
1210                write!(f, "{}", self.get_unchecked(i))?;
1211            } else {
1212                write!(f, ", {}", self.get_unchecked(i))?;
1213            }
1214        }
1215        write!(f, "]")
1216    }
1217}
1218impl ::core::default::Default for Indexes {
1219    fn default() -> Self {
1220        let v = molecule::bytes::Bytes::from_static(&Self::DEFAULT_VALUE);
1221        Indexes::new_unchecked(v)
1222    }
1223}
1224impl Indexes {
1225    const DEFAULT_VALUE: [u8; 4] = [0, 0, 0, 0];
1226    pub const ITEM_SIZE: usize = 4;
1227    pub fn total_size(&self) -> usize {
1228        molecule::NUMBER_SIZE + Self::ITEM_SIZE * self.item_count()
1229    }
1230    pub fn item_count(&self) -> usize {
1231        molecule::unpack_number(self.as_slice()) as usize
1232    }
1233    pub fn len(&self) -> usize {
1234        self.item_count()
1235    }
1236    pub fn is_empty(&self) -> bool {
1237        self.len() == 0
1238    }
1239    pub fn get(&self, idx: usize) -> Option<Uint32> {
1240        if idx >= self.len() {
1241            None
1242        } else {
1243            Some(self.get_unchecked(idx))
1244        }
1245    }
1246    pub fn get_unchecked(&self, idx: usize) -> Uint32 {
1247        let start = molecule::NUMBER_SIZE + Self::ITEM_SIZE * idx;
1248        let end = start + Self::ITEM_SIZE;
1249        Uint32::new_unchecked(self.0.slice(start..end))
1250    }
1251    pub fn as_reader<'r>(&'r self) -> IndexesReader<'r> {
1252        IndexesReader::new_unchecked(self.as_slice())
1253    }
1254}
1255impl molecule::prelude::Entity for Indexes {
1256    type Builder = IndexesBuilder;
1257    const NAME: &'static str = "Indexes";
1258    fn new_unchecked(data: molecule::bytes::Bytes) -> Self {
1259        Indexes(data)
1260    }
1261    fn as_bytes(&self) -> molecule::bytes::Bytes {
1262        self.0.clone()
1263    }
1264    fn as_slice(&self) -> &[u8] {
1265        &self.0[..]
1266    }
1267    fn from_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
1268        IndexesReader::from_slice(slice).map(|reader| reader.to_entity())
1269    }
1270    fn from_compatible_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
1271        IndexesReader::from_compatible_slice(slice).map(|reader| reader.to_entity())
1272    }
1273    fn new_builder() -> Self::Builder {
1274        ::core::default::Default::default()
1275    }
1276    fn as_builder(self) -> Self::Builder {
1277        Self::new_builder().extend(self.into_iter())
1278    }
1279}
1280#[derive(Clone, Copy)]
1281pub struct IndexesReader<'r>(&'r [u8]);
1282impl<'r> ::core::fmt::LowerHex for IndexesReader<'r> {
1283    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1284        use molecule::hex_string;
1285        if f.alternate() {
1286            write!(f, "0x")?;
1287        }
1288        write!(f, "{}", hex_string(self.as_slice()))
1289    }
1290}
1291impl<'r> ::core::fmt::Debug for IndexesReader<'r> {
1292    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1293        write!(f, "{}({:#x})", Self::NAME, self)
1294    }
1295}
1296impl<'r> ::core::fmt::Display for IndexesReader<'r> {
1297    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1298        write!(f, "{} [", Self::NAME)?;
1299        for i in 0..self.len() {
1300            if i == 0 {
1301                write!(f, "{}", self.get_unchecked(i))?;
1302            } else {
1303                write!(f, ", {}", self.get_unchecked(i))?;
1304            }
1305        }
1306        write!(f, "]")
1307    }
1308}
1309impl<'r> IndexesReader<'r> {
1310    pub const ITEM_SIZE: usize = 4;
1311    pub fn total_size(&self) -> usize {
1312        molecule::NUMBER_SIZE + Self::ITEM_SIZE * self.item_count()
1313    }
1314    pub fn item_count(&self) -> usize {
1315        molecule::unpack_number(self.as_slice()) as usize
1316    }
1317    pub fn len(&self) -> usize {
1318        self.item_count()
1319    }
1320    pub fn is_empty(&self) -> bool {
1321        self.len() == 0
1322    }
1323    pub fn get(&self, idx: usize) -> Option<Uint32Reader<'r>> {
1324        if idx >= self.len() {
1325            None
1326        } else {
1327            Some(self.get_unchecked(idx))
1328        }
1329    }
1330    pub fn get_unchecked(&self, idx: usize) -> Uint32Reader<'r> {
1331        let start = molecule::NUMBER_SIZE + Self::ITEM_SIZE * idx;
1332        let end = start + Self::ITEM_SIZE;
1333        Uint32Reader::new_unchecked(&self.as_slice()[start..end])
1334    }
1335}
1336impl<'r> molecule::prelude::Reader<'r> for IndexesReader<'r> {
1337    type Entity = Indexes;
1338    const NAME: &'static str = "IndexesReader";
1339    fn to_entity(&self) -> Self::Entity {
1340        Self::Entity::new_unchecked(self.as_slice().to_owned().into())
1341    }
1342    fn new_unchecked(slice: &'r [u8]) -> Self {
1343        IndexesReader(slice)
1344    }
1345    fn as_slice(&self) -> &'r [u8] {
1346        self.0
1347    }
1348    fn verify(slice: &[u8], _compatible: bool) -> molecule::error::VerificationResult<()> {
1349        use molecule::verification_error as ve;
1350        let slice_len = slice.len();
1351        if slice_len < molecule::NUMBER_SIZE {
1352            return ve!(Self, HeaderIsBroken, molecule::NUMBER_SIZE, slice_len);
1353        }
1354        let item_count = molecule::unpack_number(slice) as usize;
1355        if item_count == 0 {
1356            if slice_len != molecule::NUMBER_SIZE {
1357                return ve!(Self, TotalSizeNotMatch, molecule::NUMBER_SIZE, slice_len);
1358            }
1359            return Ok(());
1360        }
1361        let total_size = molecule::NUMBER_SIZE + Self::ITEM_SIZE * item_count;
1362        if slice_len != total_size {
1363            return ve!(Self, TotalSizeNotMatch, total_size, slice_len);
1364        }
1365        Ok(())
1366    }
1367}
1368#[derive(Debug, Default)]
1369pub struct IndexesBuilder(pub(crate) Vec<Uint32>);
1370impl IndexesBuilder {
1371    pub const ITEM_SIZE: usize = 4;
1372    pub fn set(mut self, v: Vec<Uint32>) -> Self {
1373        self.0 = v;
1374        self
1375    }
1376    pub fn push(mut self, v: Uint32) -> Self {
1377        self.0.push(v);
1378        self
1379    }
1380    pub fn extend<T: ::core::iter::IntoIterator<Item = Uint32>>(mut self, iter: T) -> Self {
1381        for elem in iter {
1382            self.0.push(elem);
1383        }
1384        self
1385    }
1386    pub fn replace(&mut self, index: usize, v: Uint32) -> Option<Uint32> {
1387        self.0
1388            .get_mut(index)
1389            .map(|item| ::core::mem::replace(item, v))
1390    }
1391}
1392impl molecule::prelude::Builder for IndexesBuilder {
1393    type Entity = Indexes;
1394    const NAME: &'static str = "IndexesBuilder";
1395    fn expected_length(&self) -> usize {
1396        molecule::NUMBER_SIZE + Self::ITEM_SIZE * self.0.len()
1397    }
1398    fn write<W: molecule::io::Write>(&self, writer: &mut W) -> molecule::io::Result<()> {
1399        writer.write_all(&molecule::pack_number(self.0.len() as molecule::Number))?;
1400        for inner in &self.0[..] {
1401            writer.write_all(inner.as_slice())?;
1402        }
1403        Ok(())
1404    }
1405    fn build(&self) -> Self::Entity {
1406        let mut inner = Vec::with_capacity(self.expected_length());
1407        self.write(&mut inner)
1408            .unwrap_or_else(|_| panic!("{} build should be ok", Self::NAME));
1409        Indexes::new_unchecked(inner.into())
1410    }
1411}
1412pub struct IndexesIterator(Indexes, usize, usize);
1413impl ::core::iter::Iterator for IndexesIterator {
1414    type Item = Uint32;
1415    fn next(&mut self) -> Option<Self::Item> {
1416        if self.1 >= self.2 {
1417            None
1418        } else {
1419            let ret = self.0.get_unchecked(self.1);
1420            self.1 += 1;
1421            Some(ret)
1422        }
1423    }
1424}
1425impl ::core::iter::ExactSizeIterator for IndexesIterator {
1426    fn len(&self) -> usize {
1427        self.2 - self.1
1428    }
1429}
1430impl ::core::iter::IntoIterator for Indexes {
1431    type Item = Uint32;
1432    type IntoIter = IndexesIterator;
1433    fn into_iter(self) -> Self::IntoIter {
1434        let len = self.len();
1435        IndexesIterator(self, 0, len)
1436    }
1437}
1438impl<'r> IndexesReader<'r> {
1439    pub fn iter<'t>(&'t self) -> IndexesReaderIterator<'t, 'r> {
1440        IndexesReaderIterator(&self, 0, self.len())
1441    }
1442}
1443pub struct IndexesReaderIterator<'t, 'r>(&'t IndexesReader<'r>, usize, usize);
1444impl<'t: 'r, 'r> ::core::iter::Iterator for IndexesReaderIterator<'t, 'r> {
1445    type Item = Uint32Reader<'t>;
1446    fn next(&mut self) -> Option<Self::Item> {
1447        if self.1 >= self.2 {
1448            None
1449        } else {
1450            let ret = self.0.get_unchecked(self.1);
1451            self.1 += 1;
1452            Some(ret)
1453        }
1454    }
1455}
1456impl<'t: 'r, 'r> ::core::iter::ExactSizeIterator for IndexesReaderIterator<'t, 'r> {
1457    fn len(&self) -> usize {
1458        self.2 - self.1
1459    }
1460}
1461#[derive(Clone)]
1462pub struct CKBFSData(molecule::bytes::Bytes);
1463impl ::core::fmt::LowerHex for CKBFSData {
1464    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1465        use molecule::hex_string;
1466        if f.alternate() {
1467            write!(f, "0x")?;
1468        }
1469        write!(f, "{}", hex_string(self.as_slice()))
1470    }
1471}
1472impl ::core::fmt::Debug for CKBFSData {
1473    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1474        write!(f, "{}({:#x})", Self::NAME, self)
1475    }
1476}
1477impl ::core::fmt::Display for CKBFSData {
1478    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1479        write!(f, "{} {{ ", Self::NAME)?;
1480        write!(f, "{}: {}", "indexes", self.indexes())?;
1481        write!(f, ", {}: {}", "checksum", self.checksum())?;
1482        write!(f, ", {}: {}", "content_type", self.content_type())?;
1483        write!(f, ", {}: {}", "filename", self.filename())?;
1484        write!(f, ", {}: {}", "backlinks", self.backlinks())?;
1485        let extra_count = self.count_extra_fields();
1486        if extra_count != 0 {
1487            write!(f, ", .. ({} fields)", extra_count)?;
1488        }
1489        write!(f, " }}")
1490    }
1491}
1492impl ::core::default::Default for CKBFSData {
1493    fn default() -> Self {
1494        let v = molecule::bytes::Bytes::from_static(&Self::DEFAULT_VALUE);
1495        CKBFSData::new_unchecked(v)
1496    }
1497}
1498impl CKBFSData {
1499    const DEFAULT_VALUE: [u8; 44] = [
1500        44, 0, 0, 0, 24, 0, 0, 0, 28, 0, 0, 0, 32, 0, 0, 0, 36, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,
1501        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
1502    ];
1503    pub const FIELD_COUNT: usize = 5;
1504    pub fn total_size(&self) -> usize {
1505        molecule::unpack_number(self.as_slice()) as usize
1506    }
1507    pub fn field_count(&self) -> usize {
1508        if self.total_size() == molecule::NUMBER_SIZE {
1509            0
1510        } else {
1511            (molecule::unpack_number(&self.as_slice()[molecule::NUMBER_SIZE..]) as usize / 4) - 1
1512        }
1513    }
1514    pub fn count_extra_fields(&self) -> usize {
1515        self.field_count() - Self::FIELD_COUNT
1516    }
1517    pub fn has_extra_fields(&self) -> bool {
1518        Self::FIELD_COUNT != self.field_count()
1519    }
1520    pub fn indexes(&self) -> Indexes {
1521        let slice = self.as_slice();
1522        let start = molecule::unpack_number(&slice[4..]) as usize;
1523        let end = molecule::unpack_number(&slice[8..]) as usize;
1524        Indexes::new_unchecked(self.0.slice(start..end))
1525    }
1526    pub fn checksum(&self) -> Uint32 {
1527        let slice = self.as_slice();
1528        let start = molecule::unpack_number(&slice[8..]) as usize;
1529        let end = molecule::unpack_number(&slice[12..]) as usize;
1530        Uint32::new_unchecked(self.0.slice(start..end))
1531    }
1532    pub fn content_type(&self) -> Bytes {
1533        let slice = self.as_slice();
1534        let start = molecule::unpack_number(&slice[12..]) as usize;
1535        let end = molecule::unpack_number(&slice[16..]) as usize;
1536        Bytes::new_unchecked(self.0.slice(start..end))
1537    }
1538    pub fn filename(&self) -> Bytes {
1539        let slice = self.as_slice();
1540        let start = molecule::unpack_number(&slice[16..]) as usize;
1541        let end = molecule::unpack_number(&slice[20..]) as usize;
1542        Bytes::new_unchecked(self.0.slice(start..end))
1543    }
1544    pub fn backlinks(&self) -> BackLinkVec {
1545        let slice = self.as_slice();
1546        let start = molecule::unpack_number(&slice[20..]) as usize;
1547        if self.has_extra_fields() {
1548            let end = molecule::unpack_number(&slice[24..]) as usize;
1549            BackLinkVec::new_unchecked(self.0.slice(start..end))
1550        } else {
1551            BackLinkVec::new_unchecked(self.0.slice(start..))
1552        }
1553    }
1554    pub fn as_reader<'r>(&'r self) -> CKBFSDataReader<'r> {
1555        CKBFSDataReader::new_unchecked(self.as_slice())
1556    }
1557}
1558impl molecule::prelude::Entity for CKBFSData {
1559    type Builder = CKBFSDataBuilder;
1560    const NAME: &'static str = "CKBFSData";
1561    fn new_unchecked(data: molecule::bytes::Bytes) -> Self {
1562        CKBFSData(data)
1563    }
1564    fn as_bytes(&self) -> molecule::bytes::Bytes {
1565        self.0.clone()
1566    }
1567    fn as_slice(&self) -> &[u8] {
1568        &self.0[..]
1569    }
1570    fn from_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
1571        CKBFSDataReader::from_slice(slice).map(|reader| reader.to_entity())
1572    }
1573    fn from_compatible_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
1574        CKBFSDataReader::from_compatible_slice(slice).map(|reader| reader.to_entity())
1575    }
1576    fn new_builder() -> Self::Builder {
1577        ::core::default::Default::default()
1578    }
1579    fn as_builder(self) -> Self::Builder {
1580        Self::new_builder()
1581            .indexes(self.indexes())
1582            .checksum(self.checksum())
1583            .content_type(self.content_type())
1584            .filename(self.filename())
1585            .backlinks(self.backlinks())
1586    }
1587}
1588#[derive(Clone, Copy)]
1589pub struct CKBFSDataReader<'r>(&'r [u8]);
1590impl<'r> ::core::fmt::LowerHex for CKBFSDataReader<'r> {
1591    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1592        use molecule::hex_string;
1593        if f.alternate() {
1594            write!(f, "0x")?;
1595        }
1596        write!(f, "{}", hex_string(self.as_slice()))
1597    }
1598}
1599impl<'r> ::core::fmt::Debug for CKBFSDataReader<'r> {
1600    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1601        write!(f, "{}({:#x})", Self::NAME, self)
1602    }
1603}
1604impl<'r> ::core::fmt::Display for CKBFSDataReader<'r> {
1605    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1606        write!(f, "{} {{ ", Self::NAME)?;
1607        write!(f, "{}: {}", "indexes", self.indexes())?;
1608        write!(f, ", {}: {}", "checksum", self.checksum())?;
1609        write!(f, ", {}: {}", "content_type", self.content_type())?;
1610        write!(f, ", {}: {}", "filename", self.filename())?;
1611        write!(f, ", {}: {}", "backlinks", self.backlinks())?;
1612        let extra_count = self.count_extra_fields();
1613        if extra_count != 0 {
1614            write!(f, ", .. ({} fields)", extra_count)?;
1615        }
1616        write!(f, " }}")
1617    }
1618}
1619impl<'r> CKBFSDataReader<'r> {
1620    pub const FIELD_COUNT: usize = 5;
1621    pub fn total_size(&self) -> usize {
1622        molecule::unpack_number(self.as_slice()) as usize
1623    }
1624    pub fn field_count(&self) -> usize {
1625        if self.total_size() == molecule::NUMBER_SIZE {
1626            0
1627        } else {
1628            (molecule::unpack_number(&self.as_slice()[molecule::NUMBER_SIZE..]) as usize / 4) - 1
1629        }
1630    }
1631    pub fn count_extra_fields(&self) -> usize {
1632        self.field_count() - Self::FIELD_COUNT
1633    }
1634    pub fn has_extra_fields(&self) -> bool {
1635        Self::FIELD_COUNT != self.field_count()
1636    }
1637    pub fn indexes(&self) -> IndexesReader<'r> {
1638        let slice = self.as_slice();
1639        let start = molecule::unpack_number(&slice[4..]) as usize;
1640        let end = molecule::unpack_number(&slice[8..]) as usize;
1641        IndexesReader::new_unchecked(&self.as_slice()[start..end])
1642    }
1643    pub fn checksum(&self) -> Uint32Reader<'r> {
1644        let slice = self.as_slice();
1645        let start = molecule::unpack_number(&slice[8..]) as usize;
1646        let end = molecule::unpack_number(&slice[12..]) as usize;
1647        Uint32Reader::new_unchecked(&self.as_slice()[start..end])
1648    }
1649    pub fn content_type(&self) -> BytesReader<'r> {
1650        let slice = self.as_slice();
1651        let start = molecule::unpack_number(&slice[12..]) as usize;
1652        let end = molecule::unpack_number(&slice[16..]) as usize;
1653        BytesReader::new_unchecked(&self.as_slice()[start..end])
1654    }
1655    pub fn filename(&self) -> BytesReader<'r> {
1656        let slice = self.as_slice();
1657        let start = molecule::unpack_number(&slice[16..]) as usize;
1658        let end = molecule::unpack_number(&slice[20..]) as usize;
1659        BytesReader::new_unchecked(&self.as_slice()[start..end])
1660    }
1661    pub fn backlinks(&self) -> BackLinkVecReader<'r> {
1662        let slice = self.as_slice();
1663        let start = molecule::unpack_number(&slice[20..]) as usize;
1664        if self.has_extra_fields() {
1665            let end = molecule::unpack_number(&slice[24..]) as usize;
1666            BackLinkVecReader::new_unchecked(&self.as_slice()[start..end])
1667        } else {
1668            BackLinkVecReader::new_unchecked(&self.as_slice()[start..])
1669        }
1670    }
1671}
1672impl<'r> molecule::prelude::Reader<'r> for CKBFSDataReader<'r> {
1673    type Entity = CKBFSData;
1674    const NAME: &'static str = "CKBFSDataReader";
1675    fn to_entity(&self) -> Self::Entity {
1676        Self::Entity::new_unchecked(self.as_slice().to_owned().into())
1677    }
1678    fn new_unchecked(slice: &'r [u8]) -> Self {
1679        CKBFSDataReader(slice)
1680    }
1681    fn as_slice(&self) -> &'r [u8] {
1682        self.0
1683    }
1684    fn verify(slice: &[u8], compatible: bool) -> molecule::error::VerificationResult<()> {
1685        use molecule::verification_error as ve;
1686        let slice_len = slice.len();
1687        if slice_len < molecule::NUMBER_SIZE {
1688            return ve!(Self, HeaderIsBroken, molecule::NUMBER_SIZE, slice_len);
1689        }
1690        let total_size = molecule::unpack_number(slice) as usize;
1691        if slice_len != total_size {
1692            return ve!(Self, TotalSizeNotMatch, total_size, slice_len);
1693        }
1694        if slice_len < molecule::NUMBER_SIZE * 2 {
1695            return ve!(Self, HeaderIsBroken, molecule::NUMBER_SIZE * 2, slice_len);
1696        }
1697        let offset_first = molecule::unpack_number(&slice[molecule::NUMBER_SIZE..]) as usize;
1698        if offset_first % molecule::NUMBER_SIZE != 0 || offset_first < molecule::NUMBER_SIZE * 2 {
1699            return ve!(Self, OffsetsNotMatch);
1700        }
1701        if slice_len < offset_first {
1702            return ve!(Self, HeaderIsBroken, offset_first, slice_len);
1703        }
1704        let field_count = offset_first / molecule::NUMBER_SIZE - 1;
1705        if field_count < Self::FIELD_COUNT {
1706            return ve!(Self, FieldCountNotMatch, Self::FIELD_COUNT, field_count);
1707        } else if !compatible && field_count > Self::FIELD_COUNT {
1708            return ve!(Self, FieldCountNotMatch, Self::FIELD_COUNT, field_count);
1709        };
1710        let mut offsets: Vec<usize> = slice[molecule::NUMBER_SIZE..offset_first]
1711            .chunks_exact(molecule::NUMBER_SIZE)
1712            .map(|x| molecule::unpack_number(x) as usize)
1713            .collect();
1714        offsets.push(total_size);
1715        if offsets.windows(2).any(|i| i[0] > i[1]) {
1716            return ve!(Self, OffsetsNotMatch);
1717        }
1718        IndexesReader::verify(&slice[offsets[0]..offsets[1]], compatible)?;
1719        Uint32Reader::verify(&slice[offsets[1]..offsets[2]], compatible)?;
1720        BytesReader::verify(&slice[offsets[2]..offsets[3]], compatible)?;
1721        BytesReader::verify(&slice[offsets[3]..offsets[4]], compatible)?;
1722        BackLinkVecReader::verify(&slice[offsets[4]..offsets[5]], compatible)?;
1723        Ok(())
1724    }
1725}
1726#[derive(Debug, Default)]
1727pub struct CKBFSDataBuilder {
1728    pub(crate) indexes: Indexes,
1729    pub(crate) checksum: Uint32,
1730    pub(crate) content_type: Bytes,
1731    pub(crate) filename: Bytes,
1732    pub(crate) backlinks: BackLinkVec,
1733}
1734impl CKBFSDataBuilder {
1735    pub const FIELD_COUNT: usize = 5;
1736    pub fn indexes(mut self, v: Indexes) -> Self {
1737        self.indexes = v;
1738        self
1739    }
1740    pub fn checksum(mut self, v: Uint32) -> Self {
1741        self.checksum = v;
1742        self
1743    }
1744    pub fn content_type(mut self, v: Bytes) -> Self {
1745        self.content_type = v;
1746        self
1747    }
1748    pub fn filename(mut self, v: Bytes) -> Self {
1749        self.filename = v;
1750        self
1751    }
1752    pub fn backlinks(mut self, v: BackLinkVec) -> Self {
1753        self.backlinks = v;
1754        self
1755    }
1756}
1757impl molecule::prelude::Builder for CKBFSDataBuilder {
1758    type Entity = CKBFSData;
1759    const NAME: &'static str = "CKBFSDataBuilder";
1760    fn expected_length(&self) -> usize {
1761        molecule::NUMBER_SIZE * (Self::FIELD_COUNT + 1)
1762            + self.indexes.as_slice().len()
1763            + self.checksum.as_slice().len()
1764            + self.content_type.as_slice().len()
1765            + self.filename.as_slice().len()
1766            + self.backlinks.as_slice().len()
1767    }
1768    fn write<W: molecule::io::Write>(&self, writer: &mut W) -> molecule::io::Result<()> {
1769        let mut total_size = molecule::NUMBER_SIZE * (Self::FIELD_COUNT + 1);
1770        let mut offsets = Vec::with_capacity(Self::FIELD_COUNT);
1771        offsets.push(total_size);
1772        total_size += self.indexes.as_slice().len();
1773        offsets.push(total_size);
1774        total_size += self.checksum.as_slice().len();
1775        offsets.push(total_size);
1776        total_size += self.content_type.as_slice().len();
1777        offsets.push(total_size);
1778        total_size += self.filename.as_slice().len();
1779        offsets.push(total_size);
1780        total_size += self.backlinks.as_slice().len();
1781        writer.write_all(&molecule::pack_number(total_size as molecule::Number))?;
1782        for offset in offsets.into_iter() {
1783            writer.write_all(&molecule::pack_number(offset as molecule::Number))?;
1784        }
1785        writer.write_all(self.indexes.as_slice())?;
1786        writer.write_all(self.checksum.as_slice())?;
1787        writer.write_all(self.content_type.as_slice())?;
1788        writer.write_all(self.filename.as_slice())?;
1789        writer.write_all(self.backlinks.as_slice())?;
1790        Ok(())
1791    }
1792    fn build(&self) -> Self::Entity {
1793        let mut inner = Vec::with_capacity(self.expected_length());
1794        self.write(&mut inner)
1795            .unwrap_or_else(|_| panic!("{} build should be ok", Self::NAME));
1796        CKBFSData::new_unchecked(inner.into())
1797    }
1798}
1799#[derive(Clone)]
1800pub struct BackLink(molecule::bytes::Bytes);
1801impl ::core::fmt::LowerHex for BackLink {
1802    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1803        use molecule::hex_string;
1804        if f.alternate() {
1805            write!(f, "0x")?;
1806        }
1807        write!(f, "{}", hex_string(self.as_slice()))
1808    }
1809}
1810impl ::core::fmt::Debug for BackLink {
1811    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1812        write!(f, "{}({:#x})", Self::NAME, self)
1813    }
1814}
1815impl ::core::fmt::Display for BackLink {
1816    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1817        write!(f, "{} {{ ", Self::NAME)?;
1818        write!(f, "{}: {}", "indexes", self.indexes())?;
1819        write!(f, ", {}: {}", "checksum", self.checksum())?;
1820        write!(f, ", {}: {}", "tx_hash", self.tx_hash())?;
1821        let extra_count = self.count_extra_fields();
1822        if extra_count != 0 {
1823            write!(f, ", .. ({} fields)", extra_count)?;
1824        }
1825        write!(f, " }}")
1826    }
1827}
1828impl ::core::default::Default for BackLink {
1829    fn default() -> Self {
1830        let v = molecule::bytes::Bytes::from_static(&Self::DEFAULT_VALUE);
1831        BackLink::new_unchecked(v)
1832    }
1833}
1834impl BackLink {
1835    const DEFAULT_VALUE: [u8; 56] = [
1836        56, 0, 0, 0, 16, 0, 0, 0, 20, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1837        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1838    ];
1839    pub const FIELD_COUNT: usize = 3;
1840    pub fn total_size(&self) -> usize {
1841        molecule::unpack_number(self.as_slice()) as usize
1842    }
1843    pub fn field_count(&self) -> usize {
1844        if self.total_size() == molecule::NUMBER_SIZE {
1845            0
1846        } else {
1847            (molecule::unpack_number(&self.as_slice()[molecule::NUMBER_SIZE..]) as usize / 4) - 1
1848        }
1849    }
1850    pub fn count_extra_fields(&self) -> usize {
1851        self.field_count() - Self::FIELD_COUNT
1852    }
1853    pub fn has_extra_fields(&self) -> bool {
1854        Self::FIELD_COUNT != self.field_count()
1855    }
1856    pub fn indexes(&self) -> Indexes {
1857        let slice = self.as_slice();
1858        let start = molecule::unpack_number(&slice[4..]) as usize;
1859        let end = molecule::unpack_number(&slice[8..]) as usize;
1860        Indexes::new_unchecked(self.0.slice(start..end))
1861    }
1862    pub fn checksum(&self) -> Uint32 {
1863        let slice = self.as_slice();
1864        let start = molecule::unpack_number(&slice[8..]) as usize;
1865        let end = molecule::unpack_number(&slice[12..]) as usize;
1866        Uint32::new_unchecked(self.0.slice(start..end))
1867    }
1868    pub fn tx_hash(&self) -> Byte32 {
1869        let slice = self.as_slice();
1870        let start = molecule::unpack_number(&slice[12..]) as usize;
1871        if self.has_extra_fields() {
1872            let end = molecule::unpack_number(&slice[16..]) as usize;
1873            Byte32::new_unchecked(self.0.slice(start..end))
1874        } else {
1875            Byte32::new_unchecked(self.0.slice(start..))
1876        }
1877    }
1878    pub fn as_reader<'r>(&'r self) -> BackLinkReader<'r> {
1879        BackLinkReader::new_unchecked(self.as_slice())
1880    }
1881}
1882impl molecule::prelude::Entity for BackLink {
1883    type Builder = BackLinkBuilder;
1884    const NAME: &'static str = "BackLink";
1885    fn new_unchecked(data: molecule::bytes::Bytes) -> Self {
1886        BackLink(data)
1887    }
1888    fn as_bytes(&self) -> molecule::bytes::Bytes {
1889        self.0.clone()
1890    }
1891    fn as_slice(&self) -> &[u8] {
1892        &self.0[..]
1893    }
1894    fn from_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
1895        BackLinkReader::from_slice(slice).map(|reader| reader.to_entity())
1896    }
1897    fn from_compatible_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
1898        BackLinkReader::from_compatible_slice(slice).map(|reader| reader.to_entity())
1899    }
1900    fn new_builder() -> Self::Builder {
1901        ::core::default::Default::default()
1902    }
1903    fn as_builder(self) -> Self::Builder {
1904        Self::new_builder()
1905            .indexes(self.indexes())
1906            .checksum(self.checksum())
1907            .tx_hash(self.tx_hash())
1908    }
1909}
1910#[derive(Clone, Copy)]
1911pub struct BackLinkReader<'r>(&'r [u8]);
1912impl<'r> ::core::fmt::LowerHex for BackLinkReader<'r> {
1913    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1914        use molecule::hex_string;
1915        if f.alternate() {
1916            write!(f, "0x")?;
1917        }
1918        write!(f, "{}", hex_string(self.as_slice()))
1919    }
1920}
1921impl<'r> ::core::fmt::Debug for BackLinkReader<'r> {
1922    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1923        write!(f, "{}({:#x})", Self::NAME, self)
1924    }
1925}
1926impl<'r> ::core::fmt::Display for BackLinkReader<'r> {
1927    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
1928        write!(f, "{} {{ ", Self::NAME)?;
1929        write!(f, "{}: {}", "indexes", self.indexes())?;
1930        write!(f, ", {}: {}", "checksum", self.checksum())?;
1931        write!(f, ", {}: {}", "tx_hash", self.tx_hash())?;
1932        let extra_count = self.count_extra_fields();
1933        if extra_count != 0 {
1934            write!(f, ", .. ({} fields)", extra_count)?;
1935        }
1936        write!(f, " }}")
1937    }
1938}
1939impl<'r> BackLinkReader<'r> {
1940    pub const FIELD_COUNT: usize = 3;
1941    pub fn total_size(&self) -> usize {
1942        molecule::unpack_number(self.as_slice()) as usize
1943    }
1944    pub fn field_count(&self) -> usize {
1945        if self.total_size() == molecule::NUMBER_SIZE {
1946            0
1947        } else {
1948            (molecule::unpack_number(&self.as_slice()[molecule::NUMBER_SIZE..]) as usize / 4) - 1
1949        }
1950    }
1951    pub fn count_extra_fields(&self) -> usize {
1952        self.field_count() - Self::FIELD_COUNT
1953    }
1954    pub fn has_extra_fields(&self) -> bool {
1955        Self::FIELD_COUNT != self.field_count()
1956    }
1957    pub fn indexes(&self) -> IndexesReader<'r> {
1958        let slice = self.as_slice();
1959        let start = molecule::unpack_number(&slice[4..]) as usize;
1960        let end = molecule::unpack_number(&slice[8..]) as usize;
1961        IndexesReader::new_unchecked(&self.as_slice()[start..end])
1962    }
1963    pub fn checksum(&self) -> Uint32Reader<'r> {
1964        let slice = self.as_slice();
1965        let start = molecule::unpack_number(&slice[8..]) as usize;
1966        let end = molecule::unpack_number(&slice[12..]) as usize;
1967        Uint32Reader::new_unchecked(&self.as_slice()[start..end])
1968    }
1969    pub fn tx_hash(&self) -> Byte32Reader<'r> {
1970        let slice = self.as_slice();
1971        let start = molecule::unpack_number(&slice[12..]) as usize;
1972        if self.has_extra_fields() {
1973            let end = molecule::unpack_number(&slice[16..]) as usize;
1974            Byte32Reader::new_unchecked(&self.as_slice()[start..end])
1975        } else {
1976            Byte32Reader::new_unchecked(&self.as_slice()[start..])
1977        }
1978    }
1979}
1980impl<'r> molecule::prelude::Reader<'r> for BackLinkReader<'r> {
1981    type Entity = BackLink;
1982    const NAME: &'static str = "BackLinkReader";
1983    fn to_entity(&self) -> Self::Entity {
1984        Self::Entity::new_unchecked(self.as_slice().to_owned().into())
1985    }
1986    fn new_unchecked(slice: &'r [u8]) -> Self {
1987        BackLinkReader(slice)
1988    }
1989    fn as_slice(&self) -> &'r [u8] {
1990        self.0
1991    }
1992    fn verify(slice: &[u8], compatible: bool) -> molecule::error::VerificationResult<()> {
1993        use molecule::verification_error as ve;
1994        let slice_len = slice.len();
1995        if slice_len < molecule::NUMBER_SIZE {
1996            return ve!(Self, HeaderIsBroken, molecule::NUMBER_SIZE, slice_len);
1997        }
1998        let total_size = molecule::unpack_number(slice) as usize;
1999        if slice_len != total_size {
2000            return ve!(Self, TotalSizeNotMatch, total_size, slice_len);
2001        }
2002        if slice_len < molecule::NUMBER_SIZE * 2 {
2003            return ve!(Self, HeaderIsBroken, molecule::NUMBER_SIZE * 2, slice_len);
2004        }
2005        let offset_first = molecule::unpack_number(&slice[molecule::NUMBER_SIZE..]) as usize;
2006        if offset_first % molecule::NUMBER_SIZE != 0 || offset_first < molecule::NUMBER_SIZE * 2 {
2007            return ve!(Self, OffsetsNotMatch);
2008        }
2009        if slice_len < offset_first {
2010            return ve!(Self, HeaderIsBroken, offset_first, slice_len);
2011        }
2012        let field_count = offset_first / molecule::NUMBER_SIZE - 1;
2013        if field_count < Self::FIELD_COUNT {
2014            return ve!(Self, FieldCountNotMatch, Self::FIELD_COUNT, field_count);
2015        } else if !compatible && field_count > Self::FIELD_COUNT {
2016            return ve!(Self, FieldCountNotMatch, Self::FIELD_COUNT, field_count);
2017        };
2018        let mut offsets: Vec<usize> = slice[molecule::NUMBER_SIZE..offset_first]
2019            .chunks_exact(molecule::NUMBER_SIZE)
2020            .map(|x| molecule::unpack_number(x) as usize)
2021            .collect();
2022        offsets.push(total_size);
2023        if offsets.windows(2).any(|i| i[0] > i[1]) {
2024            return ve!(Self, OffsetsNotMatch);
2025        }
2026        IndexesReader::verify(&slice[offsets[0]..offsets[1]], compatible)?;
2027        Uint32Reader::verify(&slice[offsets[1]..offsets[2]], compatible)?;
2028        Byte32Reader::verify(&slice[offsets[2]..offsets[3]], compatible)?;
2029        Ok(())
2030    }
2031}
2032#[derive(Debug, Default)]
2033pub struct BackLinkBuilder {
2034    pub(crate) indexes: Indexes,
2035    pub(crate) checksum: Uint32,
2036    pub(crate) tx_hash: Byte32,
2037}
2038impl BackLinkBuilder {
2039    pub const FIELD_COUNT: usize = 3;
2040    pub fn indexes(mut self, v: Indexes) -> Self {
2041        self.indexes = v;
2042        self
2043    }
2044    pub fn checksum(mut self, v: Uint32) -> Self {
2045        self.checksum = v;
2046        self
2047    }
2048    pub fn tx_hash(mut self, v: Byte32) -> Self {
2049        self.tx_hash = v;
2050        self
2051    }
2052}
2053impl molecule::prelude::Builder for BackLinkBuilder {
2054    type Entity = BackLink;
2055    const NAME: &'static str = "BackLinkBuilder";
2056    fn expected_length(&self) -> usize {
2057        molecule::NUMBER_SIZE * (Self::FIELD_COUNT + 1)
2058            + self.indexes.as_slice().len()
2059            + self.checksum.as_slice().len()
2060            + self.tx_hash.as_slice().len()
2061    }
2062    fn write<W: molecule::io::Write>(&self, writer: &mut W) -> molecule::io::Result<()> {
2063        let mut total_size = molecule::NUMBER_SIZE * (Self::FIELD_COUNT + 1);
2064        let mut offsets = Vec::with_capacity(Self::FIELD_COUNT);
2065        offsets.push(total_size);
2066        total_size += self.indexes.as_slice().len();
2067        offsets.push(total_size);
2068        total_size += self.checksum.as_slice().len();
2069        offsets.push(total_size);
2070        total_size += self.tx_hash.as_slice().len();
2071        writer.write_all(&molecule::pack_number(total_size as molecule::Number))?;
2072        for offset in offsets.into_iter() {
2073            writer.write_all(&molecule::pack_number(offset as molecule::Number))?;
2074        }
2075        writer.write_all(self.indexes.as_slice())?;
2076        writer.write_all(self.checksum.as_slice())?;
2077        writer.write_all(self.tx_hash.as_slice())?;
2078        Ok(())
2079    }
2080    fn build(&self) -> Self::Entity {
2081        let mut inner = Vec::with_capacity(self.expected_length());
2082        self.write(&mut inner)
2083            .unwrap_or_else(|_| panic!("{} build should be ok", Self::NAME));
2084        BackLink::new_unchecked(inner.into())
2085    }
2086}
2087#[derive(Clone)]
2088pub struct BackLinkVec(molecule::bytes::Bytes);
2089impl ::core::fmt::LowerHex for BackLinkVec {
2090    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
2091        use molecule::hex_string;
2092        if f.alternate() {
2093            write!(f, "0x")?;
2094        }
2095        write!(f, "{}", hex_string(self.as_slice()))
2096    }
2097}
2098impl ::core::fmt::Debug for BackLinkVec {
2099    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
2100        write!(f, "{}({:#x})", Self::NAME, self)
2101    }
2102}
2103impl ::core::fmt::Display for BackLinkVec {
2104    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
2105        write!(f, "{} [", Self::NAME)?;
2106        for i in 0..self.len() {
2107            if i == 0 {
2108                write!(f, "{}", self.get_unchecked(i))?;
2109            } else {
2110                write!(f, ", {}", self.get_unchecked(i))?;
2111            }
2112        }
2113        write!(f, "]")
2114    }
2115}
2116impl ::core::default::Default for BackLinkVec {
2117    fn default() -> Self {
2118        let v = molecule::bytes::Bytes::from_static(&Self::DEFAULT_VALUE);
2119        BackLinkVec::new_unchecked(v)
2120    }
2121}
2122impl BackLinkVec {
2123    const DEFAULT_VALUE: [u8; 4] = [4, 0, 0, 0];
2124    pub fn total_size(&self) -> usize {
2125        molecule::unpack_number(self.as_slice()) as usize
2126    }
2127    pub fn item_count(&self) -> usize {
2128        if self.total_size() == molecule::NUMBER_SIZE {
2129            0
2130        } else {
2131            (molecule::unpack_number(&self.as_slice()[molecule::NUMBER_SIZE..]) as usize / 4) - 1
2132        }
2133    }
2134    pub fn len(&self) -> usize {
2135        self.item_count()
2136    }
2137    pub fn is_empty(&self) -> bool {
2138        self.len() == 0
2139    }
2140    pub fn get(&self, idx: usize) -> Option<BackLink> {
2141        if idx >= self.len() {
2142            None
2143        } else {
2144            Some(self.get_unchecked(idx))
2145        }
2146    }
2147    pub fn get_unchecked(&self, idx: usize) -> BackLink {
2148        let slice = self.as_slice();
2149        let start_idx = molecule::NUMBER_SIZE * (1 + idx);
2150        let start = molecule::unpack_number(&slice[start_idx..]) as usize;
2151        if idx == self.len() - 1 {
2152            BackLink::new_unchecked(self.0.slice(start..))
2153        } else {
2154            let end_idx = start_idx + molecule::NUMBER_SIZE;
2155            let end = molecule::unpack_number(&slice[end_idx..]) as usize;
2156            BackLink::new_unchecked(self.0.slice(start..end))
2157        }
2158    }
2159    pub fn as_reader<'r>(&'r self) -> BackLinkVecReader<'r> {
2160        BackLinkVecReader::new_unchecked(self.as_slice())
2161    }
2162}
2163impl molecule::prelude::Entity for BackLinkVec {
2164    type Builder = BackLinkVecBuilder;
2165    const NAME: &'static str = "BackLinkVec";
2166    fn new_unchecked(data: molecule::bytes::Bytes) -> Self {
2167        BackLinkVec(data)
2168    }
2169    fn as_bytes(&self) -> molecule::bytes::Bytes {
2170        self.0.clone()
2171    }
2172    fn as_slice(&self) -> &[u8] {
2173        &self.0[..]
2174    }
2175    fn from_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
2176        BackLinkVecReader::from_slice(slice).map(|reader| reader.to_entity())
2177    }
2178    fn from_compatible_slice(slice: &[u8]) -> molecule::error::VerificationResult<Self> {
2179        BackLinkVecReader::from_compatible_slice(slice).map(|reader| reader.to_entity())
2180    }
2181    fn new_builder() -> Self::Builder {
2182        ::core::default::Default::default()
2183    }
2184    fn as_builder(self) -> Self::Builder {
2185        Self::new_builder().extend(self.into_iter())
2186    }
2187}
2188#[derive(Clone, Copy)]
2189pub struct BackLinkVecReader<'r>(&'r [u8]);
2190impl<'r> ::core::fmt::LowerHex for BackLinkVecReader<'r> {
2191    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
2192        use molecule::hex_string;
2193        if f.alternate() {
2194            write!(f, "0x")?;
2195        }
2196        write!(f, "{}", hex_string(self.as_slice()))
2197    }
2198}
2199impl<'r> ::core::fmt::Debug for BackLinkVecReader<'r> {
2200    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
2201        write!(f, "{}({:#x})", Self::NAME, self)
2202    }
2203}
2204impl<'r> ::core::fmt::Display for BackLinkVecReader<'r> {
2205    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
2206        write!(f, "{} [", Self::NAME)?;
2207        for i in 0..self.len() {
2208            if i == 0 {
2209                write!(f, "{}", self.get_unchecked(i))?;
2210            } else {
2211                write!(f, ", {}", self.get_unchecked(i))?;
2212            }
2213        }
2214        write!(f, "]")
2215    }
2216}
2217impl<'r> BackLinkVecReader<'r> {
2218    pub fn total_size(&self) -> usize {
2219        molecule::unpack_number(self.as_slice()) as usize
2220    }
2221    pub fn item_count(&self) -> usize {
2222        if self.total_size() == molecule::NUMBER_SIZE {
2223            0
2224        } else {
2225            (molecule::unpack_number(&self.as_slice()[molecule::NUMBER_SIZE..]) as usize / 4) - 1
2226        }
2227    }
2228    pub fn len(&self) -> usize {
2229        self.item_count()
2230    }
2231    pub fn is_empty(&self) -> bool {
2232        self.len() == 0
2233    }
2234    pub fn get(&self, idx: usize) -> Option<BackLinkReader<'r>> {
2235        if idx >= self.len() {
2236            None
2237        } else {
2238            Some(self.get_unchecked(idx))
2239        }
2240    }
2241    pub fn get_unchecked(&self, idx: usize) -> BackLinkReader<'r> {
2242        let slice = self.as_slice();
2243        let start_idx = molecule::NUMBER_SIZE * (1 + idx);
2244        let start = molecule::unpack_number(&slice[start_idx..]) as usize;
2245        if idx == self.len() - 1 {
2246            BackLinkReader::new_unchecked(&self.as_slice()[start..])
2247        } else {
2248            let end_idx = start_idx + molecule::NUMBER_SIZE;
2249            let end = molecule::unpack_number(&slice[end_idx..]) as usize;
2250            BackLinkReader::new_unchecked(&self.as_slice()[start..end])
2251        }
2252    }
2253}
2254impl<'r> molecule::prelude::Reader<'r> for BackLinkVecReader<'r> {
2255    type Entity = BackLinkVec;
2256    const NAME: &'static str = "BackLinkVecReader";
2257    fn to_entity(&self) -> Self::Entity {
2258        Self::Entity::new_unchecked(self.as_slice().to_owned().into())
2259    }
2260    fn new_unchecked(slice: &'r [u8]) -> Self {
2261        BackLinkVecReader(slice)
2262    }
2263    fn as_slice(&self) -> &'r [u8] {
2264        self.0
2265    }
2266    fn verify(slice: &[u8], compatible: bool) -> molecule::error::VerificationResult<()> {
2267        use molecule::verification_error as ve;
2268        let slice_len = slice.len();
2269        if slice_len < molecule::NUMBER_SIZE {
2270            return ve!(Self, HeaderIsBroken, molecule::NUMBER_SIZE, slice_len);
2271        }
2272        let total_size = molecule::unpack_number(slice) as usize;
2273        if slice_len != total_size {
2274            return ve!(Self, TotalSizeNotMatch, total_size, slice_len);
2275        }
2276        if slice_len == molecule::NUMBER_SIZE {
2277            return Ok(());
2278        }
2279        if slice_len < molecule::NUMBER_SIZE * 2 {
2280            return ve!(
2281                Self,
2282                TotalSizeNotMatch,
2283                molecule::NUMBER_SIZE * 2,
2284                slice_len
2285            );
2286        }
2287        let offset_first = molecule::unpack_number(&slice[molecule::NUMBER_SIZE..]) as usize;
2288        if offset_first % molecule::NUMBER_SIZE != 0 || offset_first < molecule::NUMBER_SIZE * 2 {
2289            return ve!(Self, OffsetsNotMatch);
2290        }
2291        if slice_len < offset_first {
2292            return ve!(Self, HeaderIsBroken, offset_first, slice_len);
2293        }
2294        let mut offsets: Vec<usize> = slice[molecule::NUMBER_SIZE..offset_first]
2295            .chunks_exact(molecule::NUMBER_SIZE)
2296            .map(|x| molecule::unpack_number(x) as usize)
2297            .collect();
2298        offsets.push(total_size);
2299        if offsets.windows(2).any(|i| i[0] > i[1]) {
2300            return ve!(Self, OffsetsNotMatch);
2301        }
2302        for pair in offsets.windows(2) {
2303            let start = pair[0];
2304            let end = pair[1];
2305            BackLinkReader::verify(&slice[start..end], compatible)?;
2306        }
2307        Ok(())
2308    }
2309}
2310#[derive(Debug, Default)]
2311pub struct BackLinkVecBuilder(pub(crate) Vec<BackLink>);
2312impl BackLinkVecBuilder {
2313    pub fn set(mut self, v: Vec<BackLink>) -> Self {
2314        self.0 = v;
2315        self
2316    }
2317    pub fn push(mut self, v: BackLink) -> Self {
2318        self.0.push(v);
2319        self
2320    }
2321    pub fn extend<T: ::core::iter::IntoIterator<Item = BackLink>>(mut self, iter: T) -> Self {
2322        for elem in iter {
2323            self.0.push(elem);
2324        }
2325        self
2326    }
2327    pub fn replace(&mut self, index: usize, v: BackLink) -> Option<BackLink> {
2328        self.0
2329            .get_mut(index)
2330            .map(|item| ::core::mem::replace(item, v))
2331    }
2332}
2333impl molecule::prelude::Builder for BackLinkVecBuilder {
2334    type Entity = BackLinkVec;
2335    const NAME: &'static str = "BackLinkVecBuilder";
2336    fn expected_length(&self) -> usize {
2337        molecule::NUMBER_SIZE * (self.0.len() + 1)
2338            + self
2339                .0
2340                .iter()
2341                .map(|inner| inner.as_slice().len())
2342                .sum::<usize>()
2343    }
2344    fn write<W: molecule::io::Write>(&self, writer: &mut W) -> molecule::io::Result<()> {
2345        let item_count = self.0.len();
2346        if item_count == 0 {
2347            writer.write_all(&molecule::pack_number(
2348                molecule::NUMBER_SIZE as molecule::Number,
2349            ))?;
2350        } else {
2351            let (total_size, offsets) = self.0.iter().fold(
2352                (
2353                    molecule::NUMBER_SIZE * (item_count + 1),
2354                    Vec::with_capacity(item_count),
2355                ),
2356                |(start, mut offsets), inner| {
2357                    offsets.push(start);
2358                    (start + inner.as_slice().len(), offsets)
2359                },
2360            );
2361            writer.write_all(&molecule::pack_number(total_size as molecule::Number))?;
2362            for offset in offsets.into_iter() {
2363                writer.write_all(&molecule::pack_number(offset as molecule::Number))?;
2364            }
2365            for inner in self.0.iter() {
2366                writer.write_all(inner.as_slice())?;
2367            }
2368        }
2369        Ok(())
2370    }
2371    fn build(&self) -> Self::Entity {
2372        let mut inner = Vec::with_capacity(self.expected_length());
2373        self.write(&mut inner)
2374            .unwrap_or_else(|_| panic!("{} build should be ok", Self::NAME));
2375        BackLinkVec::new_unchecked(inner.into())
2376    }
2377}
2378pub struct BackLinkVecIterator(BackLinkVec, usize, usize);
2379impl ::core::iter::Iterator for BackLinkVecIterator {
2380    type Item = BackLink;
2381    fn next(&mut self) -> Option<Self::Item> {
2382        if self.1 >= self.2 {
2383            None
2384        } else {
2385            let ret = self.0.get_unchecked(self.1);
2386            self.1 += 1;
2387            Some(ret)
2388        }
2389    }
2390}
2391impl ::core::iter::ExactSizeIterator for BackLinkVecIterator {
2392    fn len(&self) -> usize {
2393        self.2 - self.1
2394    }
2395}
2396impl ::core::iter::IntoIterator for BackLinkVec {
2397    type Item = BackLink;
2398    type IntoIter = BackLinkVecIterator;
2399    fn into_iter(self) -> Self::IntoIter {
2400        let len = self.len();
2401        BackLinkVecIterator(self, 0, len)
2402    }
2403}
2404impl<'r> BackLinkVecReader<'r> {
2405    pub fn iter<'t>(&'t self) -> BackLinkVecReaderIterator<'t, 'r> {
2406        BackLinkVecReaderIterator(&self, 0, self.len())
2407    }
2408}
2409pub struct BackLinkVecReaderIterator<'t, 'r>(&'t BackLinkVecReader<'r>, usize, usize);
2410impl<'t: 'r, 'r> ::core::iter::Iterator for BackLinkVecReaderIterator<'t, 'r> {
2411    type Item = BackLinkReader<'t>;
2412    fn next(&mut self) -> Option<Self::Item> {
2413        if self.1 >= self.2 {
2414            None
2415        } else {
2416            let ret = self.0.get_unchecked(self.1);
2417            self.1 += 1;
2418            Some(ret)
2419        }
2420    }
2421}
2422impl<'t: 'r, 'r> ::core::iter::ExactSizeIterator for BackLinkVecReaderIterator<'t, 'r> {
2423    fn len(&self) -> usize {
2424        self.2 - self.1
2425    }
2426}