PageRenderTime 52ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/L2EmuProject-Commons/src/main/java/net/l2emuproject/util/L2Collections.java

http://l2emu.googlecode.com/
Java | 870 lines | 692 code | 161 blank | 17 comment | 29 complexity | 2172f19099e149efa5bf4875e724e497 MD5 | raw file
Possible License(s): GPL-3.0
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package net.l2emuproject.util;
  16. import java.lang.reflect.Array;
  17. import java.util.ArrayList;
  18. import java.util.Collection;
  19. import java.util.Iterator;
  20. import java.util.List;
  21. import java.util.ListIterator;
  22. import java.util.Map;
  23. import java.util.NoSuchElementException;
  24. import java.util.RandomAccess;
  25. import java.util.Set;
  26. import net.l2emuproject.tools.random.Rnd;
  27. import javolution.util.FastList;
  28. /**
  29. * @author NB4L1
  30. */
  31. @SuppressWarnings({ "unchecked", "rawtypes" })
  32. public final class L2Collections
  33. {
  34. private static final Object[] EMPTY_ARRAY = new Object[0];
  35. private static final class EmptyListIterator implements ListIterator<Object>
  36. {
  37. private static final ListIterator<Object> INSTANCE = new EmptyListIterator();
  38. @Override
  39. public boolean hasNext()
  40. {
  41. return false;
  42. }
  43. @Override
  44. public Object next()
  45. {
  46. throw new UnsupportedOperationException();
  47. }
  48. @Override
  49. public boolean hasPrevious()
  50. {
  51. return false;
  52. }
  53. @Override
  54. public Object previous()
  55. {
  56. throw new UnsupportedOperationException();
  57. }
  58. @Override
  59. public int nextIndex()
  60. {
  61. return 0;
  62. }
  63. @Override
  64. public int previousIndex()
  65. {
  66. return -1;
  67. }
  68. @Override
  69. public void add(Object obj)
  70. {
  71. throw new UnsupportedOperationException();
  72. }
  73. @Override
  74. public void set(Object obj)
  75. {
  76. throw new UnsupportedOperationException();
  77. }
  78. @Override
  79. public void remove()
  80. {
  81. throw new UnsupportedOperationException();
  82. }
  83. }
  84. private static class EmptyCollection implements Collection<Object>
  85. {
  86. private static final Collection<Object> INSTANCE = new EmptyCollection();
  87. @Override
  88. public boolean add(Object e)
  89. {
  90. throw new UnsupportedOperationException();
  91. }
  92. @Override
  93. public boolean addAll(Collection<? extends Object> c)
  94. {
  95. throw new UnsupportedOperationException();
  96. }
  97. @Override
  98. public void clear()
  99. {
  100. }
  101. @Override
  102. public boolean contains(Object o)
  103. {
  104. return false;
  105. }
  106. @Override
  107. public boolean containsAll(Collection<?> c)
  108. {
  109. return false;
  110. }
  111. @Override
  112. public boolean isEmpty()
  113. {
  114. return true;
  115. }
  116. @Override
  117. public Iterator<Object> iterator()
  118. {
  119. return emptyListIterator();
  120. }
  121. @Override
  122. public boolean remove(Object o)
  123. {
  124. return false;
  125. }
  126. @Override
  127. public boolean removeAll(Collection<?> c)
  128. {
  129. return false;
  130. }
  131. @Override
  132. public boolean retainAll(Collection<?> c)
  133. {
  134. return false;
  135. }
  136. @Override
  137. public int size()
  138. {
  139. return 0;
  140. }
  141. @Override
  142. public Object[] toArray()
  143. {
  144. return EMPTY_ARRAY;
  145. }
  146. @Override
  147. public <T> T[] toArray(T[] a)
  148. {
  149. if (a.length != 0)
  150. a = (T[])Array.newInstance(a.getClass().getComponentType(), 0);
  151. return a;
  152. }
  153. @Override
  154. public final String toString()
  155. {
  156. return "[]";
  157. }
  158. }
  159. private static final class EmptySet extends EmptyCollection implements Set<Object>
  160. {
  161. private static final Set<Object> INSTANCE = new EmptySet();
  162. }
  163. private static final class EmptyList extends EmptyCollection implements List<Object>
  164. {
  165. private static final List<Object> INSTANCE = new EmptyList();
  166. @Override
  167. public void add(int index, Object element)
  168. {
  169. throw new UnsupportedOperationException();
  170. }
  171. @Override
  172. public boolean addAll(int index, Collection<? extends Object> c)
  173. {
  174. throw new UnsupportedOperationException();
  175. }
  176. @Override
  177. public Object get(int index)
  178. {
  179. throw new UnsupportedOperationException();
  180. }
  181. @Override
  182. public int indexOf(Object o)
  183. {
  184. return -1;
  185. }
  186. @Override
  187. public int lastIndexOf(Object o)
  188. {
  189. return -1;
  190. }
  191. @Override
  192. public ListIterator<Object> listIterator()
  193. {
  194. return emptyListIterator();
  195. }
  196. @Override
  197. public ListIterator<Object> listIterator(int index)
  198. {
  199. return emptyListIterator();
  200. }
  201. @Override
  202. public Object remove(int index)
  203. {
  204. throw new UnsupportedOperationException();
  205. }
  206. @Override
  207. public Object set(int index, Object element)
  208. {
  209. throw new UnsupportedOperationException();
  210. }
  211. @Override
  212. public List<Object> subList(int fromIndex, int toIndex)
  213. {
  214. throw new UnsupportedOperationException();
  215. }
  216. }
  217. private static final class EmptyMap implements Map<Object, Object>
  218. {
  219. private static final Map<Object, Object> INSTANCE = new EmptyMap();
  220. @Override
  221. public void clear()
  222. {
  223. }
  224. @Override
  225. public boolean containsKey(Object key)
  226. {
  227. return false;
  228. }
  229. @Override
  230. public boolean containsValue(Object value)
  231. {
  232. return false;
  233. }
  234. @Override
  235. public Set<Map.Entry<Object, Object>> entrySet()
  236. {
  237. return emptySet();
  238. }
  239. @Override
  240. public Object get(Object key)
  241. {
  242. return null;
  243. }
  244. @Override
  245. public boolean isEmpty()
  246. {
  247. return true;
  248. }
  249. @Override
  250. public Set<Object> keySet()
  251. {
  252. return emptySet();
  253. }
  254. @Override
  255. public Object put(Object key, Object value)
  256. {
  257. throw new UnsupportedOperationException();
  258. }
  259. @Override
  260. public void putAll(Map<? extends Object, ? extends Object> m)
  261. {
  262. throw new UnsupportedOperationException();
  263. }
  264. @Override
  265. public Object remove(Object key)
  266. {
  267. return null;
  268. }
  269. @Override
  270. public int size()
  271. {
  272. return 0;
  273. }
  274. @Override
  275. public Collection<Object> values()
  276. {
  277. return emptyCollection();
  278. }
  279. @Override
  280. public String toString()
  281. {
  282. return "{}";
  283. }
  284. }
  285. private static final class EmptyBunch implements Bunch<Object>
  286. {
  287. private static final Bunch<Object> INSTANCE = new EmptyBunch();
  288. @Override
  289. public Bunch<Object> add(Object e)
  290. {
  291. throw new UnsupportedOperationException();
  292. }
  293. @Override
  294. public Bunch<Object> addAll(Iterable<? extends Object> c)
  295. {
  296. throw new UnsupportedOperationException();
  297. }
  298. @Override
  299. public Bunch<Object> addAll(Object[] array)
  300. {
  301. throw new UnsupportedOperationException();
  302. }
  303. @Override
  304. public void clear()
  305. {
  306. }
  307. @Override
  308. public boolean contains(Object o)
  309. {
  310. return false;
  311. }
  312. @Override
  313. public Object get(int index)
  314. {
  315. throw new UnsupportedOperationException();
  316. }
  317. @Override
  318. public boolean isEmpty()
  319. {
  320. return true;
  321. }
  322. @Override
  323. public Object[] moveToArray()
  324. {
  325. return EMPTY_ARRAY;
  326. }
  327. @Override
  328. public <T> T[] moveToArray(T[] array)
  329. {
  330. if (array.length != 0)
  331. array = (T[])Array.newInstance(array.getClass().getComponentType(), 0);
  332. return array;
  333. }
  334. @Override
  335. public <T> T[] moveToArray(Class<T> clazz)
  336. {
  337. return (T[])Array.newInstance(clazz, 0);
  338. }
  339. @Override
  340. public List<Object> moveToList(List<Object> list)
  341. {
  342. return list;
  343. }
  344. @Override
  345. public Bunch<Object> remove(Object o)
  346. {
  347. return this;
  348. }
  349. @Override
  350. public Object remove(int index)
  351. {
  352. throw new UnsupportedOperationException();
  353. }
  354. @Override
  355. public Object set(int index, Object value)
  356. {
  357. throw new UnsupportedOperationException();
  358. }
  359. @Override
  360. public int size()
  361. {
  362. return 0;
  363. }
  364. @Override
  365. public Bunch<Object> cleanByFilter(Filter<Object> filter)
  366. {
  367. return this;
  368. }
  369. @Override
  370. public String toString()
  371. {
  372. return "[]";
  373. }
  374. }
  375. private static <T> ListIterator<T> emptyListIterator()
  376. {
  377. return (ListIterator<T>)EmptyListIterator.INSTANCE;
  378. }
  379. private static <T> Collection<T> emptyCollection()
  380. {
  381. return (Collection<T>)EmptyCollection.INSTANCE;
  382. }
  383. public static <T> Set<T> emptySet()
  384. {
  385. return (Set<T>)EmptySet.INSTANCE;
  386. }
  387. public static <T> List<T> emptyList()
  388. {
  389. return (List<T>)EmptyList.INSTANCE;
  390. }
  391. public static <K, V> Map<K, V> emptyMap()
  392. {
  393. return (Map<K, V>)EmptyMap.INSTANCE;
  394. }
  395. public static <T> Bunch<T> emptyBunch()
  396. {
  397. return (Bunch<T>)EmptyBunch.INSTANCE;
  398. }
  399. public static <T> Iterable<T> filteredIterable(Class<T> clazz, Iterable<? super T> iterable)
  400. {
  401. return filteredIterable(clazz, iterable, null);
  402. }
  403. public static <T> Iterable<T> filteredIterable(Class<T> clazz, Iterable<? super T> iterable, Filter<T> filter)
  404. {
  405. return new FilteredIterable<T>(clazz, iterable, filter);
  406. }
  407. public static <T> Iterator<T> filteredIterator(Class<T> clazz, Iterable<? super T> iterable)
  408. {
  409. return filteredIterator(clazz, iterable, null);
  410. }
  411. public static <T> Iterator<T> filteredIterator(Class<T> clazz, Iterable<? super T> iterable, Filter<T> filter)
  412. {
  413. return new FilteredIterator<T>(clazz, iterable, filter);
  414. }
  415. public interface Filter<E>
  416. {
  417. public boolean accept(E element);
  418. }
  419. private static final class FilteredIterable<E> implements Iterable<E>
  420. {
  421. private final Iterable<? super E> _iterable;
  422. private final Filter<E> _filter;
  423. private final Class<E> _clazz;
  424. private FilteredIterable(Class<E> clazz, Iterable<? super E> iterable, Filter<E> filter)
  425. {
  426. _iterable = iterable;
  427. _filter = filter;
  428. _clazz = clazz;
  429. }
  430. @Override
  431. public Iterator<E> iterator()
  432. {
  433. return filteredIterator(_clazz, _iterable, _filter);
  434. }
  435. }
  436. private static final class FilteredIterator<E> implements Iterator<E>
  437. {
  438. private final Iterator<? super E> _iterator;
  439. private final Filter<E> _filter;
  440. private final Class<E> _clazz;
  441. private E _next;
  442. private FilteredIterator(Class<E> clazz, Iterable<? super E> iterable, Filter<E> filter)
  443. {
  444. _iterator = iterable.iterator();
  445. _filter = filter;
  446. _clazz = clazz;
  447. step();
  448. }
  449. @Override
  450. public boolean hasNext()
  451. {
  452. return _next != null;
  453. }
  454. @Override
  455. public E next()
  456. {
  457. if (!hasNext())
  458. throw new NoSuchElementException();
  459. E next = _next;
  460. step();
  461. return next;
  462. }
  463. private void step()
  464. {
  465. while (_iterator.hasNext())
  466. {
  467. Object next = _iterator.next();
  468. if (next == null || !_clazz.isInstance(next))
  469. continue;
  470. if (_filter == null || _filter.accept((E)next))
  471. {
  472. _next = (E)next;
  473. return;
  474. }
  475. }
  476. _next = null;
  477. }
  478. @Override
  479. public void remove()
  480. {
  481. throw new UnsupportedOperationException();
  482. }
  483. }
  484. public static <S, T> Iterable<T> convertingIterable(Iterable<? extends S> iterable, Converter<S, T> converter)
  485. {
  486. return new ConvertingIterable<S, T>(iterable, converter);
  487. }
  488. public static <S, T> Iterator<T> convertingIterator(Iterable<? extends S> iterable, Converter<S, T> converter)
  489. {
  490. return new ConvertingIterator<S, T>(iterable, converter);
  491. }
  492. public interface Converter<S, T>
  493. {
  494. public T convert(S src);
  495. }
  496. private static final class ConvertingIterable<S, T> implements Iterable<T>
  497. {
  498. private final Iterable<? extends S> _iterable;
  499. private final Converter<S, T> _converter;
  500. private ConvertingIterable(Iterable<? extends S> iterable, Converter<S, T> converter)
  501. {
  502. _iterable = iterable;
  503. _converter = converter;
  504. }
  505. @Override
  506. public Iterator<T> iterator()
  507. {
  508. return convertingIterator(_iterable, _converter);
  509. }
  510. }
  511. private static final class ConvertingIterator<S, T> implements Iterator<T>
  512. {
  513. private final Iterator<? extends S> _iterator;
  514. private final Converter<S, T> _converter;
  515. private T _next;
  516. private ConvertingIterator(Iterable<? extends S> iterable, Converter<S, T> converter)
  517. {
  518. _iterator = iterable.iterator();
  519. _converter = converter;
  520. step();
  521. }
  522. @Override
  523. public boolean hasNext()
  524. {
  525. return _next != null;
  526. }
  527. @Override
  528. public T next()
  529. {
  530. if (!hasNext())
  531. throw new NoSuchElementException();
  532. T next = _next;
  533. step();
  534. return next;
  535. }
  536. private void step()
  537. {
  538. while (_iterator.hasNext())
  539. {
  540. S src = _iterator.next();
  541. if (src == null)
  542. continue;
  543. T next = _converter.convert(src);
  544. if (next != null)
  545. {
  546. _next = next;
  547. return;
  548. }
  549. }
  550. _next = null;
  551. }
  552. @Override
  553. public void remove()
  554. {
  555. throw new UnsupportedOperationException();
  556. }
  557. }
  558. public static <T> Iterable<T> concatenatedIterable(Iterable<? extends T> iterable1, Iterable<? extends T> iterable2)
  559. {
  560. return new ConcatenatedIterable<T>(iterable1, iterable2);
  561. }
  562. public static <T> Iterable<T> concatenatedIterable(Iterable<? extends T> iterable1,
  563. Iterable<? extends T> iterable2, Iterable<? extends T> iterable3)
  564. {
  565. return new ConcatenatedIterable<T>(iterable1, iterable2, iterable3);
  566. }
  567. public static <T> Iterable<T> concatenatedIterable(Iterable<? extends T>... iterables)
  568. {
  569. return new ConcatenatedIterable<T>(iterables);
  570. }
  571. public static <T> Iterator<T> concatenatedIterator(Iterable<? extends T> iterable1, Iterable<? extends T> iterable2)
  572. {
  573. return new ConcatenatedIterator<T>(iterable1, iterable2);
  574. }
  575. public static <T> Iterator<T> concatenatedIterator(Iterable<? extends T> iterable1,
  576. Iterable<? extends T> iterable2, Iterable<? extends T> iterable3)
  577. {
  578. return new ConcatenatedIterator<T>(iterable1, iterable2, iterable3);
  579. }
  580. public static <T> Iterator<T> concatenatedIterator(Iterable<? extends T>... iterables)
  581. {
  582. return new ConcatenatedIterator<T>(iterables);
  583. }
  584. private static final class ConcatenatedIterable<E> implements Iterable<E>
  585. {
  586. private final Iterable<? extends E>[] _iterables;
  587. private ConcatenatedIterable(Iterable<? extends E>... iterables)
  588. {
  589. _iterables = iterables;
  590. }
  591. @Override
  592. public Iterator<E> iterator()
  593. {
  594. return concatenatedIterator(_iterables);
  595. }
  596. }
  597. private static final class ConcatenatedIterator<E> implements Iterator<E>
  598. {
  599. private final Iterable<? extends E>[] _iterables;
  600. private Iterator<? extends E> _iterator;
  601. private int _index = -1;
  602. private ConcatenatedIterator(Iterable<? extends E>... iterables)
  603. {
  604. _iterables = iterables;
  605. validateIterator();
  606. }
  607. @Override
  608. public boolean hasNext()
  609. {
  610. validateIterator();
  611. return _iterator != null && _iterator.hasNext();
  612. }
  613. @Override
  614. public E next()
  615. {
  616. if (!hasNext())
  617. throw new NoSuchElementException();
  618. return _iterator.next();
  619. }
  620. private void validateIterator()
  621. {
  622. while (_iterator == null || !_iterator.hasNext())
  623. {
  624. _index++;
  625. if (_index >= _iterables.length)
  626. return;
  627. _iterator = _iterables[_index].iterator();
  628. }
  629. }
  630. @Override
  631. public void remove()
  632. {
  633. throw new UnsupportedOperationException();
  634. }
  635. }
  636. private static final ObjectPool<ArrayList> ARRAY_LISTS = new ObjectPool<ArrayList>() {
  637. @Override
  638. protected void reset(ArrayList list)
  639. {
  640. list.clear();
  641. }
  642. @Override
  643. protected ArrayList create()
  644. {
  645. return new ArrayList();
  646. }
  647. };
  648. private static final ObjectPool<FastList> FAST_LISTS = new ObjectPool<FastList>() {
  649. @Override
  650. protected void reset(FastList list)
  651. {
  652. list.clear();
  653. }
  654. @Override
  655. protected FastList create()
  656. {
  657. return new FastList();
  658. }
  659. };
  660. private static final ObjectPool<L2FastSet> L2_FAST_SETS = new ObjectPool<L2FastSet>() {
  661. @Override
  662. protected void reset(L2FastSet list)
  663. {
  664. list.clear();
  665. }
  666. @Override
  667. protected L2FastSet create()
  668. {
  669. return new L2FastSet();
  670. }
  671. };
  672. public static <T> ArrayList<T> newArrayList()
  673. {
  674. return ARRAY_LISTS.get();
  675. }
  676. public static void recycle(ArrayList arrayList)
  677. {
  678. ARRAY_LISTS.store(arrayList);
  679. }
  680. public static <T> FastList<T> newFastList()
  681. {
  682. return FAST_LISTS.get();
  683. }
  684. public static void recycle(FastList fastList)
  685. {
  686. FAST_LISTS.store(fastList);
  687. }
  688. public static <T> L2FastSet<T> newL2FastSet()
  689. {
  690. return L2_FAST_SETS.get();
  691. }
  692. public static void recycle(L2FastSet l2FastSet)
  693. {
  694. L2_FAST_SETS.store(l2FastSet);
  695. }
  696. public static <T> T random(Collection<? extends T> c)
  697. {
  698. if (c instanceof RandomAccess)
  699. {
  700. final List<? extends T> list = (List<? extends T>)c;
  701. return list.isEmpty() ? null : (T)list.get(Rnd.get(list.size()));
  702. }
  703. else
  704. {
  705. final Object[] array = c.toArray();
  706. return array.length == 0 ? null : (T)array[Rnd.get(array.length)];
  707. }
  708. }
  709. }