limq

Check-in Differences
Login

Check-in Differences

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Difference From limq-0.1.0 To limq-0.1.1

2024-09-12
21:36
Change log updates. check-in: 3c006f2a0c user: jan tags: trunk
21:27
Exclude bacon.toml from packaging. check-in: 457e09bb70 user: jan tags: limq-0.1.1, trunk
21:25
Add an assertion message. check-in: efca5d365c user: jan tags: trunk
2024-04-09
22:40
Add ignore-glob. check-in: 98dd727dfd user: jan tags: trunk
21:18
Move repo. check-in: ff1f928305 user: jan tags: limq-0.1.0, trunk
20:26
initial empty check-in check-in: 0974430cf5 user: jan tags: trunk

Added .efiles.











>
>
>
>
>
1
2
3
4
5
Cargo.toml
README.md
www/index.md
www/changelog.md
src/lib.rs

Added .fossil-settings/ignore-glob.







>
>
>
1
2
3
.*.swp
Cargo.lock
target

Changes to Cargo.toml.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

17
18
19
20
21
22
23
24
25
26
27
28






[package]
name = "limq"
version = "0.1.0"
edition = "2021"
license = "0BSD"
# https://crates.io/category_slugs
categories = [ "data-structures" ]
keywords = [ "queue", "bounded" ]
repository = "https://repos.qrnch.tech/pub/limq"
description = "Queue with optional maximum number of elements constraint"
rust-version = "1.56"
exclude = [
  ".fossil-settings",
  ".efiles",
  ".fslckout",
  "www",

  "rustfmt.toml"
]

# https://doc.rust-lang.org/cargo/reference/manifest.html#the-badges-section
[badges]
maintenance = { status = "passively-maintained" }

[dependencies]

[package.metadata.docs.rs]
rustdoc-args = ["--generate-link-to-definition"]









|













>












>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[package]
name = "limq"
version = "0.1.1"
edition = "2021"
license = "0BSD"
# https://crates.io/category_slugs
categories = [ "data-structures" ]
keywords = [ "queue", "bounded" ]
repository = "https://repos.qrnch.tech/pub/limq"
description = "Queue with optional maximum number of elements constraint"
rust-version = "1.56"
exclude = [
  ".fossil-settings",
  ".efiles",
  ".fslckout",
  "www",
  "bacon.toml",
  "rustfmt.toml"
]

# https://doc.rust-lang.org/cargo/reference/manifest.html#the-badges-section
[badges]
maintenance = { status = "passively-maintained" }

[dependencies]

[package.metadata.docs.rs]
rustdoc-args = ["--generate-link-to-definition"]

[lints.clippy]
all = { level = "deny", priority = -1 }
pedantic = { level = "warn", priority = -1 }
nursery = { level = "warn", priority = -1 }
cargo = { level = "warn", priority = -1 }

Added bacon.toml.













































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# This is a configuration file for the bacon tool
#
# Bacon repository: https://github.com/Canop/bacon
# Complete help on configuration: https://dystroy.org/bacon/config/
# You can also check bacon's own bacon.toml file
#  as an example: https://github.com/Canop/bacon/blob/main/bacon.toml

#default_job = "check"
default_job = "clippy-all"

[jobs.check]
command = ["cargo", "check", "--color", "always"]
need_stdout = false

[jobs.check-all]
command = ["cargo", "check", "--all-targets", "--color", "always"]
need_stdout = false

# Run clippy on the default target
[jobs.clippy]
command = [
    "cargo", "clippy",
    "--color", "always",
]
need_stdout = false

# Run clippy on all targets
# To disable some lints, you may change the job this way:
#    [jobs.clippy-all]
#    command = [
#        "cargo", "clippy",
#        "--all-targets",
#        "--color", "always",
#    	 "--",
#    	 "-A", "clippy::bool_to_int_with_if",
#    	 "-A", "clippy::collapsible_if",
#    	 "-A", "clippy::derive_partial_eq_without_eq",
#    ]
# need_stdout = false
[jobs.clippy-all]
command = [
    "cargo", "clippy",
    "--all-targets",
    "--color", "always",
]
need_stdout = false

# This job lets you run
# - all tests: bacon test
# - a specific test: bacon test -- config::test_default_files
# - the tests of a package: bacon test -- -- -p config
[jobs.test]
command = [
    "cargo", "test", "--color", "always",
    "--", "--color", "always", # see https://github.com/Canop/bacon/issues/124
]
need_stdout = true

