public void clear() { if (isEmpty()) { return; } // iterate back because by default slots will try to pull new value from next slot // when someone try to remove their value Slot slot = lastSlot; while (slot != null) { slot.setValue(null); slot = slot.getPrevSlot(); } }
private int emptySlotsOnTail() { int count = 0; Slot slot = slots.getLastSlot(); while (slot != null && slot.getValue() == null) { count++; slot = slot.getPrevSlot(); } return count; }
private void trimTail() { if (terminated || slots.isEmpty()) { return; } Slot currentSlot = slots.getLastSlot(); Slot prevSlot = currentSlot.getPrevSlot(); while (isAllowedToRemoveSlot(currentSlot, prevSlot)) { slots.removeSlotAt(slots.size() - 1); currentSlot = prevSlot; prevSlot = prevSlot.getPrevSlot(); } }
public Slot getSlot(int index) { if (!checkIsIndex(index)) { return null; } Slot result; if (index < (size >> 1)) { // first half of a list result = firstSlot; for (int i = 0; i < index; i++) { result = result.getNextSlot(); } } else { // second half of a list result = lastSlot; for (int i = size - 1; i > index; i--) { result = result.getPrevSlot(); } } if (result == null) { throw new IllegalStateException("Slot inside the mask should not be null. But it is."); } return result; }
@Override public int findCursorPositionInUnformattedString(int cursorPosition) { if (cursorPosition == 0) { return 0; } else if (cursorPosition < 0 || getSize() < cursorPosition) { throw new IndexOutOfBoundsException(String.format(Locale.getDefault(), "Mask size: %d, passed index: %d", getSize(), cursorPosition)); } Slot slot; if (cursorPosition == getSize()) { slot = slots.getLastSlot(); } else { slot = slots.getSlot(cursorPosition); } do { if (slot.hasTag(Slot.TAG_DECORATION)) { cursorPosition--; } slot = slot.getPrevSlot(); } while (slot != null); return cursorPosition; }
public Slot removeSlot(final Slot slotToRemove) { if (slotToRemove == null || !contains(slotToRemove)) { return null; } Slot left = slotToRemove.getPrevSlot(); Slot right = slotToRemove.getNextSlot(); if (left != null) { left.setNextSlot(right); } else { firstSlot = right; } if (right != null) { right.setPrevSlot(left); } else { lastSlot = left; } size--; return slotToRemove; }
leftNeighbour = currentSlot.getPrevSlot(); rightNeighbour = currentSlot;
@Test public void ofArray() throws Exception { assertEquals(5, list.size()); assertEquals(list.getFirstSlot(), first); assertEquals(list.getLastSlot(), last); assertEquals(list.getFirstSlot().getNextSlot(), second); assertEquals(list.getLastSlot().getPrevSlot().getPrevSlot().getPrevSlot(), second); }
@Test public void insertSlotAt() throws Exception { assertEquals(PredefinedSlots.hardcodedSlot('0'), list.insertSlotAt(0, PredefinedSlots.hardcodedSlot('0'))); assertEquals(6, list.size()); assertEquals(list.getFirstSlot(), PredefinedSlots.hardcodedSlot('0')); list.insertSlotAt(6, PredefinedSlots.hardcodedSlot('5')); assertEquals(7, list.size()); assertEquals(list.getLastSlot(), PredefinedSlots.hardcodedSlot('5')); list.insertSlotAt(1, PredefinedSlots.hardcodedSlot('1')); assertEquals(8, list.size()); assertEquals(list.getFirstSlot().getNextSlot(), PredefinedSlots.hardcodedSlot('1')); list.insertSlotAt(7, PredefinedSlots.hardcodedSlot('6')); assertEquals(9, list.size()); assertEquals(list.getLastSlot().getPrevSlot(), PredefinedSlots.hardcodedSlot('6')); }