ICFP 2007 Contest: https://web.archive.org/web/20090301164728/https://save-endo.cs.uu.nl/

Display for Template, in preparation of disassembly

Changed files
+95 -11
dna2rna
+4 -4
dna2rna/src/match_replace.rs
···
groups: Vec<(usize, usize)>,
}
-
fn do_match(dna: &DnaRef, start: usize, pattern: &Pattern) -> Option<MatchResult> {
+
fn do_match(dna: &DnaRef, start: usize, pattern: Pattern) -> Option<MatchResult> {
let mut index = start;
let mut env = Vec::new();
let mut opens = Vec::new();
-
for p in pattern.iter() {
+
for p in pattern.into_iter() {
match p {
PatternItem::Base(b) => {
-
if index >= dna.len() || dna[index] != *b {
+
if index >= dna.len() || dna[index] != b {
return None;
}
···
let template = parser.template(rna)?;
let index = parser.index();
-
if let Some(matched) = do_match(&dna, index, &pattern) {
+
if let Some(matched) = do_match(&dna, index, pattern) {
let mut replace = DnaRef::new();
for t in template.into_iter() {
match t {
+4 -4
dna2rna/src/parser.rs
···
|| self.next_is(&[Base::I, Base::I, Base::F])
{
self.advance(3);
-
return Some(ret);
+
return Some(Template::new(ret));
} else if self.next_is(&[Base::I, Base::I, Base::P]) {
self.advance(3);
let n = self.nat()?;
···
let mut parser = Parser::new(dna);
assert_eq!(
parser.template(&mut rna),
-
Some(vec![
+
Some(Template::new(vec![
TemplateItem::Base(Base::I),
TemplateItem::Base(Base::C),
TemplateItem::Base(Base::F),
TemplateItem::Base(Base::P),
TemplateItem::Ref(2, 1),
TemplateItem::Len(4)
-
])
+
]))
);
assert_eq!(parser.index, 22);
let dna = dna_from_str("IIIPFCICFPIIC").into_iter();
let mut parser = Parser::new(dna);
-
assert_eq!(parser.template(&mut rna), Some(vec![]));
+
assert_eq!(parser.template(&mut rna), Some(Template::new(vec![])));
assert_eq!(parser.index, 13);
assert_eq!(
rna,
+7 -2
dna2rna/src/pattern.rs
···
use crate::dna::Base;
use std::fmt;
-
use std::slice::Iter;
+
use std::slice;
+
use std::vec;
#[derive(Debug, PartialEq)]
pub enum PatternItem {
···
Pattern { pattern: pattern }
}
-
pub fn iter<'a>(&'a self) -> Iter<'a, PatternItem> {
+
pub fn iter<'a>(&'a self) -> slice::Iter<'a, PatternItem> {
self.pattern.iter()
+
}
+
+
pub fn into_iter<'a>(self) -> vec::IntoIter<PatternItem> {
+
self.pattern.into_iter()
}
}
+80 -1
dna2rna/src/template.rs
···
use crate::dna::Base;
+
use std::fmt;
+
use std::slice;
+
use std::vec;
#[derive(Debug, PartialEq)]
pub enum TemplateItem {
···
Len(usize),
}
-
pub type Template = Vec<TemplateItem>;
+
impl fmt::Display for TemplateItem {
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+
match &self {
+
TemplateItem::Base(b) => write!(f, "{}", b.to_char()),
+
TemplateItem::Ref(n, l) => {
+
if *l == 0 {
+
write!(f, "\"{}\"", n)
+
} else {
+
write!(f, "\"{},{}\"", n, l)
+
}
+
}
+
TemplateItem::Len(n) => {
+
write!(f, "|{}|", n)
+
}
+
}
+
}
+
}
+
+
#[derive(Debug, PartialEq)]
+
pub struct Template {
+
template: Vec<TemplateItem>,
+
}
+
+
impl Template {
+
pub fn new(template: Vec<TemplateItem>) -> Template {
+
Template { template: template }
+
}
+
+
pub fn iter<'a>(&'a self) -> slice::Iter<'a, TemplateItem> {
+
self.template.iter()
+
}
+
+
pub fn into_iter<'a>(self) -> vec::IntoIter<TemplateItem> {
+
self.template.into_iter()
+
}
+
}
+
+
impl fmt::Display for Template {
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+
for p in self.iter() {
+
write!(f, "{}", p)?;
+
}
+
Ok(())
+
}
+
}
+
+
#[cfg(test)]
+
mod tests {
+
use super::*;
+
+
#[test]
+
fn test_display_base() {
+
assert_eq!(
+
Template::new(vec![
+
TemplateItem::Base(Base::I),
+
TemplateItem::Base(Base::C),
+
TemplateItem::Base(Base::F),
+
TemplateItem::Base(Base::P)
+
])
+
.to_string(),
+
"ICFP"
+
);
+
}
+
+
#[test]
+
fn test_display_ref() {
+
assert_eq!(
+
Template::new(vec![TemplateItem::Ref(3, 2), TemplateItem::Ref(4, 0),]).to_string(),
+
"\"3,2\"\"4\""
+
);
+
}
+
+
#[test]
+
fn test_display_lenf() {
+
assert_eq!(Template::new(vec![TemplateItem::Len(3)]).to_string(), "|3|");
+
}
+
}