private static <E> int addMask(byte sl, E[] data, int[] masks, E e, int mask) { int pos = LinearProbing.getPosition(data, e); int oldMask = getFragment(sl, masks, pos); if (data[pos] == null) { data[pos] = e; changeFragment(sl, masks, pos, oldMask ^ mask); return 0; } // else int newMask = (oldMask | mask); if (newMask != oldMask) changeFragment(sl, masks, pos, oldMask ^ newMask); return oldMask; }
private static <E> int addMask(byte sl, E[] data, int[] masks, E e, int mask) { int pos = LinearProbing.getPosition(data, e); int oldMask = getFragment(sl, masks, pos); if (data[pos] == null) { data[pos] = e; changeFragment(sl, masks, pos, oldMask ^ mask); return 0; } // else int newMask = (oldMask | mask); if (newMask != oldMask) changeFragment(sl, masks, pos, oldMask ^ newMask); return oldMask; }
private static <E> int addMask(byte sl, E[] data, int[] masks, E e, int mask) { int pos = LinearProbing.getPosition(data, e); int oldMask = getFragment(sl, masks, pos); if (data[pos] == null) { data[pos] = e; changeFragment(sl, masks, pos, oldMask ^ mask); return 0; } // else int newMask = (oldMask | mask); if (newMask != oldMask) changeFragment(sl, masks, pos, oldMask ^ newMask); return oldMask; }
private static <E> int removeMask(byte sl, E[] data, int[] masks, Object o, int mask) { int pos = LinearProbing.getPosition(data, o); if (data[pos] == null) return 0; // else int oldFragment = getFragment(sl, masks, pos); int newFragment = oldFragment & (~mask); if (newFragment == 0) remove(sl, data, masks, pos); else changeFragment(sl, masks, pos, oldFragment ^ newFragment); return oldFragment; }
private static <E> int removeMask(byte sl, E[] data, int[] masks, Object o, int mask) { int pos = LinearProbing.getPosition(data, o); if (data[pos] == null) return 0; // else int oldFragment = getFragment(sl, masks, pos); int newFragment = oldFragment & (~mask); if (newFragment == 0) remove(sl, data, masks, pos); else changeFragment(sl, masks, pos, oldFragment ^ newFragment); return oldFragment; }
private static <E> void remove(byte sl, E[] data, int[] masks, int pos) { int oldFragment = getFragment(sl, masks, pos); for (;;) { int next = LinearProbing.getMovedPosition(data, pos); E moved = data[pos] = data[next]; int newFragment = getFragment(sl, masks, next); changeFragment(sl, masks, pos, oldFragment ^ newFragment); if (moved == null) return; // else pos = next; oldFragment = newFragment; } }
private static <E> int removeMask(byte sl, E[] data, int[] masks, Object o, int mask) { int pos = LinearProbing.getPosition(data, o); if (data[pos] == null) return 0; // else int oldFragment = getFragment(sl, masks, pos); int newFragment = oldFragment & (~mask); if (newFragment == 0) remove(sl, data, masks, pos); else changeFragment(sl, masks, pos, oldFragment ^ newFragment); return oldFragment; }
private static <E> void remove(byte sl, E[] data, int[] masks, int pos) { int oldFragment = getFragment(sl, masks, pos); for (;;) { int next = LinearProbing.getMovedPosition(data, pos); E moved = data[pos] = data[next]; int newFragment = getFragment(sl, masks, next); changeFragment(sl, masks, pos, oldFragment ^ newFragment); if (moved == null) return; // else pos = next; oldFragment = newFragment; } }
private static <E> void remove(byte sl, E[] data, int[] masks, int pos) { int oldFragment = getFragment(sl, masks, pos); for (;;) { int next = LinearProbing.getMovedPosition(data, pos); E moved = data[pos] = data[next]; int newFragment = getFragment(sl, masks, next); changeFragment(sl, masks, pos, oldFragment ^ newFragment); if (moved == null) return; // else pos = next; oldFragment = newFragment; } }