001 /*
002 * Java Genetic Algorithm Library (jenetics-3.5.0).
003 * Copyright (c) 2007-2016 Franz Wilhelmstötter
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 *
017 * Author:
018 * Franz Wilhelmstötter (franz.wilhelmstoetter@gmx.at)
019 */
020 package org.jenetics.internal.collection;
021
022 import static java.util.Objects.requireNonNull;
023
024 import java.io.Serializable;
025 import java.util.Iterator;
026 import java.util.ListIterator;
027 import java.util.Spliterator;
028 import java.util.function.Consumer;
029 import java.util.function.Predicate;
030 import java.util.stream.Stream;
031 import java.util.stream.StreamSupport;
032
033 import org.jenetics.util.Seq;
034
035 /**
036 * @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
037 * @since 1.4
038 * @version 3.4
039 */
040 public abstract class ArraySeq<T>
041 implements
042 Seq<T>,
043 Serializable
044 {
045 private static final long serialVersionUID = 1L;
046
047 public final Array<T> array;
048
049 public ArraySeq(final Array<T> array) {
050 this.array = requireNonNull(array, "Array must not be null.");
051 }
052
053 @Override
054 public final T get(final int index) {
055 array.checkIndex(index);
056 return array.get(index);
057 }
058
059 @SuppressWarnings("unchecked")
060 final Array<T> __append(final Iterable<? extends T> values) {
061 requireNonNull(values);
062 return values instanceof ArraySeq<?>
063 ? array.append(((ArraySeq<T>)values).array)
064 : array.append(values);
065 }
066
067 @SuppressWarnings("unchecked")
068 final Array<T> __prepend(final Iterable<? extends T> values) {
069 requireNonNull(values);
070 return values instanceof ArraySeq<?>
071 ? ((ArraySeq<T>)values).array.append(array)
072 : array.prepend(values);
073 }
074
075 @Override
076 public Iterator<T> iterator() {
077 return listIterator();
078 }
079
080 @Override
081 public ListIterator<T> listIterator() {
082 return new ArrayIterator<>(array);
083 }
084
085 @Override
086 public Stream<T> stream() {
087 return StreamSupport.stream(spliterator(), false);
088 }
089
090 @Override
091 public Stream<T> parallelStream() {
092 return StreamSupport.stream(spliterator(), true);
093 }
094
095 @Override
096 public Spliterator<T> spliterator() {
097 return new ArraySpliterator<T>(array);
098 }
099
100 @Override
101 public void forEach(final Consumer<? super T> consumer) {
102 requireNonNull(consumer, "The consumer must not be null.");
103
104 for (int i = 0; i < array.length(); ++i) {
105 consumer.accept(array.get(i));
106 }
107 }
108
109 @Override
110 public boolean forAll(final Predicate<? super T> predicate) {
111 requireNonNull(predicate, "Predicate");
112
113 boolean valid = true;
114 for (int i = 0; i < array.length() && valid; ++i) {
115 valid = predicate.test(array.get(i));
116 }
117 return valid;
118 }
119
120 @Override
121 public int indexWhere(
122 final Predicate<? super T> predicate,
123 final int start,
124 final int end
125 ) {
126 array.checkIndex(start, end);
127 requireNonNull(predicate, "Predicate");
128
129 int index = -1;
130
131 for (int i = start; i < end && index == -1; ++i) {
132 if (predicate.test(array.get(i))) {
133 index = i;
134 }
135 }
136
137 return index;
138 }
139
140 @Override
141 public int lastIndexWhere(
142 final Predicate<? super T> predicate,
143 final int start,
144 final int end
145 ) {
146 array.checkIndex(start, end);
147 requireNonNull(predicate, "Predicate must not be null.");
148
149 int index = -1;
150
151 for (int i = end; --i >= start && index == -1;) {
152 if (predicate.test(array.get(i))) {
153 index = i;
154 }
155 }
156
157 return index;
158 }
159
160 @Override
161 public int length() {
162 return array.length();
163 }
164
165 @Override
166 public String toString() {
167 return toString("[", ",", "]");
168 }
169
170 @Override
171 public int hashCode() {
172 return Seq.hashCode(this);
173 }
174
175 @Override
176 public boolean equals(final Object object) {
177 if (object == this) {
178 return true;
179 }
180 if (!(object instanceof Seq<?>)) {
181 return false;
182 }
183
184 final Seq<?> seq = (Seq<?>)object;
185 return Seq.equals(this, seq);
186 }
187
188 }
|