Skip to content

Commit 1156884

Browse files
committed
finished initial update of rc
1 parent 3ae1fd6 commit 1156884

File tree

8 files changed

+167
-3
lines changed

8 files changed

+167
-3
lines changed

rc/examples/04-messages.rs

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use rc::message::Message;
2+
use rc::counter::Counter;
3+
4+
/// Make a couple of messages with given message strings.
5+
pub fn make_messages(m1: &'static str, m2: &'static str)
6+
-> (Message, Message)
7+
{
8+
let counter = Counter::default();
9+
let m1 = Message::with_counter(m1, Counter::clone(&counter));
10+
let m2 = Message::with_counter(m2, counter);
11+
(m1, m2)
12+
}
13+
14+
fn main() {
15+
let (m1, m2) = make_messages("m1", "m2");
16+
println!("{} {:?}", m1.text(), m1);
17+
println!("{} {:?}", m2.text(), m2);
18+
println!("{} {:?}", m1.text(), m1);
19+
println!("{} {:?}", m2.text(), m2);
20+
}

rc/examples/05-cycles.rs

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
// https://doc.rust-lang.org/std/cell/
2+
mod count;
3+
mod rcmessage;
4+
pub use rcmessage::*;
5+
6+
impl Drop for Message {
7+
fn drop(&mut self) {
8+
println!("dropping {}", self.message);
9+
}
10+
}
11+
12+
#[derive(Clone)]
13+
struct MessageList<'a> {
14+
cur: Message,
15+
next: Option<Rc<RefCell<MessageList<'a>>>>,
16+
}
17+
18+
impl<'a> MessageList<'a> {
19+
fn new(cur: Message) -> MessageList<'a> {
20+
MessageList { cur, next: None }
21+
}
22+
23+
/// Print the message, then recursively print the
24+
/// attached message list.
25+
fn print(&self) {
26+
self.cur.print();
27+
if let Some(ref next) = self.next {
28+
print!(" -> ");
29+
next.borrow().print();
30+
}
31+
}
32+
33+
/// Add a newline.
34+
fn println(&self) {
35+
self.print();
36+
println!();
37+
}
38+
39+
/// Print this message and an indication of the next
40+
/// message if any.
41+
fn println_abbrev(&self) {
42+
self.cur.print();
43+
if let Some(ref next) = self.next {
44+
print!(" -> ");
45+
next.borrow().cur.print();
46+
}
47+
println!();
48+
}
49+
}
50+
51+
/// Show simple use of messages with shared print counter.
52+
fn message() {
53+
let (m1, m2) = make_messages("m1", "m2");
54+
m1.println();
55+
m2.println();
56+
m1.println();
57+
m2.println();
58+
}
59+
60+
/// Make a couple of message lists with given message
61+
/// strings and no tail.
62+
fn make_message_lists<'a>(m1: &'static str, m2: &'static str)
63+
-> (MessageList<'a>, MessageList<'a>)
64+
{
65+
let (m1, m2) = make_messages(m1, m2);
66+
let ml1 = MessageList::new(m1);
67+
let ml2 = MessageList::new(m2);
68+
(ml1, ml2)
69+
}
70+
71+
/// Show simple use of message lists.
72+
fn message_list() {
73+
let (ml3, ml4) = make_message_lists("m3", "m4");
74+
ml3.println();
75+
ml4.println();
76+
}
77+
78+
/// Make a cyclic message list.
79+
fn message_list_cycle() {
80+
let (ml5, ml6) = make_message_lists("m5", "m6");
81+
let ml5 = Rc::new(RefCell::new(ml5));
82+
let ml6 = Rc::new(RefCell::new(ml6));
83+
ml5.borrow_mut().next = Some(ml6.clone());
84+
ml6.borrow_mut().next = Some(ml5.clone());
85+
ml5.borrow().println_abbrev();
86+
ml6.borrow().println_abbrev();
87+
//ml5.borrow().println();
88+
//ml6.borrow().println();
89+
}
90+
91+
fn main() {
92+
message();
93+
println!();
94+
message_list();
95+
println!();
96+
message_list_cycle();
97+
}

rc/examples/06-ctr.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
use rc::ctr::Ctr;
2+
3+
/// Increment the given counter. Note that this function
4+
/// takes `counter` by immutable reference.
5+
fn update_counter(counter: &Ctr) {
6+
counter.incr();
7+
}
8+
9+
fn main() {
10+
let counter = Ctr::default();
11+
println!("{}", counter.value());
12+
update_counter(&counter);
13+
println!("{}", counter.value());
14+
}

rc/src/count.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
//! assert_eq!(count.value(), 1);
99
1010
/// A non-negative count.
11-
#[derive(Default)]
11+
#[derive(Debug, Default)]
1212
pub struct Count(u64);
1313

1414
impl Count {

rc/src/counter.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use std::cell::{RefCell, RefMut};
1818
use std::rc::Rc;
1919

2020
/// An interior-mutable shared counter over the restricted `Count`.
21-
#[derive(Default, Clone)]
21+
#[derive(Debug, Default, Clone)]
2222
pub struct Counter(Rc<RefCell<Count>>);
2323

2424
impl Counter {

rc/src/ctr.rs

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use std::cell::Cell;
2+
3+
use crate::count::Count;
4+
5+
/// An interior-mutable counter over the restricted `Count`.
6+
#[derive(Default)]
7+
pub struct Ctr(Cell<Count>);
8+
9+
impl Ctr {
10+
/// Increase the count of the contained counter by one.
11+
/// Note that this method takes `self` by immutable
12+
/// reference, then changes it anyway.
13+
pub fn incr(&self) {
14+
let mut count = self.0.replace(Count::default());
15+
count.incr();
16+
let _ = self.0.replace(count);
17+
}
18+
19+
/// Return the value of the contained counter.
20+
pub fn value(&self) -> u64 {
21+
let count = self.0.replace(Count::default());
22+
let value = count.value();
23+
let _ = self.0.replace(count);
24+
value
25+
}
26+
}

rc/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
pub mod count;
44
pub mod counter;
55
pub mod message;
6+
pub mod ctr;

rc/src/message.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
use crate::counter::Counter;
1515

1616
/// Message to print plus usage counter.
17-
#[derive(Clone)]
17+
#[derive(Debug, Clone)]
1818
pub struct Message {
1919
/// Message text.
2020
message: &'static str,
@@ -30,6 +30,12 @@ impl Message {
3030
Message { message, counter: Counter::default() }
3131
}
3232

33+
/// Make a new message with provided counter.
34+
pub fn with_counter(message: &'static str, counter: Counter) -> Message
35+
{
36+
Message { message, counter }
37+
}
38+
3339
/// Access the message text.
3440
pub fn text(&self) -> &'static str {
3541
self.counter.incr();

0 commit comments

Comments
 (0)