Skip to content

Commit 96063ec

Browse files
committed
added rdwrcount and ioeg examples
1 parent efa1f11 commit 96063ec

File tree

4 files changed

+124
-0
lines changed

4 files changed

+124
-0
lines changed

rust-spring2023/ioeg/Cargo.toml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[package]
2+
name = "ioeg"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]
9+
10+
[[bin]]
11+
name = "ioeg"
12+
path = "ioeg.rs"

rust-spring2023/ioeg/ioeg.rs

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
fn read_bytes<R: std::io::Read>(r: &mut R, n: usize) ->
2+
Result<Vec<u8>, std::io::Error>
3+
{
4+
let mut result = Vec::with_capacity(n);
5+
result.resize(n, 0);
6+
let mut target: &mut [u8] = &mut result[..];
7+
loop {
8+
let nread = r.read(target)?;
9+
if nread == 0 {
10+
result.resize(target.len(), 0);
11+
return Ok(result);
12+
}
13+
target = &mut target[nread..];
14+
if target.len() == 0 {
15+
return Ok(result);
16+
}
17+
}
18+
}
19+
20+
fn print_string<W: std::io::Write>(w: &mut W, s: &str) {
21+
w.write_all(s.as_bytes()).unwrap();
22+
w.write(b"\n").unwrap();
23+
}
24+
25+
fn main() {
26+
println!("hello world");
27+
let mut stdout = std::io::stdout();
28+
print_string(&mut stdout, "print string!");
29+
}

rust-spring2023/rdwrcount/Cargo.toml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[package]
2+
name = "rdwrcount"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]
9+
10+
[[bin]]
11+
name = "rdwrcount"
12+
path = "rdwrcount.rs"
+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
use std::cell::RefCell;
2+
use std::rc::Rc;
3+
4+
#[derive(Debug, Default)]
5+
struct AccessCounter(usize);
6+
7+
impl AccessCounter {
8+
fn inc(&mut self) {
9+
self.0 += 1;
10+
}
11+
12+
fn get(&self) -> usize {
13+
self.0
14+
}
15+
16+
fn reset(&mut self) {
17+
self.0 = 0;
18+
}
19+
}
20+
21+
#[derive(Debug)]
22+
struct Reader {
23+
counter: usize,
24+
accesses: Rc<RefCell<AccessCounter>>,
25+
}
26+
27+
impl Reader {
28+
fn read(&mut self) -> String {
29+
self.accesses.borrow_mut().inc();
30+
self.counter += 1;
31+
self.counter.to_string()
32+
}
33+
34+
fn get(&self) -> usize {
35+
self.counter
36+
}
37+
}
38+
39+
#[derive(Debug)]
40+
struct Writer {
41+
written: String,
42+
accesses: Rc<RefCell<AccessCounter>>,
43+
}
44+
45+
impl Writer {
46+
fn write(&mut self, s: &str) {
47+
self.accesses.borrow_mut().inc();
48+
self.written = s.to_owned();
49+
}
50+
51+
fn get(&self) -> &str {
52+
&self.written
53+
}
54+
}
55+
56+
fn main() {
57+
let accesses = Rc::new(RefCell::new(AccessCounter::default()));
58+
let mut writer = Writer {
59+
written: "".to_string(),
60+
accesses: Rc::clone(&accesses),
61+
};
62+
let mut reader = Reader {
63+
counter: 0,
64+
accesses: Rc::clone(&accesses),
65+
};
66+
writer.write(&reader.read());
67+
println!("{} {} {}", writer.get(), reader.get(), accesses.borrow().get());
68+
accesses.borrow_mut().reset();
69+
drop(accesses);
70+
println!("{} {}", writer.get(), reader.get());
71+
}

0 commit comments

Comments
 (0)