001 /*
002 * Copyright (c) Andrey Kuznetsov. All Rights Reserved.
003 *
004 * Redistribution and use in source and binary forms, with or without
005 * modification, are permitted provided that the following conditions are met:
006 *
007 * o Redistributions of source code must retain the above copyright notice,
008 * this list of conditions and the following disclaimer.
009 *
010 * o Redistributions in binary form must reproduce the above copyright notice,
011 * this list of conditions and the following disclaimer in the documentation
012 * and/or other materials provided with the distribution.
013 *
014 * o Neither the name of imagero Andrey Kuznetsov nor the names of
015 * its contributors may be used to endorse or promote products derived
016 * from this software without specific prior written permission.
017 *
018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029 */
030
031 package com.imagero.util;
032
033
034
035 /**
036 * OpenVector is rather an array with some check and management functions.
037 * Use on own risk!
038 */
039 public class OpenVector {
040
041 private Object[] elements;
042
043 int startSize;
044
045
046 public OpenVector() {
047 this(3);
048 }
049
050 public OpenVector(int size) {
051 this.startSize = size;
052 this.elements = create();
053 }
054
055 public int indexOf(Object o) {
056 if (o != null) {
057 for (int i = 0; i < elements.length; i++) {
058 if (elements[i] != null && elements[i].equals(o)) {
059 return i;
060 }
061 }
062 }
063 return -1;
064 }
065
066 public boolean contains(Object o) {
067 return indexOf(o) >= 0;
068 }
069
070 public boolean remove(Object o) {
071 int index = indexOf(o);
072 if (index >= 0) {
073 elements[index] = null;
074 }
075 return index >= 0;
076 }
077
078 public Object [] checkSize(int minSize) {
079 if (minSize > elements.length) {
080 Object oldData[] = elements;
081 elements = create((int) Math.max(minSize + 10, elements.length + Math.sqrt(elements.length)));
082 System.arraycopy(oldData, 0, elements, 0, elements.length);
083 }
084 return elements;
085 }
086
087 public int getCount(Class c) {
088 int count = 0;
089 for (int i = 0; i < elements.length; i++) {
090 if (c.isInstance(elements[i])) {
091 count++;
092 }
093 }
094 return count;
095 }
096
097 /**
098 * OpenVector allows direct access to its elements array.
099 * Use on own risc - e.g. use it only for reading, don't change anything in this array!
100 */
101 public Object[] getElements() {
102 return elements;
103 }
104
105 public Object [] clear() {
106 elements = create();
107 return elements;
108 }
109
110 protected Object[] create() {
111 return new Object[startSize];
112 }
113
114 protected Object[] create(int size) {
115 return new Object[size];
116 }
117 }