|
|
@@ -17,16 +17,16 @@ import net.ranides.assira.reflection.UnsafeArrayAccess;
|
|
|
/**
|
|
|
* Lista odwzorowująca tablicę elementów typu prostego (int, float, etc)
|
|
|
* dokonując jedynie po drodze koniecznego autoboxingu.
|
|
|
- *
|
|
|
+ *
|
|
|
* <p>
|
|
|
* Utworzona lista posiada maksymalną pojemność wyliczoną na podstawie długości
|
|
|
- * prezentowanej tablicy (patrz: {@link #capacity() capacity}). Rozmiar listy nie ma
|
|
|
+ * prezentowanej tablicy (patrz: {@link #capacity() capacity}). Rozmiar listy nie ma
|
|
|
* bezpośredniego związku z długością tablicy i może mieć dowolną wartość z zakresu
|
|
|
* [0;capacity]. Rozmiar listy może być modyfikowany: wszystkie operacje usuwania
|
|
|
* i wstawiania są obsługiwane tak długo, jak długo nie zostanie przekroczony
|
|
|
- * dozwolony zakres.
|
|
|
+ * dozwolony zakres.
|
|
|
* </p>
|
|
|
- *
|
|
|
+ *
|
|
|
* <p>
|
|
|
* Standardowe kolekcje nie mogą przechowywać typów prostych, co oznacza, że np
|
|
|
* ArrayList nie przechowuje elementów typu int ale <b>obiekty</b> typu Integer.
|
|
|
@@ -36,16 +36,16 @@ import net.ranides.assira.reflection.UnsafeArrayAccess;
|
|
|
* jest nowa alokacja pamięci i skopiowanie wszystkich danych do nowego formatu
|
|
|
* (rzutowanie {@code Integer[] <-> int[]} jest niemożliwe).
|
|
|
* </p><p>
|
|
|
- * JIT/HotSpot powinien sobie bez trudu poradzić z eliminacją operacji
|
|
|
- * box'ujących - zwłaszcza biorąc pod uwagę wewnętrzną implementację
|
|
|
+ * JIT/HotSpot powinien sobie bez trudu poradzić z eliminacją operacji
|
|
|
+ * box'ujących - zwłaszcza biorąc pod uwagę wewnętrzną implementację
|
|
|
* {@code NativeArrayList}. Jest niemal pewne, że tradycyjnych pętli kopiujących
|
|
|
* optymalizator nie może usunąć wcale.
|
|
|
* </p>
|
|
|
- *
|
|
|
- * @see ArrayUtils#wrap(Object)
|
|
|
- * @see ArrayUtils#wrap(Class, Object)
|
|
|
- *
|
|
|
- * @param <T>
|
|
|
+ *
|
|
|
+ * @see ArrayUtils#wrap(Object)
|
|
|
+ * @see ArrayUtils#wrap(Class, Object)
|
|
|
+ *
|
|
|
+ * @param <T>
|
|
|
* @author ranides
|
|
|
*/
|
|
|
@SuppressWarnings("unchecked")
|
|
|
@@ -57,8 +57,8 @@ public class NativeArrayList<T> extends AbstractList<T> implements RandomAccess
|
|
|
private int size;
|
|
|
|
|
|
/**
|
|
|
- * Tworzy nową listę odwierciedlającą tablicę.
|
|
|
- * Modyfikacja listy zmienia zawartość tablicy, i vice versa.
|
|
|
+ * Tworzy nową listę odwierciedlającą tablicę.
|
|
|
+ * Modyfikacja listy zmienia zawartość tablicy, i vice versa.
|
|
|
* Rozmiar listy jest równy rozmiarowi podanej tablicy.
|
|
|
* @param array
|
|
|
* @see ArrayUtils#wrap(Object)
|
|
|
@@ -72,10 +72,10 @@ public class NativeArrayList<T> extends AbstractList<T> implements RandomAccess
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Tworzy nową listę odwierciedlającą tablicę.
|
|
|
- * Modyfikacja listy zmienia zawartość tablicy, i vice versa.
|
|
|
+ * Tworzy nową listę odwierciedlającą tablicę.
|
|
|
+ * Modyfikacja listy zmienia zawartość tablicy, i vice versa.
|
|
|
* Początkowy rozmiar listy jest podawany jako argument.
|
|
|
- * Do listy mogą być wstawiane nowe elementy tak długo, jak długo lista
|
|
|
+ * Do listy mogą być wstawiane nowe elementy tak długo, jak długo lista
|
|
|
* nie przekroczy maksymalnej pojemności tablicy.
|
|
|
* @param array
|
|
|
* @param size początkowy rozmiar zwracany przez listę
|
|
|
@@ -86,22 +86,22 @@ public class NativeArrayList<T> extends AbstractList<T> implements RandomAccess
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Tworzy nową listę odwierciedlającą tablicę.
|
|
|
- * Modyfikacja listy zmienia zawartość tablicy, i vice versa.
|
|
|
+ * Tworzy nową listę odwierciedlającą tablicę.
|
|
|
+ * Modyfikacja listy zmienia zawartość tablicy, i vice versa.
|
|
|
* <p>
|
|
|
- * Podana tablica jest "transparentnie" konwertowana na wskazany typ, a dopiero
|
|
|
- * wynik konwersji jest używany przez kolekcję. Przykładowo traktowanie
|
|
|
- * tablicy {@code long[]} jako tablicy {@code byte[]} umożliwia utworzenie
|
|
|
+ * Podana tablica jest "transparentnie" konwertowana na wskazany typ, a dopiero
|
|
|
+ * wynik konwersji jest używany przez kolekcję. Przykładowo traktowanie
|
|
|
+ * tablicy {@code long[]} jako tablicy {@code byte[]} umożliwia utworzenie
|
|
|
* listy typu {@code List<Byte>}. Konwersja jest wykonywana natywnie przez system hostujący (a nie przez VM!). Przekłada się to przede wszystkim na względnie większą wydajność kosztem nieprzenośności kodu ze względu na endianess.
|
|
|
* </p>
|
|
|
* <p>
|
|
|
* Uwaga! Rzutowanie między typami o różnych rozmiarach powoduje, że lista ma
|
|
|
* {@code capacity} różne niż {@code array.length}
|
|
|
* </p>
|
|
|
- *
|
|
|
+ *
|
|
|
* @param clazz
|
|
|
* @param array
|
|
|
- *
|
|
|
+ *
|
|
|
* @see ArrayUtils#wrap(Class, Object)
|
|
|
*/
|
|
|
public NativeArrayList(Class<?> clazz, Object array) {
|
|
|
@@ -116,16 +116,16 @@ public class NativeArrayList<T> extends AbstractList<T> implements RandomAccess
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Tworzy nową listę odwierciedlającą tablicę.
|
|
|
- * Modyfikacja listy zmienia zawartość tablicy, i vice versa.
|
|
|
+ * Tworzy nową listę odwierciedlającą tablicę.
|
|
|
+ * Modyfikacja listy zmienia zawartość tablicy, i vice versa.
|
|
|
* Początkowy rozmiar listy jest podawany jako argument.
|
|
|
- * Do listy mogą być wstawiane nowe elementy tak długo, jak długo lista
|
|
|
+ * Do listy mogą być wstawiane nowe elementy tak długo, jak długo lista
|
|
|
* nie przekroczy maksymalnej pojemności tablicy.
|
|
|
- *
|
|
|
+ *
|
|
|
* <p>
|
|
|
- * Podana tablica jest "transparentnie" konwertowana na wskazany typ, a dopiero
|
|
|
- * wynik konwersji jest używany przez kolekcję. Przykładowo traktowanie
|
|
|
- * tablicy {@code long[]} jako tablicy {@code byte[]} umożliwia utworzenie
|
|
|
+ * Podana tablica jest "transparentnie" konwertowana na wskazany typ, a dopiero
|
|
|
+ * wynik konwersji jest używany przez kolekcję. Przykładowo traktowanie
|
|
|
+ * tablicy {@code long[]} jako tablicy {@code byte[]} umożliwia utworzenie
|
|
|
* listy typu {@code List<Byte>}. Konwersja jest wykonywana natywnie przez system hostujący (a nie przez VM!). Przekłada się to przede wszystkim na względnie większą wydajność kosztem nieprzenośności kodu ze względu na endianess.
|
|
|
* </p>
|
|
|
* <p>
|
|
|
@@ -140,10 +140,10 @@ public class NativeArrayList<T> extends AbstractList<T> implements RandomAccess
|
|
|
this(clazz, array);
|
|
|
this.size = size;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* Zwraca maksymalny dopuszczalny rozmiar listy.
|
|
|
- * @return
|
|
|
+ * @return
|
|
|
*/
|
|
|
public int capacity() {
|
|
|
return capacity;
|
|
|
@@ -191,31 +191,41 @@ public class NativeArrayList<T> extends AbstractList<T> implements RandomAccess
|
|
|
return prev;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Zwraca typ elementów przechowywanych przez oryginalną tablicę.
|
|
|
+ * @return
|
|
|
+ */
|
|
|
public Class<?> component() {
|
|
|
return array.getClass().getComponentType();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Zwraca oryginalną tablicę. Ponieważ jest to tablica typów prostych, to
|
|
|
+ * niemożliwe jest zwrócenie typu generycznego - wywołujący metodę samodzielnie
|
|
|
+ * musi dokonać odpowiedniego rzutowania.
|
|
|
+ * @return
|
|
|
+ */
|
|
|
public Object delegator() {
|
|
|
return array;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
private void checkCapacity(int index) {
|
|
|
if(index >= capacity) {
|
|
|
throw new IndexOutOfBoundsException(index + " out of maximal capacity " + capacity);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
private void checkBounds(int index) {
|
|
|
if(index >= size || index<0) {
|
|
|
throw new IndexOutOfBoundsException(index +" out of bound " + size);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
private void checkType(Class<?> clazz) {
|
|
|
if (!clazz.isArray()) {
|
|
|
throw new IllegalArgumentException(clazz + " is not an array");
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
}
|