diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java b/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java index 9dd8a63..b095b50 100644 --- a/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java +++ b/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java @@ -12,6 +12,7 @@ public class ArrayCharBag implements CharBag { int i = 0; // TODO: use binary search while(i < chars.size() && Util.comparePositions(chars.get(i).position(), character.position()) < 0) i++; + if(i < chars.size() && Util.comparePositions(chars.get(i).position(), character.position()) == 0) return -1; chars.add(i, character); return i; } diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java b/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java index 4be6f88..642f925 100644 --- a/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java +++ b/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java @@ -2,12 +2,8 @@ package me.mrletsplay.shareclientcore.document; public interface CharBag { -// public Character find(PositionIdentifier position); -// public Character findBefore(PositionIdentifier position); -// public Character findAfter(PositionIdentifier position); - /** - * Adds a character to the bag and returns the index it was inserted at + * Adds a character to the bag and returns the index it was inserted at, or -1 if it was not inserted because it already exists * @param character The character to add * @return The index it was inserted at */ diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/Document.java b/src/main/java/me/mrletsplay/shareclientcore/document/Document.java index 77c882d..2e1016e 100644 --- a/src/main/java/me/mrletsplay/shareclientcore/document/Document.java +++ b/src/main/java/me/mrletsplay/shareclientcore/document/Document.java @@ -48,6 +48,26 @@ public class Document { } } + /** + * Inserts a remote change into the document and updates internal parameters accordingly + * @param c The character to insert + * @return The index of the inserted character, or -1 if it was not inserted because it already exists + */ + public int remoteInsert(Char c) { + lamport = Math.max(c.lamport(), lamport) + 1; + return charBag.add(c); + } + + /** + * Removes a character from the document and updates internal parameters accordingly + * @param c The character to delete + * @return The index the character was located at, or -1 if it was not contained in the document + */ + public int remoteDelete(Char c) { + lamport = Math.max(c.lamport(), lamport) + 1; + return charBag.remove(c); + } + public CharBag getCharBag() { return charBag; }