1use 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}