some more lints and small changes

This commit is contained in:
Emil Gardström
2024-03-29 14:22:20 +01:00
parent 588e64ba35
commit 1d51ee0486
6 changed files with 194 additions and 219 deletions

View File

@@ -49,7 +49,7 @@ fn write_repr_enum<T: std::io::Write, I, P>(
pub enum {name} {{\n"
)
.unwrap();
for (name, variant) in variants.into_iter() {
for (name, variant) in variants {
let variant_name = name.to_case(Case::Pascal);
let mut serialize = vec![name.clone()];
serialize.extend(variant.aliases.iter().cloned());
@@ -354,7 +354,7 @@ fn write_instructions_enum() {
write!(
&mut writer,
"#[derive(PartialEq, Debug, Clone, Serialize, Deserialize)]\n\
"#[derive(PartialEq, Eq, Debug, Clone, Serialize, Deserialize)]\n\
pub enum InstructionOp {{\n\
"
)

View File

@@ -110,32 +110,32 @@ impl Error for ParseError {}
impl ParseError {
/// Offset the ParseError in it's line, adding the passed values to it's `start` and `end`
#[must_use]
pub fn offset(self, offset: usize) -> Self {
ParseError {
line: self.line,
start: self.start + offset,
end: self.end + offset,
msg: self.msg,
..self
}
}
/// Offset the ParseError line, adding the passed value to it's `line`
#[must_use]
pub fn offset_line(self, offset: usize) -> Self {
ParseError {
line: self.line + offset,
start: self.start,
end: self.end,
msg: self.msg,
..self
}
}
/// Mark the parse error as extending 'length' bytes from `start`
#[must_use]
pub fn span(self, length: usize) -> Self {
ParseError {
line: self.line,
start: self.start,
end: self.start + length,
msg: self.msg,
..self
}
}
}
@@ -195,7 +195,7 @@ impl FromStr for Code {
}
}
#[derive(PartialEq, Debug)]
#[derive(PartialEq, Eq, Debug)]
pub struct Comment {
pub comment: String,
}
@@ -272,7 +272,7 @@ fn get_operand_tokens<'a>(
operand_tokens
}
#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
#[derive(PartialEq, Eq, Debug, Clone, Copy, Serialize, Deserialize)]
pub enum Device {
Db,
Numbered(u32),
@@ -408,9 +408,8 @@ impl FromStr for Operand {
.collect::<String>()
.parse::<u32>()
.ok();
let trailing = rest_iter.count();
if let Some(target) = target {
if trailing == 0 {
if rest_iter.next().is_none() {
return Ok(Operand::RegisterSpec {
indirection: indirection as u32,
target,
@@ -459,8 +458,7 @@ impl FromStr for Operand {
.take_while_ref(|c| c.is_ascii_digit())
.collect::<String>();
let connection = connection_str.parse::<u32>().unwrap();
let trailing = rest_iter.clone().collect::<Vec<_>>();
if trailing.is_empty() {
if rest_iter.next().is_none() {
Ok(Some(connection))
} else {
let start =
@@ -476,9 +474,8 @@ impl FromStr for Operand {
Ok(None)
}
}?;
let trailing = rest_iter.collect::<Vec<_>>();
if let Some(target) = target {
if trailing.is_empty() {
if rest_iter.next().is_none() {
Ok(Operand::DeviceSpec {
device: Device::Indirect {
indirection: indirection as u32,
@@ -512,8 +509,7 @@ impl FromStr for Operand {
.take_while_ref(|c| c.is_ascii_digit())
.collect::<String>();
let connection = connection_str.parse::<u32>().unwrap();
let trailing = rest_iter.clone().collect::<Vec<_>>();
if trailing.is_empty() {
if rest_iter.next().is_none() {
Ok(Some(connection))
} else {
let start = 1 + target_str.len() + 1 + connection_str.len();
@@ -528,9 +524,8 @@ impl FromStr for Operand {
Ok(None)
}
}?;
let trailing = rest_iter.collect::<Vec<_>>();
if let Some(target) = target {
if trailing.is_empty() {
if rest_iter.next().is_none() {
Ok(Operand::DeviceSpec {
device: Device::Numbered(target),
connection,
@@ -566,8 +561,7 @@ impl FromStr for Operand {
.take_while_ref(|c| c.is_ascii_hexdigit())
.collect::<String>();
let num = i64::from_str_radix(&num_str, 16).unwrap() as f64;
let trailing = rest_iter.count();
if trailing == 0 {
if rest_iter.next().is_none() {
Ok(Operand::Number(Number::Hexadecimal(num)))
} else {
Err(ParseError {
@@ -584,8 +578,7 @@ impl FromStr for Operand {
.take_while_ref(|c| c.is_digit(2))
.collect::<String>();
let num = i64::from_str_radix(&num_str, 2).unwrap() as f64;
let trailing = rest_iter.count();
if trailing == 0 {
if rest_iter.next().is_none() {
Ok(Operand::Number(Number::Binary(num)))
} else {
Err(ParseError {
@@ -624,20 +617,17 @@ impl FromStr for Operand {
msg: "Invalid Decimal Number".to_string(),
})
}
} else if rest_iter.next().is_none() {
let num = f64::from_str(&float_str).unwrap();
Ok(Operand::Number(Number::Float(num)))
} else {
let trailing = rest_iter.count();
if trailing == 0 {
let num = f64::from_str(&float_str).unwrap();
Ok(Operand::Number(Number::Float(num)))
} else {
let start = float_str.len();
Err(ParseError {
line: 0,
start,
end: start,
msg: "Invalid Integer Number".to_string(),
})
}
let start = float_str.len();
Err(ParseError {
line: 0,
start,
end: start,
msg: "Invalid Integer Number".to_string(),
})
}
} else if let Some(val) = CONSTANTS_LOOKUP.get(s) {
Ok(Operand::Number(Number::Constant(*val)))
@@ -665,7 +655,7 @@ impl FromStr for Operand {
// pub value: f64,
// }
#[derive(PartialEq, Debug)]
#[derive(PartialEq, Eq, Debug)]
pub struct Label {
pub id: Identifier,
// #[rust_sitter::leaf(text = r":")] pub ());
@@ -694,7 +684,7 @@ impl FromStr for Label {
}
}
#[derive(PartialEq, Debug, Clone, Serialize, Deserialize)]
#[derive(PartialEq, Eq, Debug, Clone, Serialize, Deserialize)]
pub struct Identifier {
// #[rust_sitter::leaf(pattern = r"[a-zA-Z_.][\w\d.]*", transform = |id| id.to_string())]
pub name: String,
@@ -752,11 +742,11 @@ pub enum Number {
impl Number {
pub fn value(&self) -> f64 {
match self {
Number::Enum(val) => *val,
Number::Float(val) => *val,
Number::Binary(val) => *val,
Number::Constant(val) => *val,
Number::Hexadecimal(val) => *val,
Number::Enum(val)
| Number::Float(val)
| Number::Binary(val)
| Number::Constant(val)
| Number::Hexadecimal(val) => *val,
Number::String(s) => const_crc32::crc32(s.as_bytes()) as i32 as f64,
}
}

View File

@@ -191,10 +191,10 @@ impl Program {
Some(code) => match code {
grammar::Code::Label(label) => {
if labels_set.contains(&label.id.name) {
Err(ICError::DuplicateLabel(label.id.name.clone()))
Err(ICError::DuplicateLabel(label.id.name))
} else {
labels_set.insert(label.id.name.clone());
labels.insert(label.id.name.clone(), line_number as u32);
labels.insert(label.id.name, line_number as u32);
Ok(grammar::Instruction {
instruction: grammar::InstructionOp::Nop,
operands: vec![],
@@ -414,7 +414,7 @@ impl IC {
[a] => {
let a = a.get_value(self)?;
let now = time::OffsetDateTime::now_local()
.unwrap_or(time::OffsetDateTime::now_utc());
.unwrap_or_else(|_| time::OffsetDateTime::now_utc());
self.state = ICState::Sleep(now, a);
Ok(())
}
@@ -531,7 +531,7 @@ impl IC {
},
Beq => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -548,7 +548,7 @@ impl IC {
}),
},
Beqal => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -566,7 +566,7 @@ impl IC {
}),
},
Breq => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -640,7 +640,7 @@ impl IC {
}),
},
Bne => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -657,7 +657,7 @@ impl IC {
}),
},
Bneal => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -675,7 +675,7 @@ impl IC {
}),
},
Brne => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -749,7 +749,7 @@ impl IC {
}),
},
Blt => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -766,7 +766,7 @@ impl IC {
}),
},
Bltal => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -784,7 +784,7 @@ impl IC {
}),
},
Brlt => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -805,7 +805,7 @@ impl IC {
}),
},
Ble => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -822,7 +822,7 @@ impl IC {
}),
},
Bleal => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -840,7 +840,7 @@ impl IC {
}),
},
Brle => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -967,7 +967,7 @@ impl IC {
}),
},
Bgt => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -984,7 +984,7 @@ impl IC {
}),
},
Bgtal => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1002,7 +1002,7 @@ impl IC {
}),
},
Brgt => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1076,7 +1076,7 @@ impl IC {
}),
},
Bge => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1093,7 +1093,7 @@ impl IC {
}),
},
Bgeal => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1111,7 +1111,7 @@ impl IC {
}),
},
Brge => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1185,7 +1185,7 @@ impl IC {
}),
},
Bap => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -1209,7 +1209,7 @@ impl IC {
}),
},
Bapal => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -1234,7 +1234,7 @@ impl IC {
}),
},
Brap => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -1259,7 +1259,7 @@ impl IC {
}),
},
Bapz => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1280,7 +1280,7 @@ impl IC {
}),
},
Bapzal => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1302,7 +1302,7 @@ impl IC {
}),
},
Brapz => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1323,7 +1323,7 @@ impl IC {
}),
},
Bna => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -1347,7 +1347,7 @@ impl IC {
}),
},
Bnaal => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -1372,7 +1372,7 @@ impl IC {
}),
},
Brna => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -1396,7 +1396,7 @@ impl IC {
}),
},
Bnaz => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1417,7 +1417,7 @@ impl IC {
}),
},
Bnazal => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1439,7 +1439,7 @@ impl IC {
}),
},
Brnaz => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1638,7 +1638,7 @@ impl IC {
},
Seq => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1689,7 +1689,7 @@ impl IC {
}),
},
Sne => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1740,7 +1740,7 @@ impl IC {
}),
},
Slt => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1791,7 +1791,7 @@ impl IC {
}),
},
Sle => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1842,7 +1842,7 @@ impl IC {
}),
},
Sgt => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1893,7 +1893,7 @@ impl IC {
}),
},
Sge => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1944,7 +1944,7 @@ impl IC {
}),
},
Sap => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -1981,7 +1981,7 @@ impl IC {
}),
},
Sapz => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2015,7 +2015,7 @@ impl IC {
}),
},
Sna => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -2052,7 +2052,7 @@ impl IC {
}),
},
Snaz => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2195,7 +2195,7 @@ impl IC {
},
Select => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -2223,7 +2223,7 @@ impl IC {
},
Add => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2249,7 +2249,7 @@ impl IC {
}),
},
Sub => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2275,7 +2275,7 @@ impl IC {
}),
},
Mul => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2301,7 +2301,7 @@ impl IC {
}),
},
Div => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2327,7 +2327,7 @@ impl IC {
}),
},
Mod => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2429,7 +2429,7 @@ impl IC {
},
Max => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2455,7 +2455,7 @@ impl IC {
}),
},
Min => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2779,7 +2779,7 @@ impl IC {
}),
},
Atan2 => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2806,7 +2806,7 @@ impl IC {
},
Sll | Sla => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2832,7 +2832,7 @@ impl IC {
}),
},
Srl => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2858,7 +2858,7 @@ impl IC {
}),
},
Sra => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2885,7 +2885,7 @@ impl IC {
},
And => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2911,7 +2911,7 @@ impl IC {
}),
},
Or => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2937,7 +2937,7 @@ impl IC {
}),
},
Xor => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -2963,7 +2963,7 @@ impl IC {
}),
},
Nor => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -3085,7 +3085,7 @@ impl IC {
},
Get => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -3124,7 +3124,7 @@ impl IC {
}),
},
Getd => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -3163,7 +3163,7 @@ impl IC {
}),
},
Put => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -3192,7 +3192,7 @@ impl IC {
}),
},
Putd => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -3223,7 +3223,7 @@ impl IC {
},
S => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -3233,7 +3233,7 @@ impl IC {
};
let lt = LogicType::try_from(lt.get_value(self)?)?;
if CHANNEL_LOGIC_TYPES.contains(&lt) {
let channel = channel_logic_to_channel(lt).unwrap();
let channel = lt.as_channel().unwrap();
let Some(connection) = connection else {
break 'inst Err(MissingConnecitonSpecifier);
};
@@ -3261,7 +3261,7 @@ impl IC {
}),
},
Sd => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -3287,7 +3287,7 @@ impl IC {
}),
},
Ss => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -3313,7 +3313,7 @@ impl IC {
}),
},
Sb => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -3330,7 +3330,7 @@ impl IC {
}),
},
Sbs => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -3348,7 +3348,7 @@ impl IC {
}),
},
Sbn => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -3367,7 +3367,7 @@ impl IC {
},
L => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -3387,7 +3387,7 @@ impl IC {
};
let lt = LogicType::try_from(lt.get_value(self)?)?;
if CHANNEL_LOGIC_TYPES.contains(&lt) {
let channel = channel_logic_to_channel(lt).unwrap();
let channel = lt.as_channel().unwrap();
let Some(connection) = connection else {
break 'inst Err(MissingConnecitonSpecifier);
};
@@ -3415,7 +3415,7 @@ impl IC {
}),
},
Ld => match &operands[..] {
oprs @ [_] | oprs @ [_, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 3,
}),
@@ -3451,7 +3451,7 @@ impl IC {
}),
},
Ls => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -3487,7 +3487,7 @@ impl IC {
}),
},
Lr => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -3523,7 +3523,7 @@ impl IC {
}),
},
Lb => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] => Err(TooFewOperands {
oprs @ ([_] | [_, _] | [_, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 4,
}),
@@ -3551,12 +3551,10 @@ impl IC {
}),
},
Lbn => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] | oprs @ [_, _, _, _] => {
Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 5,
})
}
oprs @ ([_] | [_, _] | [_, _, _] | [_, _, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 5,
}),
[reg, prefab, name, lt, bm] => {
let &Operand::RegisterSpec {
indirection,
@@ -3583,14 +3581,12 @@ impl IC {
}),
},
Lbns => match &operands[..] {
oprs @ [_]
| oprs @ [_, _]
| oprs @ [_, _, _]
| oprs @ [_, _, _, _]
| oprs @ [_, _, _, _, _] => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 6,
}),
oprs @ ([_] | [_, _] | [_, _, _] | [_, _, _, _] | [_, _, _, _, _]) => {
Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 6,
})
}
[reg, prefab, name, index, slt, bm] => {
let &Operand::RegisterSpec {
indirection,
@@ -3624,12 +3620,10 @@ impl IC {
}),
},
Lbs => match &operands[..] {
oprs @ [_] | oprs @ [_, _] | oprs @ [_, _, _] | oprs @ [_, _, _, _] => {
Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 5,
})
}
oprs @ ([_] | [_, _] | [_, _, _] | [_, _, _, _]) => Err(TooFewOperands {
provided: oprs.len() as u32,
desired: 5,
}),
[reg, prefab, index, slt, bm] => {
let &Operand::RegisterSpec {
indirection,
@@ -3675,24 +3669,29 @@ const CHANNEL_LOGIC_TYPES: [grammar::LogicType; 8] = [
grammar::LogicType::Channel7,
];
fn channel_logic_to_channel(lt: grammar::LogicType) -> Option<usize> {
match lt {
grammar::LogicType::Channel0 => Some(0),
grammar::LogicType::Channel1 => Some(1),
grammar::LogicType::Channel2 => Some(2),
grammar::LogicType::Channel3 => Some(3),
grammar::LogicType::Channel4 => Some(4),
grammar::LogicType::Channel5 => Some(5),
grammar::LogicType::Channel6 => Some(6),
grammar::LogicType::Channel7 => Some(7),
_ => None,
trait LogicTypeExt {
fn as_channel(&self) -> Option<usize>;
}
impl LogicTypeExt for grammar::LogicType {
fn as_channel(&self) -> Option<usize> {
match self {
grammar::LogicType::Channel0 => Some(0),
grammar::LogicType::Channel1 => Some(1),
grammar::LogicType::Channel2 => Some(2),
grammar::LogicType::Channel3 => Some(3),
grammar::LogicType::Channel4 => Some(4),
grammar::LogicType::Channel5 => Some(5),
grammar::LogicType::Channel6 => Some(6),
grammar::LogicType::Channel7 => Some(7),
_ => None,
}
}
}
pub fn f64_to_i64(f: f64, signed: bool) -> i64 {
let mut num: i64 = (f % 9007199254740992.0) as i64;
if !signed {
num &= 18014398509481983_i64
num &= 18014398509481983_i64;
}
num
}
@@ -3701,7 +3700,7 @@ pub fn i64_to_f64(i: i64) -> f64 {
let flag: bool = (i & 9007199254740992_i64) != 0;
let mut i = i & 9007199254740991_i64;
if flag {
i &= -9007199254740992_i64
i &= -9007199254740992_i64;
}
i as f64
}

View File

@@ -329,18 +329,13 @@ impl VM {
}
}
let mut device = self.new_device();
if let Some(first_network) = device
.connections
.iter_mut()
.filter_map(|c| {
if let Connection::CableNetwork(c) = c {
Some(c)
} else {
None
}
})
.next()
{
if let Some(first_network) = device.connections.iter_mut().find_map(|c| {
if let Connection::CableNetwork(c) = c {
Some(c)
} else {
None
}
}) {
first_network.replace(if let Some(network) = network {
network
} else {
@@ -367,18 +362,13 @@ impl VM {
}
}
let (mut device, ic) = self.new_ic();
if let Some(first_network) = device
.connections
.iter_mut()
.filter_map(|c| {
if let Connection::CableNetwork(c) = c {
Some(c)
} else {
None
}
})
.next()
{
if let Some(first_network) = device.connections.iter_mut().find_map(|c| {
if let Connection::CableNetwork(c) = c {
Some(c)
} else {
None
}
}) {
first_network.replace(if let Some(network) = network {
network
} else {
@@ -522,7 +512,7 @@ impl VM {
}
pub fn devices_on_same_network(&self, ids: &[u16]) -> bool {
for (_id, net) in self.networks.iter() {
for net in self.networks.values() {
if net.borrow().contains(ids) {
return true;
}

View File

@@ -11,7 +11,7 @@ pub struct Random {
}
/// Partial implementation of mscorlib System.Random
/// https://github.com/microsoft/referencesource/blob/master/mscorlib/system/random.cs#L94
/// <https://github.com/microsoft/referencesource/blob/master/mscorlib/system/random.cs#L94>
impl Random {
pub fn new() -> Self {
Self::with_seed(rand::random::<i32>())

View File

@@ -15,49 +15,45 @@ impl<'a> Iterator for SplitConsecutiveWithIndices<'a> {
let tail = &self.haystack[self.start..];
match tail.find(self.chars) {
Some(start) => {
let end = self.start
+ start
+ 'find_end: {
let mut last = start;
for (index, c) in tail[start..].chars().enumerate() {
if !self.chars.contains(&c) {
break 'find_end index;
}
last = index + c.len_utf8();
}
last
};
let start = self.start + start;
if self.start == start {
//consecutive delim matches, skip to next match
let start = end;
let end = match &self.haystack[start..].find(self.chars) {
Some(i) => start + i,
None => self.haystack.len(),
};
let s = &self.haystack[start..end];
self.start = end;
if s.is_empty() {
None
} else {
Some((start, s))
let Some(start) = tail.find(self.chars) else {
let s = &self.haystack[self.start..];
let index = self.start;
self.start = self.haystack.len();
return Some((index, s));
};
let end = self.start
+ start
+ 'find_end: {
let mut last = start;
for (index, c) in tail[start..].chars().enumerate() {
if !self.chars.contains(&c) {
break 'find_end index;
}
} else {
let s = &self.haystack[self.start..start];
let index = self.start;
self.start = start;
Some((index, s))
last = index + c.len_utf8();
}
last
};
let start = self.start + start;
if self.start == start {
//consecutive delim matches, skip to next match
let start = end;
let end = match &self.haystack[start..].find(self.chars) {
Some(i) => start + i,
None => self.haystack.len(),
};
let s = &self.haystack[start..end];
self.start = end;
if s.is_empty() {
None
} else {
Some((start, s))
}
None => {
let s = &self.haystack[self.start..];
let index = self.start;
self.start = self.haystack.len();
Some((index, s))
}
} else {
let s = &self.haystack[self.start..start];
let index = self.start;
self.start = start;
Some((index, s))
}
}
}