diff --git a/core/src/counter.rs b/core/src/counter.rs new file mode 100644 index 00000000..d51faa5f --- /dev/null +++ b/core/src/counter.rs @@ -0,0 +1,47 @@ +// Copyright 2016 Mozilla +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use +// this file except in compliance with the License. You may obtain a copy of the +// License at http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +use std::rc::Rc; + +use std::sync::atomic::{ + AtomicUsize, + Ordering, +}; + +#[derive(Clone)] +pub struct RcCounter { + c: Rc, +} + +impl RcCounter { + pub fn new() -> Self { + RcCounter { c: Rc::new(AtomicUsize::new(0)) } + } + + pub fn next(&self) -> usize { + self.c.fetch_add(1, Ordering::SeqCst) + } +} + +#[cfg(test)] +mod tests { + use super::RcCounter; + + #[test] + fn test_rc_counter() { + let c = RcCounter::new(); + assert_eq!(c.next(), 0); + assert_eq!(c.next(), 1); + + let d = c.clone(); + assert_eq!(d.next(), 2); + assert_eq!(c.next(), 3); + } +} \ No newline at end of file diff --git a/core/src/lib.rs b/core/src/lib.rs index d715d64a..a6390a8d 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -488,4 +488,5 @@ mod test { } pub mod intern_set; +pub mod counter; pub mod util; diff --git a/core/src/util.rs b/core/src/util.rs index cd2205d2..5f3f7321 100644 --- a/core/src/util.rs +++ b/core/src/util.rs @@ -1,4 +1,3 @@ - // Copyright 2016 Mozilla // // Licensed under the Apache License, Version 2.0 (the "License"); you may not use