[jobs.doc]
command = ["cargo", "doc", "--color", "always", "--no-deps"]
need_stdout = false

# If the doc compiles, then it opens in your browser and bacon switches
# to the previous job
[jobs.doc-open]
command = ["cargo", "doc", "--color", "always", "--no-deps", "--open"]
need_stdout = false
on_success = "back" # so that we don't open the browser at each change

# You can run your application and have the result displayed in bacon,
# *if* it makes sense for this crate.
# Don't forget the `--color always` part or the errors won't be
# properly parsed.
# If your program never stops (eg a server), you may set `background`
# to false to have the cargo run output immediately displayed instead
# of waiting for program's end.
[jobs.run]
command = [
    "cargo", "run",
    "--color", "always",
    # put launch parameters for your program behind a `--` separator
]
need_stdout = true
allow_warnings = true
background = true

# This parameterized job runs the example of your choice, as soon
# as the code compiles.
# Call it as
#    bacon ex -- my-example
[jobs.ex]
command = ["cargo", "run", "--color", "always", "--example"]
need_stdout = true
allow_warnings = true

# You may define here keybindings that would be specific to
# a project, for example a shortcut to launch a specific job.
# Shortcuts to internal functions (scrolling, toggling, etc.)
# should go in your personal global prefs.toml file instead.
[keybindings]
# alt-m = "job:my-job"
c = "job:clippy-all" # comment this to have 'c' run clippy on only the default target

Changes to src/lib.rs.

1
2
3
4
5
6
7
8
9
10
11
12
//! _LimQ_ is a queue (implemented as a wrapper around [`VecDeque`]) that
//! supports an optional maximum number of elements constraint.
//!
//! Rather than supplying the traditional `push()` method to add elements to
//! the queue, _LimQ_ implements [`LimQ::try_push()`] and
//! [`LimQ::force_push()`]. If no queue limit has been enabled, both of these
//! act exactly like a traditional `push()` would.  When a limit has been set,
//! and reached, `try_push()` will fail, returning the input element.
//! `force_push()` will forcibly add the new element while dropping the next
//! element in line to be pulled off the queue.
//!
//! ```
|



|







1
2
3
4
5
6
7
8
9
10
11
12
//! `LimQ` is a queue (implemented as a wrapper around [`VecDeque`]) that
//! supports an optional maximum number of elements constraint.
//!
//! Rather than supplying the traditional `push()` method to add elements to
//! the queue, `LimQ` implements [`LimQ::try_push()`] and
//! [`LimQ::force_push()`]. If no queue limit has been enabled, both of these
//! act exactly like a traditional `push()` would.  When a limit has been set,
//! and reached, `try_push()` will fail, returning the input element.
//! `force_push()` will forcibly add the new element while dropping the next
//! element in line to be pulled off the queue.
//!
//! ```
42
43
44
45
46
47
48

49

50


51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

69


70
71
72
73
74

75
76
77
78
79
80

81
82
83
84
85
86

87
88
89
90
91
92
93
impl<T> LimQ<T> {
  /// Create a new queue with an optional limit to the number of elements.
  ///
  /// Passning `None` to `max_len` will disable the limit.
  ///
  /// # Panics
  /// A zero-limit will cause a panic.

  pub fn new(max_len: Option<usize>) -> Self {

    assert!(!matches!(max_len, Some(0)));



    let q = if let Some(max_len) = max_len {
      VecDeque::with_capacity(max_len)
    } else {
      VecDeque::new()
    };
    Self { max_len, q }
  }

  /// Change the limit of the queue.
  ///
  /// Does not drain overflow elements if the new limit is lower than the
  /// current number of elements in queue.  This can be done manually by
  /// calling [`LimQ::purge_overflow()`].
  ///
  /// # Panics
  /// A zero-limit will cause a panic.
  pub fn set_max_len(&mut self, max_len: Option<usize>) {

    assert!(!matches!(max_len, Some(0)));


    self.max_len = max_len;
  }

  /// Return the maximum number of elements in queue.
  #[inline]

  pub fn max_len(&self) -> Option<usize> {
    self.max_len
  }

  /// Return the current number of elements in the queue.
  #[inline]

  pub fn len(&self) -> usize {
    self.q.len()
  }

  /// Return a boolean indicating whether the queue is empty or not.
  #[inline]

  pub fn is_empty(&self) -> bool {
    self.q.is_empty()
  }

