text: Wrap BufferId into a newtype
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
use crate::{
|
||||
locator::Locator, BufferSnapshot, Point, PointUtf16, TextDimension, ToOffset, ToPoint,
|
||||
ToPointUtf16,
|
||||
locator::Locator, BufferId, BufferSnapshot, Point, PointUtf16, TextDimension, ToOffset,
|
||||
ToPoint, ToPointUtf16,
|
||||
};
|
||||
use anyhow::Result;
|
||||
use std::{cmp::Ordering, fmt::Debug, ops::Range};
|
||||
@@ -11,7 +11,7 @@ pub struct Anchor {
|
||||
pub timestamp: clock::Lamport,
|
||||
pub offset: usize,
|
||||
pub bias: Bias,
|
||||
pub buffer_id: Option<u64>,
|
||||
pub buffer_id: Option<BufferId>,
|
||||
}
|
||||
|
||||
impl Anchor {
|
||||
|
||||
+22
-18
@@ -18,7 +18,7 @@ fn init_logger() {
|
||||
|
||||
#[test]
|
||||
fn test_edit() {
|
||||
let mut buffer = Buffer::new(0, 0, "abc".into());
|
||||
let mut buffer = Buffer::new(0, BufferId::new(1).unwrap(), "abc".into());
|
||||
assert_eq!(buffer.text(), "abc");
|
||||
buffer.edit([(3..3, "def")]);
|
||||
assert_eq!(buffer.text(), "abcdef");
|
||||
@@ -42,7 +42,7 @@ fn test_random_edits(mut rng: StdRng) {
|
||||
let mut reference_string = RandomCharIter::new(&mut rng)
|
||||
.take(reference_string_len)
|
||||
.collect::<String>();
|
||||
let mut buffer = Buffer::new(0, 0, reference_string.clone());
|
||||
let mut buffer = Buffer::new(0, BufferId::new(1).unwrap(), reference_string.clone());
|
||||
LineEnding::normalize(&mut reference_string);
|
||||
|
||||
buffer.set_group_interval(Duration::from_millis(rng.gen_range(0..=200)));
|
||||
@@ -164,7 +164,7 @@ fn test_line_endings() {
|
||||
LineEnding::Windows
|
||||
);
|
||||
|
||||
let mut buffer = Buffer::new(0, 0, "one\r\ntwo\rthree".into());
|
||||
let mut buffer = Buffer::new(0, BufferId::new(1).unwrap(), "one\r\ntwo\rthree".into());
|
||||
assert_eq!(buffer.text(), "one\ntwo\nthree");
|
||||
assert_eq!(buffer.line_ending(), LineEnding::Windows);
|
||||
buffer.check_invariants();
|
||||
@@ -178,7 +178,7 @@ fn test_line_endings() {
|
||||
|
||||
#[test]
|
||||
fn test_line_len() {
|
||||
let mut buffer = Buffer::new(0, 0, "".into());
|
||||
let mut buffer = Buffer::new(0, BufferId::new(1).unwrap(), "".into());
|
||||
buffer.edit([(0..0, "abcd\nefg\nhij")]);
|
||||
buffer.edit([(12..12, "kl\nmno")]);
|
||||
buffer.edit([(18..18, "\npqrs\n")]);
|
||||
@@ -195,7 +195,7 @@ fn test_line_len() {
|
||||
#[test]
|
||||
fn test_common_prefix_at_position() {
|
||||
let text = "a = str; b = δα";
|
||||
let buffer = Buffer::new(0, 0, text.into());
|
||||
let buffer = Buffer::new(0, BufferId::new(1).unwrap(), text.into());
|
||||
|
||||
let offset1 = offset_after(text, "str");
|
||||
let offset2 = offset_after(text, "δα");
|
||||
@@ -243,7 +243,11 @@ fn test_common_prefix_at_position() {
|
||||
|
||||
#[test]
|
||||
fn test_text_summary_for_range() {
|
||||
let buffer = Buffer::new(0, 0, "ab\nefg\nhklm\nnopqrs\ntuvwxyz".into());
|
||||
let buffer = Buffer::new(
|
||||
0,
|
||||
BufferId::new(1).unwrap(),
|
||||
"ab\nefg\nhklm\nnopqrs\ntuvwxyz".into(),
|
||||
);
|
||||
assert_eq!(
|
||||
buffer.text_summary_for_range::<TextSummary, _>(1..3),
|
||||
TextSummary {
|
||||
@@ -313,7 +317,7 @@ fn test_text_summary_for_range() {
|
||||
|
||||
#[test]
|
||||
fn test_chars_at() {
|
||||
let mut buffer = Buffer::new(0, 0, "".into());
|
||||
let mut buffer = Buffer::new(0, BufferId::new(1).unwrap(), "".into());
|
||||
buffer.edit([(0..0, "abcd\nefgh\nij")]);
|
||||
buffer.edit([(12..12, "kl\nmno")]);
|
||||
buffer.edit([(18..18, "\npqrs")]);
|
||||
@@ -335,7 +339,7 @@ fn test_chars_at() {
|
||||
assert_eq!(chars.collect::<String>(), "PQrs");
|
||||
|
||||
// Regression test:
|
||||
let mut buffer = Buffer::new(0, 0, "".into());
|
||||
let mut buffer = Buffer::new(0, BufferId::new(1).unwrap(), "".into());
|
||||
buffer.edit([(0..0, "[workspace]\nmembers = [\n \"xray_core\",\n \"xray_server\",\n \"xray_cli\",\n \"xray_wasm\",\n]\n")]);
|
||||
buffer.edit([(60..60, "\n")]);
|
||||
|
||||
@@ -345,7 +349,7 @@ fn test_chars_at() {
|
||||
|
||||
#[test]
|
||||
fn test_anchors() {
|
||||
let mut buffer = Buffer::new(0, 0, "".into());
|
||||
let mut buffer = Buffer::new(0, BufferId::new(1).unwrap(), "".into());
|
||||
buffer.edit([(0..0, "abc")]);
|
||||
let left_anchor = buffer.anchor_before(2);
|
||||
let right_anchor = buffer.anchor_after(2);
|
||||
@@ -463,7 +467,7 @@ fn test_anchors() {
|
||||
|
||||
#[test]
|
||||
fn test_anchors_at_start_and_end() {
|
||||
let mut buffer = Buffer::new(0, 0, "".into());
|
||||
let mut buffer = Buffer::new(0, BufferId::new(1).unwrap(), "".into());
|
||||
let before_start_anchor = buffer.anchor_before(0);
|
||||
let after_end_anchor = buffer.anchor_after(0);
|
||||
|
||||
@@ -486,7 +490,7 @@ fn test_anchors_at_start_and_end() {
|
||||
|
||||
#[test]
|
||||
fn test_undo_redo() {
|
||||
let mut buffer = Buffer::new(0, 0, "1234".into());
|
||||
let mut buffer = Buffer::new(0, BufferId::new(1).unwrap(), "1234".into());
|
||||
// Set group interval to zero so as to not group edits in the undo stack.
|
||||
buffer.set_group_interval(Duration::from_secs(0));
|
||||
|
||||
@@ -523,7 +527,7 @@ fn test_undo_redo() {
|
||||
#[test]
|
||||
fn test_history() {
|
||||
let mut now = Instant::now();
|
||||
let mut buffer = Buffer::new(0, 0, "123456".into());
|
||||
let mut buffer = Buffer::new(0, BufferId::new(1).unwrap(), "123456".into());
|
||||
buffer.set_group_interval(Duration::from_millis(300));
|
||||
|
||||
let transaction_1 = buffer.start_transaction_at(now).unwrap();
|
||||
@@ -590,7 +594,7 @@ fn test_history() {
|
||||
#[test]
|
||||
fn test_finalize_last_transaction() {
|
||||
let now = Instant::now();
|
||||
let mut buffer = Buffer::new(0, 0, "123456".into());
|
||||
let mut buffer = Buffer::new(0, BufferId::new(1).unwrap(), "123456".into());
|
||||
|
||||
buffer.start_transaction_at(now);
|
||||
buffer.edit([(2..4, "cd")]);
|
||||
@@ -625,7 +629,7 @@ fn test_finalize_last_transaction() {
|
||||
#[test]
|
||||
fn test_edited_ranges_for_transaction() {
|
||||
let now = Instant::now();
|
||||
let mut buffer = Buffer::new(0, 0, "1234567".into());
|
||||
let mut buffer = Buffer::new(0, BufferId::new(1).unwrap(), "1234567".into());
|
||||
|
||||
buffer.start_transaction_at(now);
|
||||
buffer.edit([(2..4, "cd")]);
|
||||
@@ -664,9 +668,9 @@ fn test_edited_ranges_for_transaction() {
|
||||
fn test_concurrent_edits() {
|
||||
let text = "abcdef";
|
||||
|
||||
let mut buffer1 = Buffer::new(1, 0, text.into());
|
||||
let mut buffer2 = Buffer::new(2, 0, text.into());
|
||||
let mut buffer3 = Buffer::new(3, 0, text.into());
|
||||
let mut buffer1 = Buffer::new(1, BufferId::new(1).unwrap(), text.into());
|
||||
let mut buffer2 = Buffer::new(2, BufferId::new(1).unwrap(), text.into());
|
||||
let mut buffer3 = Buffer::new(3, BufferId::new(1).unwrap(), text.into());
|
||||
|
||||
let buf1_op = buffer1.edit([(1..2, "12")]);
|
||||
assert_eq!(buffer1.text(), "a12cdef");
|
||||
@@ -705,7 +709,7 @@ fn test_random_concurrent_edits(mut rng: StdRng) {
|
||||
let mut network = Network::new(rng.clone());
|
||||
|
||||
for i in 0..peers {
|
||||
let mut buffer = Buffer::new(i as ReplicaId, 0, base_text.clone());
|
||||
let mut buffer = Buffer::new(i as ReplicaId, BufferId::new(1).unwrap(), base_text.clone());
|
||||
buffer.history.group_interval = Duration::from_millis(rng.gen_range(0..=200));
|
||||
buffers.push(buffer);
|
||||
replica_ids.push(i as u16);
|
||||
|
||||
+35
-5
@@ -26,6 +26,7 @@ pub use selection::*;
|
||||
use std::{
|
||||
borrow::Cow,
|
||||
cmp::{self, Ordering, Reverse},
|
||||
fmt::Display,
|
||||
future::Future,
|
||||
iter::Iterator,
|
||||
ops::{self, Deref, Range, Sub},
|
||||
@@ -59,10 +60,39 @@ pub struct Buffer {
|
||||
wait_for_version_txs: Vec<(clock::Global, oneshot::Sender<()>)>,
|
||||
}
|
||||
|
||||
#[repr(transparent)]
|
||||
#[derive(Clone, Copy, Debug, Default, Hash, PartialEq, PartialOrd, Ord, Eq)]
|
||||
pub struct BufferId(u64);
|
||||
|
||||
impl Display for BufferId {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "{}", self.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl BufferId {
|
||||
/// Returns Err if `id` is outside of BufferId domain.
|
||||
pub fn new(id: u64) -> anyhow::Result<Self> {
|
||||
Ok(Self(id))
|
||||
}
|
||||
/// Increments this buffer id, returning the old value.
|
||||
/// So that's a post-increment operator in disguise.
|
||||
pub fn next(&mut self) -> Self {
|
||||
let old = *self;
|
||||
self.0 += 1;
|
||||
old
|
||||
}
|
||||
}
|
||||
impl From<BufferId> for u64 {
|
||||
fn from(id: BufferId) -> Self {
|
||||
id.0
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct BufferSnapshot {
|
||||
replica_id: ReplicaId,
|
||||
remote_id: u64,
|
||||
remote_id: BufferId,
|
||||
visible_text: Rope,
|
||||
deleted_text: Rope,
|
||||
line_ending: LineEnding,
|
||||
@@ -369,7 +399,7 @@ struct Edits<'a, D: TextDimension, F: FnMut(&FragmentSummary) -> bool> {
|
||||
old_end: D,
|
||||
new_end: D,
|
||||
range: Range<(&'a Locator, usize)>,
|
||||
buffer_id: u64,
|
||||
buffer_id: BufferId,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Default, Eq, PartialEq)]
|
||||
@@ -478,7 +508,7 @@ pub struct UndoOperation {
|
||||
}
|
||||
|
||||
impl Buffer {
|
||||
pub fn new(replica_id: u16, remote_id: u64, mut base_text: String) -> Buffer {
|
||||
pub fn new(replica_id: u16, remote_id: BufferId, mut base_text: String) -> Buffer {
|
||||
let line_ending = LineEnding::detect(&base_text);
|
||||
LineEnding::normalize(&mut base_text);
|
||||
|
||||
@@ -545,7 +575,7 @@ impl Buffer {
|
||||
self.lamport_clock.replica_id
|
||||
}
|
||||
|
||||
pub fn remote_id(&self) -> u64 {
|
||||
pub fn remote_id(&self) -> BufferId {
|
||||
self.remote_id
|
||||
}
|
||||
|
||||
@@ -1590,7 +1620,7 @@ impl BufferSnapshot {
|
||||
&self.visible_text
|
||||
}
|
||||
|
||||
pub fn remote_id(&self) -> u64 {
|
||||
pub fn remote_id(&self) -> BufferId {
|
||||
self.remote_id
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user