commit 3f229dca29ce51c33063f4aef160f6b7d547d868 Author: MrLetsplay Date: Tue Nov 21 22:52:11 2023 +0100 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cc39cef --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/bin/ +/target/ +/.settings/ +/.classpath +/dependency-reduced-pom.xml diff --git a/.project b/.project new file mode 100644 index 0000000..eb29ab4 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + ShareClient-Core + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..aaa93ac --- /dev/null +++ b/pom.xml @@ -0,0 +1,28 @@ + + 4.0.0 + me.mrletsplay + ShareClient-Core + 0.0.1-SNAPSHOT + + + + maven-compiler-plugin + 3.8.1 + + 17 + + + + + + + + org.junit.jupiter + junit-jupiter-api + 5.10.1 + test + + + \ No newline at end of file diff --git a/src/main/java/me/mrletsplay/shareclientcore/ShareClient.java b/src/main/java/me/mrletsplay/shareclientcore/ShareClient.java new file mode 100644 index 0000000..163bf6d --- /dev/null +++ b/src/main/java/me/mrletsplay/shareclientcore/ShareClient.java @@ -0,0 +1,8 @@ +package me.mrletsplay.shareclientcore; + +public class ShareClient { + + public static void main(String[] args) { + } + +} diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java b/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java new file mode 100644 index 0000000..34d1ef0 --- /dev/null +++ b/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java @@ -0,0 +1,22 @@ +package me.mrletsplay.shareclientcore.document; + +import java.util.ArrayList; +import java.util.List; + +public class ArrayCharBag implements CharBag { + + private List chars = new ArrayList<>(); + + @Override + public void add(Char character) { + int i = 0; + while(Util.comparePositions(chars.get(i).position(), character.position()) < 0) i++; + chars.add(i, character); + } + + @Override + public void remove(Char character) { + chars.remove(character); + } + +} diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/Char.java b/src/main/java/me/mrletsplay/shareclientcore/document/Char.java new file mode 100644 index 0000000..3486d86 --- /dev/null +++ b/src/main/java/me/mrletsplay/shareclientcore/document/Char.java @@ -0,0 +1,7 @@ +package me.mrletsplay.shareclientcore.document; + +public record Char(Identifier[] position, int lamport, String value) { + + + +} diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java b/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java new file mode 100644 index 0000000..5c129ec --- /dev/null +++ b/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java @@ -0,0 +1,12 @@ +package me.mrletsplay.shareclientcore.document; + +public interface CharBag { + +// public Character find(PositionIdentifier position); +// public Character findBefore(PositionIdentifier position); +// public Character findAfter(PositionIdentifier position); + + public void add(Char character); + public void remove(Char character); + +} diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/Document.java b/src/main/java/me/mrletsplay/shareclientcore/document/Document.java new file mode 100644 index 0000000..f7db531 --- /dev/null +++ b/src/main/java/me/mrletsplay/shareclientcore/document/Document.java @@ -0,0 +1,10 @@ +package me.mrletsplay.shareclientcore.document; + +public class Document { + + private CharBag charBag; + + public Document() { + } + +} diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/Identifier.java b/src/main/java/me/mrletsplay/shareclientcore/document/Identifier.java new file mode 100644 index 0000000..04b0d8f --- /dev/null +++ b/src/main/java/me/mrletsplay/shareclientcore/document/Identifier.java @@ -0,0 +1,12 @@ +package me.mrletsplay.shareclientcore.document; + +public record Identifier(int digit, int site) implements Comparable { + + @Override + public int compareTo(Identifier o) { + int tmp; + if((tmp = Integer.compare(digit, o.digit)) != 0) return tmp; + return Integer.compare(site, o.site); + } + +} diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/Util.java b/src/main/java/me/mrletsplay/shareclientcore/document/Util.java new file mode 100644 index 0000000..4c92a70 --- /dev/null +++ b/src/main/java/me/mrletsplay/shareclientcore/document/Util.java @@ -0,0 +1,73 @@ +package me.mrletsplay.shareclientcore.document; + +import java.util.ArrayList; +import java.util.List; + +public class Util { + + public static final int BASE = 10; + + public static int comparePositions(Identifier[] a, Identifier[] b) { + for(int i = 0; i < Math.min(a.length, b.length); i++) { + int tmp; + if((tmp = a[i].compareTo(b[i])) != 0) return tmp; + } + + return Integer.compare(a.length, b.length); + } + + public static Identifier[] generatePositionBetween(Identifier[] before, Identifier[] after, int site) { + List newPosition = new ArrayList<>(); + + for(int i = 0; i < Math.min(before.length, after.length) + 1; i++) { + Identifier c1 = i >= before.length ? new Identifier(0, site) : before[i]; + Identifier c2 = i >= after.length ? new Identifier(BASE, site) : after[i]; + + if(c1.digit() != c2.digit()) { + // TODO: generate delta, then pick a value between + } + + if(c1.site() == c2.site()) { + newPosition.add(c1); + continue; // Identifiers are equal, compare next digit + } + + if(c1.site() < c2.site()) { + // Anything starting with before will be sorted before after + newPosition.add(new Identifier(BASE, site)); + return newPosition.toArray(Identifier[]::new); + } + + throw new RuntimeException("Invalid site order"); + } + + return null; + } + + public static void getIncrement(Identifier[] i1, Identifier[] i2, int offset) { + } + + /** + * Subtract b from a, where a > b + */ + public static int[] subtract(Identifier[] a, Identifier[] b, int offset) { + int carry = 0; + int[] diff = new int[Math.max(a.length, b.length) - offset]; + + for(int i = diff.length - 1; i >= 0; i--) { + int idx = i + offset; + int dA = (idx >= a.length ? 0 : a[idx].digit()) - carry; + int dB = idx >= b.length ? 0 : b[idx].digit(); + if(dA < dB) { + carry = 1; + diff[i] = dA - dB + BASE; + }else { + carry = 0; + diff[i] = dA - dB; + } + } + + return diff; + } + +} diff --git a/src/test/java/me/mrletsplay/shareclientcore/DecimalTest.java b/src/test/java/me/mrletsplay/shareclientcore/DecimalTest.java new file mode 100644 index 0000000..ddccb31 --- /dev/null +++ b/src/test/java/me/mrletsplay/shareclientcore/DecimalTest.java @@ -0,0 +1,33 @@ +package me.mrletsplay.shareclientcore; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +import org.junit.jupiter.api.Test; + +import me.mrletsplay.shareclientcore.document.Identifier; +import me.mrletsplay.shareclientcore.document.Util; + +public class DecimalTest { + + @Test + public void testSimpleSubtraction() { + Identifier[] a = new Identifier[] { new Identifier(1, 0), new Identifier(2, 0), new Identifier(3, 0) }; + Identifier[] b = new Identifier[] { new Identifier(1, 0), new Identifier(1, 0), new Identifier(3, 0) }; + assertArrayEquals(Util.subtract(a, b, 0), new int[] { 0, 1, 0 }); + } + + @Test + public void testCarrySubtraction() { + Identifier[] a = new Identifier[] { new Identifier(2, 0), new Identifier(0, 0), new Identifier(4, 0) }; + Identifier[] b = new Identifier[] { new Identifier(1, 0), new Identifier(0, 0), new Identifier(5, 0) }; + assertArrayEquals(Util.subtract(a, b, 0), new int[] { 0, 9, 9 }); + } + + @Test + public void testOffsetSubtraction() { + Identifier[] a = new Identifier[] { new Identifier(1, 0), new Identifier(0, 0), new Identifier(5, 0) }; + Identifier[] b = new Identifier[] { new Identifier(1, 0), new Identifier(0, 0), new Identifier(4, 0) }; + assertArrayEquals(Util.subtract(a, b, 1), new int[] { 0, 1 }); + } + +}