  /// Drop elements that overflow the queue limit (if a limit has been set).
  ///
  /// ```







>

>
|
>
>

<
|
|
<
<
|











>
|
>
>





>
|





>






>







42
43
44
45
46
47
48
49
50
51
52
53
54
55

56
57


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
impl<T> LimQ<T> {
  /// Create a new queue with an optional limit to the number of elements.
  ///
  /// Passning `None` to `max_len` will disable the limit.
  ///
  /// # Panics
  /// A zero-limit will cause a panic.
  #[must_use]
  pub fn new(max_len: Option<usize>) -> Self {
    assert!(
      !matches!(max_len, Some(0)),
      "A zero-length limit is forbidden"
    );


    let q = max_len.map_or_else(VecDeque::new, VecDeque::with_capacity);



    Self { q, max_len }
  }

  /// Change the limit of the queue.
  ///
  /// Does not drain overflow elements if the new limit is lower than the
  /// current number of elements in queue.  This can be done manually by
  /// calling [`LimQ::purge_overflow()`].
  ///
  /// # Panics
  /// A zero-limit will cause a panic.
  pub fn set_max_len(&mut self, max_len: Option<usize>) {
    assert!(
      !matches!(max_len, Some(0)),
      "A zero-length limit is forbidden"
    );
    self.max_len = max_len;
  }

  /// Return the maximum number of elements in queue.
  #[inline]
  #[must_use]
  pub const fn max_len(&self) -> Option<usize> {
    self.max_len
  }

  /// Return the current number of elements in the queue.
  #[inline]
  #[must_use]
  pub fn len(&self) -> usize {
    self.q.len()
  }

  /// Return a boolean indicating whether the queue is empty or not.
  #[inline]
  #[must_use]
  pub fn is_empty(&self) -> bool {
    self.q.is_empty()
  }

  /// Drop elements that overflow the queue limit (if a limit has been set).
  ///
  /// ```
134
135
136
137
138
139
140



141
142
143
144
145
146
147
  /// // Fill queue up
  /// q.try_push(42).unwrap();
  ///
  /// // No room for new nodes -- try_push should return Err() containing
  /// // the node
  /// assert_eq!(q.try_push(11), Err(11));
  /// ```



  #[inline]
  pub fn try_push(&mut self, n: T) -> Result<(), T> {
    if let Some(max_len) = self.max_len {
      if self.q.len() < max_len {
        self.q.push_back(n);
        Ok(())
      } else {







>
>
>







141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
  /// // Fill queue up
  /// q.try_push(42).unwrap();
  ///
  /// // No room for new nodes -- try_push should return Err() containing
  /// // the node
  /// assert_eq!(q.try_push(11), Err(11));
  /// ```
  ///
  /// # Errors
  /// The node will be returned if the queue is full.
  #[inline]
  pub fn try_push(&mut self, n: T) -> Result<(), T> {
    if let Some(max_len) = self.max_len {
      if self.q.len() < max_len {
        self.q.push_back(n);
        Ok(())
      } else {
203
204
205
206
207
208
209
210
211
212
213







214
215
216
217
218
219
220


#[cfg(test)]
mod tests {
  use super::LimQ;

  #[test]
  #[should_panic]
  fn zero_len() {
    let _q: LimQ<()> = LimQ::new(Some(0));
  }








  #[test]
  fn try_exceed() {
    let mut q: LimQ<u32> = LimQ::new(Some(1));
    q.try_push(42).unwrap();
    assert_eq!(q.len(), 1);








|



>
>
>
>
>
>
>







213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237


#[cfg(test)]
mod tests {
  use super::LimQ;

  #[test]
  #[should_panic(expected = "A zero-length limit is forbidden")]
  fn zero_len() {
    let _q: LimQ<()> = LimQ::new(Some(0));
  }

  #[test]
  #[should_panic(expected = "A zero-length limit is forbidden")]
  fn set_zero_len() {
    let mut q: LimQ<()> = LimQ::new(Some(11));
    q.set_max_len(Some(0));
  }

  #[test]
  fn try_exceed() {
    let mut q: LimQ<u32> = LimQ::new(Some(1));
    q.try_push(42).unwrap();
    assert_eq!(q.len(), 1);

Changes to www/changelog.md.

1
2
3
4
5
6
7


8
9
10
11
12
13
14
# Change Log

## [Unreleased]

[Details](/vdiff?from=limq-0.1.0&to=trunk)

### Added



### Changed

### Removed

---








>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Change Log

## [Unreleased]

[Details](/vdiff?from=limq-0.1.0&to=trunk)

### Added

- Add an assertion message when a zero maximum length has been specified.

### Changed

### Removed

---