Closed
Description
Code
struct SqueneceBuffer<'a, T>
where
&'a T: IntoIterator<Item = &'a u8>,
{
iter: <&'a T as IntoIterator>::IntoIter,
}
impl<'a, T> SqueneceBuffer<'a, T>
where
&'a T: IntoIterator<Item = &'a u8>,
{
fn new(sq: &'a T) -> Self {
Self {
iter: sq.into_iter(),
}
}
fn get(&mut self) -> Option<&'a u8> {
self.iter.next()
}
}
#[allow(dead_code)]
pub struct Helper<'a, T>
where
&'a T: IntoIterator<Item = &'a u8>,
{
buf: SqueneceBuffer<'a, T>,
unit: u8,
num: u8,
used_bit: u8,
}
#[allow(dead_code)]
impl<'a, T> Helper<'a, T>
where
&'a T: IntoIterator<Item = &'a u8>,
{
pub fn new(sq: &'a T) -> Self {
let mut result = Self {
buf: SqueneceBuffer::new(sq),
unit: 8,
num: 0,
used_bit: 0,
};
match result.update() {
true => result,
_ => panic!("the squenece can not be empty!"),
}
}
fn update(&mut self) -> bool {
let nop = self.buf.get();
match nop {
Some(n) => {
self.num = *n;
self.used_bit = 0;
true
}
_ => false,
}
}
pub fn set_unit(&mut self, u: u8) {
if u > 32 || u == 0 {
panic!("the unit can neither be greater than 32 nor 0")
}
self.unit = u;
}
pub fn get_num_by_bit(&mut self, bit: u8) -> GetResult {
if bit > 32 || bit == 0 {
return GetResult::Error;
}
let mut rest_bit = 8 - self.used_bit;
if rest_bit == 0 {
if self.update() {
rest_bit = 8
} else {
return GetResult::Fail;
}
}
let diff: i8 = bit as i8 - rest_bit as i8;
if diff <= 0 {
let num: u32 = (((0xff as u8 >> self.used_bit) & self.num) >> -diff as u8) as u32;
self.used_bit += bit;
return GetResult::Whole(num);
}
let mut slice: [Option<u8>; 4] = [None; 4];
slice[0] = Some((0xff as u8 >> self.used_bit) & self.num);
let mut result: u32 = slice[0].unwrap() as u32;
let mut bits = rest_bit;
let exp_bytes: u8 = (diff / 8) as u8;
let exp_bits: u8 = (diff % 8) as u8;
let mut i: u8 = 1;
while i <= exp_bytes {
if self.update() == false {
break;
}
slice[i as usize] = Some(self.num);
i += 1;
}
for j in &slice[1..] {
match j {
Some(n) => {
result = (result << 8) + *n as u32;
bits += 8;
}
_ => break,
}
}
self.used_bit = 8;
if i <= exp_bytes {
return GetResult::Semi(result, bits);
}
if exp_bits == 0 {
return GetResult::Whole(result);
}
if !self.update() {
return GetResult::Semi(result, bits);
}
result = (result << exp_bits as u32) + (self.num >> (8 - exp_bits as u32) as u8) as u32;
self.used_bit = exp_bits;
return GetResult::Whole(result);
}
}
#[allow(dead_code)]
#[derive(Debug)]
pub enum GetResult {
Whole(u32),
Semi(u32, u8),
Fail,
Error,
}
// bug!!!
pub struct BitReaderWrapper<T>(T);
impl<'a, T> IntoIterator for &'a BitReaderWrapper<T>
where
&'a T: IntoIterator<Item = &'a u8>,
{
type Item = u32;
type IntoIter = Helper<'a, T>;
fn into_iter(self) -> Self::IntoIter {
Helper::new(&self.0)
}
}
impl<'a, T> Iterator for Helper<'a, T>
where
&'a T: IntoIterator<Item = &'a u8>,
{
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
match self.get_num_by_bit(self.unit) {
GetResult::Error => panic!("can not read the data"),
GetResult::Semi(result, _) => Some(result),
GetResult::Whole(result) => Some(result),
_ => None
}
}
}
fn main() {}
Meta
### Tasks
- [ ] error: internal compiler error: compiler/rustc_middle/src/ty/sty.rs:847:21: expected type for param #0.
rustc --version --verbose
:
rustc 1.68.2 (9eb3afe9e 2023-03-27)
binary: rustc
commit-hash: 9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0
commit-date: 2023-03-27
host: x86_64-unknown-linux-gnu
release: 1.68.2
LLVM version: 15.0.6
Error output
error: internal compiler error: compiler/rustc_middle/src/ty/sty.rs:847:21: expected type for param #0 in [ReErased, BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<_>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]
thread 'rustc' panicked at 'Box<dyn Any>', /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/compiler/rustc_errors/src/lib.rs:1609:9
stack backtrace:
0: 0x7f784d9ac59a - std::backtrace_rs::backtrace::libunwind::trace::ha271a8a7e1f3d4ef
at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
1: 0x7f784d9ac59a - std::backtrace_rs::backtrace::trace_unsynchronized::h85739da0352c791a
at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
......
969: 0x7f784d9b9823 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h3205ec2d7fc232c5
at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/alloc/src/boxed.rs:1988:9
970: 0x7f784d9b9823 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h3bb5daec8177f56b
at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/alloc/src/boxed.rs:1988:9
971: 0x7f784d9b9823 - std::sys::unix::thread::Thread::new::thread_start::had7b8061e306bb5c
at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/sys/unix/thread.rs:108:17
972: 0x7f784d871609 - start_thread
at /build/glibc-SzIz7B/glibc-2.31/nptl/pthread_create.c:477:8
973: 0x7f784d794133 - clone
at /build/glibc-SzIz7B/glibc-2.31/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:95
974: 0x0 - <unknown>
Backtrace
query stack during panic:
#0 [typeck] type-checking `<impl at src/main.rs:39:1: 39:26>::new`
#1 [typeck_item_bodies] type-checking all item bodies
#2 [analysis] running analysis passes on this crate
end of query stack
thread 'rustc' panicked at 'Box<dyn Any>', /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/compiler/rustc_errors/src/lib.rs:1609:9
stack backtrace:
0: 0x7f784d9ac59a - std::backtrace_rs::backtrace::libunwind::trace::ha271a8a7e1f3d4ef
at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
1: 0x7f784d9ac59a - std::backtrace_rs::backtrace::trace_unsynchronized::h85739da0352c791a
at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
......
970: 0x7f784d794133 - clone
at /build/glibc-SzIz7B/glibc-2.31/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:95
971: 0x0 - <unknown>