1use crate::error::{BufferResult, LzwError, LzwStatus, VectorResult};
3use crate::{BitOrder, Code, StreamBuf, MAX_CODESIZE, MAX_ENTRIES, STREAM_BUF_SIZE};
4
5use crate::alloc::{boxed::Box, vec::Vec};
6#[cfg(feature = "std")]
7use crate::error::StreamResult;
8#[cfg(feature = "std")]
9use std::io::{self, BufRead, Write};
10
11pub struct Encoder {
33 state: Box<dyn Stateful + Send + 'static>,
37}
38
39#[cfg_attr(
45 not(feature = "std"),
46 deprecated = "This type is only useful with the `std` feature."
47)]
48#[cfg_attr(not(feature = "std"), allow(dead_code))]
49pub struct IntoStream<'d, W> {
50 encoder: &'d mut Encoder,
51 writer: W,
52 buffer: Option<StreamBuf<'d>>,
53 default_size: usize,
54}
55
56#[cfg(feature = "async")]
62pub struct IntoAsync<'d, W> {
63 encoder: &'d mut Encoder,
64 writer: W,
65 buffer: Option<StreamBuf<'d>>,
66 default_size: usize,
67}
68
69pub struct IntoVec<'d> {
75 encoder: &'d mut Encoder,
76 vector: &'d mut Vec<u8>,
77}
78
79trait Stateful {
80 fn advance(&mut self, inp: &[u8], out: &mut [u8]) -> BufferResult;
81 fn mark_ended(&mut self) -> bool;
82 fn restart(&mut self);
84 fn reset(&mut self);
86}
87
88struct EncodeState<B: Buffer> {
89 min_size: u8,
91 tree: Tree,
93 has_ended: bool,
95 is_tiff: bool,
97 current_code: Code,
99 clear_code: Code,
101 buffer: B,
103}
104
105struct MsbBuffer {
106 code_size: u8,
108 buffer: u64,
110 bits_in_buffer: u8,
112}
113
114struct LsbBuffer {
115 code_size: u8,
117 buffer: u64,
119 bits_in_buffer: u8,
121}
122
123trait Buffer {
124 fn new(size: u8) -> Self;
125 fn reset(&mut self, min_size: u8);
127 fn clear(&mut self, min_size: u8);
129 fn buffer_code(&mut self, code: Code);
131 fn push_out(&mut self, out: &mut &mut [u8]) -> bool;
133 fn flush_out(&mut self, out: &mut &mut [u8]) -> bool;
135 fn buffer_pad(&mut self);
137 fn bump_code_size(&mut self);
139 fn max_code(&self) -> Code;
141 fn code_size(&self) -> u8;
143}
144
145#[derive(Default)]
149struct Tree {
150 simples: Vec<Simple>,
151 complex: Vec<Full>,
152 keys: Vec<CompressedKey>,
153}
154
155#[derive(Clone, Copy)]
156enum FullKey {
157 NoSuccessor,
158 Simple(u16),
159 Full(u16),
160}
161
162#[derive(Clone, Copy)]
163struct CompressedKey(u16);
164
165const SHORT: usize = 16;
166
167#[derive(Clone, Copy)]
168struct Simple {
169 codes: [Code; SHORT],
170 chars: [u8; SHORT],
171 count: u8,
172}
173
174#[derive(Clone, Copy)]
175struct Full {
176 char_continuation: [Code; 256],
177}
178
179#[derive(Clone, Debug)]
181pub struct Configuration {
182 order: BitOrder,
183 size: u8,
184 tiff: bool,
185}
186
187impl Configuration {
188 pub fn new(order: BitOrder, size: u8) -> Self {
194 super::assert_encode_size(size);
195 Configuration {
196 order,
197 size,
198 tiff: false,
199 }
200 }
201
202 pub fn with_tiff_size_switch(order: BitOrder, size: u8) -> Self {
208 super::assert_encode_size(size);
209 Configuration {
210 order,
211 size,
212 tiff: true,
213 }
214 }
215
216 pub fn build(self) -> Encoder {
218 Encoder {
219 state: Encoder::from_configuration(&self),
220 }
221 }
222}
223
224impl Encoder {
225 pub fn new(order: BitOrder, size: u8) -> Self {
235 Configuration::new(order, size).build()
236 }
237
238 pub fn with_tiff_size_switch(order: BitOrder, size: u8) -> Self {
248 Configuration::with_tiff_size_switch(order, size).build()
249 }
250
251 fn from_configuration(cfg: &Configuration) -> Box<dyn Stateful + Send + 'static> {
252 match cfg.order {
253 BitOrder::Lsb => {
254 let mut state = EncodeState::<LsbBuffer>::new(cfg.size);
255 state.is_tiff = cfg.tiff;
256 Box::new(state)
257 }
258 BitOrder::Msb => {
259 let mut state = EncodeState::<MsbBuffer>::new(cfg.size);
260 state.is_tiff = cfg.tiff;
261 Box::new(state)
262 }
263 }
264 }
265
266 pub fn encode_bytes(&mut self, inp: &[u8], out: &mut [u8]) -> BufferResult {
279 self.state.advance(inp, out)
280 }
281
282 pub fn encode(&mut self, data: &[u8]) -> Result<Vec<u8>, LzwError> {
303 let mut output = Vec::new();
304 self.into_vec(&mut output).encode_all(data).status?;
305 Ok(output)
306 }
307
308 #[cfg(feature = "std")]
310 pub fn into_stream<W: Write>(&mut self, writer: W) -> IntoStream<'_, W> {
311 IntoStream {
312 encoder: self,
313 writer,
314 buffer: None,
315 default_size: STREAM_BUF_SIZE,
316 }
317 }
318
319 #[cfg(feature = "async")]
321 pub fn into_async<W: futures::io::AsyncWrite>(&mut self, writer: W) -> IntoAsync<'_, W> {
322 IntoAsync {
323 encoder: self,
324 writer,
325 buffer: None,
326 default_size: STREAM_BUF_SIZE,
327 }
328 }
329
330 pub fn into_vec<'lt>(&'lt mut self, vec: &'lt mut Vec<u8>) -> IntoVec<'lt> {
338 IntoVec {
339 encoder: self,
340 vector: vec,
341 }
342 }
343
344 pub fn finish(&mut self) {
352 self.state.mark_ended();
353 }
354
355 #[allow(dead_code)]
358 pub(crate) fn restart(&mut self) {
359 self.state.restart()
360 }
361
362 pub fn reset(&mut self) {
368 self.state.reset()
369 }
370}
371
372#[cfg(feature = "std")]
373impl<'d, W: Write> IntoStream<'d, W> {
374 pub fn encode(&mut self, read: impl BufRead) -> StreamResult {
379 self.encode_part(read, false)
380 }
381
382 pub fn encode_all(mut self, read: impl BufRead) -> StreamResult {
384 self.encode_part(read, true)
385 }
386
387 pub fn set_buffer_size(&mut self, size: usize) {
396 assert_ne!(size, 0, "Attempted to set empty buffer");
397 self.default_size = size;
398 }
399
400 pub fn set_buffer(&mut self, buffer: &'d mut [u8]) {
410 assert_ne!(buffer.len(), 0, "Attempted to set empty buffer");
411 self.buffer = Some(StreamBuf::Borrowed(buffer));
412 }
413
414 fn encode_part(&mut self, mut read: impl BufRead, finish: bool) -> StreamResult {
415 let IntoStream {
416 encoder,
417 writer,
418 buffer,
419 default_size,
420 } = self;
421 enum Progress {
422 Ok,
423 Done,
424 }
425
426 let mut bytes_read = 0;
427 let mut bytes_written = 0;
428
429 let read_bytes = &mut bytes_read;
430 let write_bytes = &mut bytes_written;
431
432 let outbuf: &mut [u8] =
433 match { buffer.get_or_insert_with(|| StreamBuf::Owned(vec![0u8; *default_size])) } {
434 StreamBuf::Borrowed(slice) => &mut *slice,
435 StreamBuf::Owned(vec) => &mut *vec,
436 };
437 assert!(!outbuf.is_empty());
438
439 let once = move || {
440 let data = read.fill_buf()?;
441
442 if data.is_empty() {
443 if finish {
444 encoder.finish();
445 } else {
446 return Ok(Progress::Done);
447 }
448 }
449
450 let result = encoder.encode_bytes(data, &mut outbuf[..]);
451 *read_bytes += result.consumed_in;
452 *write_bytes += result.consumed_out;
453 read.consume(result.consumed_in);
454
455 let done = result.status.map_err(|err| {
456 io::Error::new(io::ErrorKind::InvalidData, &*format!("{:?}", err))
457 })?;
458
459 if let LzwStatus::Done = done {
460 writer.write_all(&outbuf[..result.consumed_out])?;
461 return Ok(Progress::Done);
462 }
463
464 if let LzwStatus::NoProgress = done {
465 return Err(io::Error::new(
466 io::ErrorKind::UnexpectedEof,
467 "No more data but no end marker detected",
468 ));
469 }
470
471 writer.write_all(&outbuf[..result.consumed_out])?;
472 Ok(Progress::Ok)
473 };
474
475 let status = core::iter::repeat_with(once)
476 .scan((), |(), result| match result {
478 Ok(Progress::Ok) => Some(Ok(())),
479 Err(err) => Some(Err(err)),
480 Ok(Progress::Done) => None,
481 })
482 .fuse()
483 .collect();
484
485 StreamResult {
486 bytes_read,
487 bytes_written,
488 status,
489 }
490 }
491}
492
493impl IntoVec<'_> {
494 pub fn encode(&mut self, read: &[u8]) -> VectorResult {
496 self.encode_part(read, false)
497 }
498
499 pub fn encode_all(mut self, read: &[u8]) -> VectorResult {
501 self.encode_part(read, true)
502 }
503
504 fn grab_buffer(&mut self) -> (&mut [u8], &mut Encoder) {
505 const CHUNK_SIZE: usize = 1 << 12;
506 let decoder = &mut self.encoder;
507 let length = self.vector.len();
508
509 self.vector.reserve(CHUNK_SIZE);
511 self.vector.resize(length + CHUNK_SIZE, 0u8);
513
514 (&mut self.vector[length..], decoder)
515 }
516
517 fn encode_part(&mut self, part: &[u8], finish: bool) -> VectorResult {
518 let mut result = VectorResult {
519 consumed_in: 0,
520 consumed_out: 0,
521 status: Ok(LzwStatus::Ok),
522 };
523
524 enum Progress {
525 Ok,
526 Done,
527 }
528
529 let read_bytes = &mut result.consumed_in;
531 let write_bytes = &mut result.consumed_out;
532 let mut data = part;
533
534 let once = move || {
537 let (outbuf, encoder) = self.grab_buffer();
539
540 if finish {
541 encoder.finish();
542 }
543
544 let result = encoder.encode_bytes(data, &mut outbuf[..]);
546 *read_bytes += result.consumed_in;
548 *write_bytes += result.consumed_out;
549 data = &data[result.consumed_in..];
550
551 let unfilled = outbuf.len() - result.consumed_out;
552 let filled = self.vector.len() - unfilled;
553 self.vector.truncate(filled);
554
555 let done = result.status?;
557 if let LzwStatus::Done = done {
558 Ok(Progress::Done)
559 } else {
560 Ok(Progress::Ok)
561 }
562 };
563
564 let status: Result<(), _> = core::iter::repeat_with(once)
566 .scan((), |(), result| match result {
568 Ok(Progress::Ok) => Some(Ok(())),
569 Err(err) => Some(Err(err)),
570 Ok(Progress::Done) => None,
571 })
572 .fuse()
573 .collect();
574
575 if let Err(err) = status {
576 result.status = Err(err);
577 }
578
579 result
580 }
581}
582
583#[cfg(feature = "async")]
587#[path = "encode_into_async.rs"]
588mod impl_encode_into_async;
589
590impl<B: Buffer> EncodeState<B> {
591 fn new(min_size: u8) -> Self {
592 let clear_code = 1 << min_size;
593 let mut tree = Tree::default();
594 tree.init(min_size);
595 let mut state = EncodeState {
596 min_size,
597 tree,
598 has_ended: false,
599 is_tiff: false,
600 current_code: clear_code,
601 clear_code,
602 buffer: B::new(min_size),
603 };
604 state.buffer_code(clear_code);
605 state
606 }
607}
608
609impl<B: Buffer> Stateful for EncodeState<B> {
610 fn advance(&mut self, mut inp: &[u8], mut out: &mut [u8]) -> BufferResult {
611 let c_in = inp.len();
612 let c_out = out.len();
613 let mut status = Ok(LzwStatus::Ok);
614
615 'encoding: loop {
616 if self.push_out(&mut out) {
617 break;
618 }
619
620 if inp.is_empty() && self.has_ended {
621 let end = self.end_code();
622 if self.current_code != end {
623 if self.current_code != self.clear_code {
624 self.buffer_code(self.current_code);
625
626 if self.tree.keys.len() + usize::from(self.is_tiff)
630 > usize::from(self.buffer.max_code())
631 && self.buffer.code_size() < MAX_CODESIZE
632 {
633 self.buffer.bump_code_size();
634 }
635 }
636 self.buffer_code(end);
637 self.current_code = end;
638 self.buffer_pad();
639 }
640
641 break;
642 }
643
644 let mut next_code = None;
645 let mut bytes = inp.iter();
646 while let Some(&byte) = bytes.next() {
647 if self.min_size < 8 && byte >= 1 << self.min_size {
648 status = Err(LzwError::InvalidCode);
649 break 'encoding;
650 }
651
652 inp = bytes.as_slice();
653 match self.tree.iterate(self.current_code, byte) {
654 Ok(code) => self.current_code = code,
655 Err(_) => {
656 next_code = Some(self.current_code);
657
658 self.current_code = u16::from(byte);
659 break;
660 }
661 }
662 }
663
664 match next_code {
665 None => break,
667 Some(code) => {
668 self.buffer_code(code);
669
670 if self.tree.keys.len() + usize::from(self.is_tiff)
671 > usize::from(self.buffer.max_code()) + 1
672 && self.buffer.code_size() < MAX_CODESIZE
673 {
674 self.buffer.bump_code_size();
675 }
676
677 if self.tree.keys.len() > MAX_ENTRIES {
678 self.buffer_code(self.clear_code);
679 self.tree.reset(self.min_size);
680 self.buffer.clear(self.min_size);
681 }
682 }
683 }
684 }
685
686 if inp.is_empty() && self.current_code == self.end_code() {
687 if !self.flush_out(&mut out) {
688 status = Ok(LzwStatus::Done);
689 }
690 }
691
692 BufferResult {
693 consumed_in: c_in - inp.len(),
694 consumed_out: c_out - out.len(),
695 status,
696 }
697 }
698
699 fn mark_ended(&mut self) -> bool {
700 core::mem::replace(&mut self.has_ended, true)
701 }
702
703 fn restart(&mut self) {
704 self.has_ended = false;
705 }
706
707 fn reset(&mut self) {
708 self.restart();
709 self.current_code = self.clear_code;
710 self.tree.reset(self.min_size);
711 self.buffer.reset(self.min_size);
712 self.buffer_code(self.clear_code);
713 }
714}
715
716impl<B: Buffer> EncodeState<B> {
717 fn push_out(&mut self, out: &mut &mut [u8]) -> bool {
718 self.buffer.push_out(out)
719 }
720
721 fn flush_out(&mut self, out: &mut &mut [u8]) -> bool {
722 self.buffer.flush_out(out)
723 }
724
725 fn end_code(&self) -> Code {
726 self.clear_code + 1
727 }
728
729 fn buffer_pad(&mut self) {
730 self.buffer.buffer_pad();
731 }
732
733 fn buffer_code(&mut self, code: Code) {
734 self.buffer.buffer_code(code);
735 }
736}
737
738impl Buffer for MsbBuffer {
739 fn new(min_size: u8) -> Self {
740 MsbBuffer {
741 code_size: min_size + 1,
742 buffer: 0,
743 bits_in_buffer: 0,
744 }
745 }
746
747 fn reset(&mut self, min_size: u8) {
748 self.code_size = min_size + 1;
749 self.buffer = 0;
750 self.bits_in_buffer = 0;
751 }
752
753 fn clear(&mut self, min_size: u8) {
754 self.code_size = min_size + 1;
755 }
756
757 fn buffer_code(&mut self, code: Code) {
758 let shift = 64 - self.bits_in_buffer - self.code_size;
759 self.buffer |= u64::from(code) << shift;
760 self.bits_in_buffer += self.code_size;
761 }
762
763 fn push_out(&mut self, out: &mut &mut [u8]) -> bool {
764 if self.bits_in_buffer + 2 * self.code_size < 64 {
765 return false;
766 }
767
768 self.flush_out(out)
769 }
770
771 fn flush_out(&mut self, out: &mut &mut [u8]) -> bool {
772 let want = usize::from(self.bits_in_buffer / 8);
773 let count = want.min((*out).len());
774 let (bytes, tail) = core::mem::replace(out, &mut []).split_at_mut(count);
775 *out = tail;
776
777 for b in bytes {
778 *b = ((self.buffer & 0xff00_0000_0000_0000) >> 56) as u8;
779 self.buffer <<= 8;
780 self.bits_in_buffer -= 8;
781 }
782
783 count < want
784 }
785
786 fn buffer_pad(&mut self) {
787 let to_byte = self.bits_in_buffer.wrapping_neg() & 0x7;
788 self.bits_in_buffer += to_byte;
789 }
790
791 fn bump_code_size(&mut self) {
792 self.code_size += 1;
793 }
794
795 fn max_code(&self) -> Code {
796 (1 << self.code_size) - 1
797 }
798
799 fn code_size(&self) -> u8 {
800 self.code_size
801 }
802}
803
804impl Buffer for LsbBuffer {
805 fn new(min_size: u8) -> Self {
806 LsbBuffer {
807 code_size: min_size + 1,
808 buffer: 0,
809 bits_in_buffer: 0,
810 }
811 }
812
813 fn reset(&mut self, min_size: u8) {
814 self.code_size = min_size + 1;
815 self.buffer = 0;
816 self.bits_in_buffer = 0;
817 }
818
819 fn clear(&mut self, min_size: u8) {
820 self.code_size = min_size + 1;
821 }
822
823 fn buffer_code(&mut self, code: Code) {
824 self.buffer |= u64::from(code) << self.bits_in_buffer;
825 self.bits_in_buffer += self.code_size;
826 }
827
828 fn push_out(&mut self, out: &mut &mut [u8]) -> bool {
829 if self.bits_in_buffer + 2 * self.code_size < 64 {
830 return false;
831 }
832
833 self.flush_out(out)
834 }
835
836 fn flush_out(&mut self, out: &mut &mut [u8]) -> bool {
837 let want = usize::from(self.bits_in_buffer / 8);
838 let count = want.min((*out).len());
839 let (bytes, tail) = core::mem::replace(out, &mut []).split_at_mut(count);
840 *out = tail;
841
842 for b in bytes {
843 *b = (self.buffer & 0x0000_0000_0000_00ff) as u8;
844 self.buffer >>= 8;
845 self.bits_in_buffer -= 8;
846 }
847
848 count < want
849 }
850
851 fn buffer_pad(&mut self) {
852 let to_byte = self.bits_in_buffer.wrapping_neg() & 0x7;
853 self.bits_in_buffer += to_byte;
854 }
855
856 fn bump_code_size(&mut self) {
857 self.code_size += 1;
858 }
859
860 fn max_code(&self) -> Code {
861 (1 << self.code_size) - 1
862 }
863
864 fn code_size(&self) -> u8 {
865 self.code_size
866 }
867}
868
869impl Tree {
870 fn init(&mut self, min_size: u8) {
871 self.keys
874 .resize((1 << min_size) + 2, FullKey::NoSuccessor.into());
875 self.complex.push(Full {
876 char_continuation: [0; 256],
877 });
878 let map_of_begin = self.complex.last_mut().unwrap();
879 for ch in 0u16..256 {
880 map_of_begin.char_continuation[usize::from(ch)] = ch;
881 }
882 self.keys[1 << min_size] = FullKey::Full(0).into();
883 }
884
885 fn reset(&mut self, min_size: u8) {
886 self.simples.clear();
887 self.keys.truncate((1 << min_size) + 2);
888 self.complex.truncate(1);
890 for k in self.keys[..(1 << min_size) + 2].iter_mut() {
892 *k = FullKey::NoSuccessor.into();
893 }
894 self.keys[1 << min_size] = FullKey::Full(0).into();
895 }
896
897 fn at_key(&self, code: Code, ch: u8) -> Option<Code> {
898 let key = self.keys[usize::from(code)];
899 match FullKey::from(key) {
900 FullKey::NoSuccessor => None,
901 FullKey::Simple(idx) => {
902 let nexts = &self.simples[usize::from(idx)];
903 let successors = nexts
904 .codes
905 .iter()
906 .zip(nexts.chars.iter())
907 .take(usize::from(nexts.count));
908 for (&scode, &sch) in successors {
909 if sch == ch {
910 return Some(scode);
911 }
912 }
913
914 None
915 }
916 FullKey::Full(idx) => {
917 let full = &self.complex[usize::from(idx)];
918 let precode = full.char_continuation[usize::from(ch)];
919 if usize::from(precode) < MAX_ENTRIES {
920 Some(precode)
921 } else {
922 None
923 }
924 }
925 }
926 }
927
928 fn iterate(&mut self, code: Code, ch: u8) -> Result<Code, Code> {
931 if let Some(next) = self.at_key(code, ch) {
932 Ok(next)
933 } else {
934 Err(self.append(code, ch))
935 }
936 }
937
938 fn append(&mut self, code: Code, ch: u8) -> Code {
939 let next: Code = self.keys.len() as u16;
940 let key = self.keys[usize::from(code)];
941 match FullKey::from(key) {
943 FullKey::NoSuccessor => {
944 let new_key = FullKey::Simple(self.simples.len() as u16);
945 self.simples.push(Simple::default());
946 let simples = self.simples.last_mut().unwrap();
947 simples.codes[0] = next;
948 simples.chars[0] = ch;
949 simples.count = 1;
950 self.keys[usize::from(code)] = new_key.into();
951 }
952 FullKey::Simple(idx) if usize::from(self.simples[usize::from(idx)].count) < SHORT => {
953 let nexts = &mut self.simples[usize::from(idx)];
954 let nidx = usize::from(nexts.count);
955 nexts.chars[nidx] = ch;
956 nexts.codes[nidx] = next;
957 nexts.count += 1;
958 }
959 FullKey::Simple(idx) => {
960 let new_key = FullKey::Full(self.complex.len() as u16);
961 let simples = &self.simples[usize::from(idx)];
962 self.complex.push(Full {
963 char_continuation: [Code::max_value(); 256],
964 });
965 let full = self.complex.last_mut().unwrap();
966 for (&pch, &pcont) in simples.chars.iter().zip(simples.codes.iter()) {
967 full.char_continuation[usize::from(pch)] = pcont;
968 }
969 self.keys[usize::from(code)] = new_key.into();
970 }
971 FullKey::Full(idx) => {
972 let full = &mut self.complex[usize::from(idx)];
973 full.char_continuation[usize::from(ch)] = next;
974 }
975 }
976 self.keys.push(FullKey::NoSuccessor.into());
977 next
978 }
979}
980
981impl Default for FullKey {
982 fn default() -> Self {
983 FullKey::NoSuccessor
984 }
985}
986
987impl Default for Simple {
988 fn default() -> Self {
989 Simple {
990 codes: [0; SHORT],
991 chars: [0; SHORT],
992 count: 0,
993 }
994 }
995}
996
997impl From<CompressedKey> for FullKey {
998 fn from(CompressedKey(key): CompressedKey) -> Self {
999 match (key >> MAX_CODESIZE) & 0xf {
1000 0 => FullKey::Full(key & 0xfff),
1001 1 => FullKey::Simple(key & 0xfff),
1002 _ => FullKey::NoSuccessor,
1003 }
1004 }
1005}
1006
1007impl From<FullKey> for CompressedKey {
1008 fn from(full: FullKey) -> Self {
1009 CompressedKey(match full {
1010 FullKey::NoSuccessor => 0x2000,
1011 FullKey::Simple(code) => 0x1000 | code,
1012 FullKey::Full(code) => code,
1013 })
1014 }
1015}
1016
1017#[cfg(test)]
1018mod tests {
1019 use super::{BitOrder, Encoder, LzwError, LzwStatus};
1020 use crate::alloc::vec::Vec;
1021 use crate::decode::Decoder;
1022 #[cfg(feature = "std")]
1023 use crate::StreamBuf;
1024
1025 #[test]
1026 fn invalid_input_rejected() {
1027 const BIT_LEN: u8 = 2;
1028 let ref input = [0, 1 << BIT_LEN , 0];
1029 let ref mut target = [0u8; 128];
1030 let mut encoder = Encoder::new(BitOrder::Msb, BIT_LEN);
1031
1032 encoder.finish();
1033 let result = encoder.encode_bytes(input, target);
1035 assert!(if let Err(LzwError::InvalidCode) = result.status {
1036 true
1037 } else {
1038 false
1039 });
1040 assert_eq!(result.consumed_in, 1);
1041
1042 let fixed = encoder.encode_bytes(&[1, 0], &mut target[result.consumed_out..]);
1043 assert!(if let Ok(LzwStatus::Done) = fixed.status {
1044 true
1045 } else {
1046 false
1047 });
1048 assert_eq!(fixed.consumed_in, 2);
1049
1050 let ref mut compare = [0u8; 4];
1052 let mut todo = &target[..result.consumed_out + fixed.consumed_out];
1053 let mut free = &mut compare[..];
1054 let mut decoder = Decoder::new(BitOrder::Msb, BIT_LEN);
1055
1056 for _ in 0..16 {
1058 if decoder.has_ended() {
1059 break;
1060 }
1061
1062 let result = decoder.decode_bytes(todo, free);
1063 assert!(result.status.is_ok());
1064 todo = &todo[result.consumed_in..];
1065 free = &mut free[result.consumed_out..];
1066 }
1067
1068 let remaining = { free }.len();
1069 let len = compare.len() - remaining;
1070 assert_eq!(todo, &[]);
1071 assert_eq!(compare[..len], [0, 1, 0]);
1072 }
1073
1074 #[test]
1075 #[should_panic]
1076 fn invalid_code_size_low() {
1077 let _ = Encoder::new(BitOrder::Msb, 1);
1078 }
1079
1080 #[test]
1081 #[should_panic]
1082 fn invalid_code_size_high() {
1083 let _ = Encoder::new(BitOrder::Msb, 14);
1084 }
1085
1086 fn make_decoded() -> Vec<u8> {
1087 const FILE: &'static [u8] =
1088 include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/Cargo.lock"));
1089 return Vec::from(FILE);
1090 }
1091
1092 #[test]
1093 #[cfg(feature = "std")]
1094 fn into_stream_buffer_no_alloc() {
1095 let encoded = make_decoded();
1096 let mut encoder = Encoder::new(BitOrder::Msb, 8);
1097
1098 let mut output = vec![];
1099 let mut buffer = [0; 512];
1100 let mut istream = encoder.into_stream(&mut output);
1101 istream.set_buffer(&mut buffer[..]);
1102 istream.encode(&encoded[..]).status.unwrap();
1103
1104 match istream.buffer {
1105 Some(StreamBuf::Borrowed(_)) => {}
1106 None => panic!("Decoded without buffer??"),
1107 Some(StreamBuf::Owned(_)) => panic!("Unexpected buffer allocation"),
1108 }
1109 }
1110
1111 #[test]
1112 #[cfg(feature = "std")]
1113 fn into_stream_buffer_small_alloc() {
1114 struct WriteTap<W: std::io::Write>(W);
1115 const BUF_SIZE: usize = 512;
1116
1117 impl<W: std::io::Write> std::io::Write for WriteTap<W> {
1118 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
1119 assert!(buf.len() <= BUF_SIZE);
1120 self.0.write(buf)
1121 }
1122 fn flush(&mut self) -> std::io::Result<()> {
1123 self.0.flush()
1124 }
1125 }
1126
1127 let encoded = make_decoded();
1128 let mut encoder = Encoder::new(BitOrder::Msb, 8);
1129
1130 let mut output = vec![];
1131 let mut istream = encoder.into_stream(WriteTap(&mut output));
1132 istream.set_buffer_size(512);
1133 istream.encode(&encoded[..]).status.unwrap();
1134
1135 match istream.buffer {
1136 Some(StreamBuf::Owned(vec)) => assert!(vec.len() <= BUF_SIZE),
1137 Some(StreamBuf::Borrowed(_)) => panic!("Unexpected borrowed buffer, where from?"),
1138 None => panic!("Decoded without buffer??"),
1139 }
1140 }
1141
1142 #[test]
1143 #[cfg(feature = "std")]
1144 fn reset() {
1145 let encoded = make_decoded();
1146 let mut encoder = Encoder::new(BitOrder::Msb, 8);
1147 let mut reference = None;
1148
1149 for _ in 0..2 {
1150 let mut output = vec![];
1151 let mut buffer = [0; 512];
1152 let mut istream = encoder.into_stream(&mut output);
1153 istream.set_buffer(&mut buffer[..]);
1154 istream.encode_all(&encoded[..]).status.unwrap();
1155
1156 encoder.reset();
1157 if let Some(reference) = &reference {
1158 assert_eq!(output, *reference);
1159 } else {
1160 reference = Some(output);
1161 }
1162 }
1163 }
1164}