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.util.Collections;
025 import java.util.Iterator;
026 import java.util.List;
027 import java.util.ListIterator;
028 import java.util.Spliterator;
029 import java.util.Spliterators;
030 import java.util.function.Function;
031 import java.util.stream.Stream;
032
033 import org.jenetics.internal.util.require;
034
035 import org.jenetics.util.ISeq;
036 import org.jenetics.util.MSeq;
037
038 /**
039 * Contains static {@code Seq} definitions.
040 *
041 * @author <a href="mailto:franz.wilhelmstoetter@gmx.at">Franz Wilhelmstötter</a>
042 * @version 3.4
043 * @since 3.4
044 */
045 public final class Empty {
046
047 private Empty() {require.noInstance();}
048
049 /**
050 * Empty {@code MSeq} implementation.
051 */
052 public static final MSeq<Object> MSEQ = new MSeq<Object>() {
053
054 @Override
055 public void set(final int index, final Object value) {
056 throw new ArrayIndexOutOfBoundsException("MSeq is empty.");
057 }
058
059 @Override
060 public ListIterator<Object> listIterator() {
061 return asList().listIterator();
062 }
063
064 @Override
065 public MSeq<Object> subSeq(final int start, final int end) {
066 throw new ArrayIndexOutOfBoundsException("MSeq is empty.");
067 }
068
069 @Override
070 public MSeq<Object> subSeq(final int start) {
071 throw new ArrayIndexOutOfBoundsException("MSeq is empty.");
072 }
073
074 @Override
075 public <B> MSeq<B> map(final Function<? super Object, ? extends B> mapper) {
076 requireNonNull(mapper);
077 return mseq();
078 }
079
080 @Override
081 public MSeq<Object> append(final Object... values) {
082 return MSeq.of(values);
083 }
084
085 @Override
086 public MSeq<Object> append(final Iterable<?> values) {
087 return MSeq.of(values);
088 }
089
090 @Override
091 public MSeq<Object> prepend(final Object... values) {
092 return MSeq.of(values);
093 }
094
095 @Override
096 public MSeq<Object> prepend(final Iterable<?> values) {
097 return MSeq.of(values);
098 }
099
100 @Override
101 public Stream<Object> stream() {
102 return Stream.empty();
103 }
104
105 @Override
106 public Stream<Object> parallelStream() {
107 return Stream.empty();
108 }
109
110 @Override
111 public Spliterator<Object> spliterator() {
112 return Spliterators.emptySpliterator();
113 }
114
115 @Override
116 public ISeq<Object> toISeq() {
117 return ISEQ;
118 }
119
120 @Override
121 public MSeq<Object> copy() {
122 return this;
123 }
124
125 @Override
126 public Object get(final int index) {
127 throw new ArrayIndexOutOfBoundsException("MSeq is empty.");
128 }
129
130 @Override
131 public int length() {
132 return 0;
133 }
134
135 @Override
136 public List<Object> asList() {
137 return Collections.emptyList();
138 }
139
140 @Override
141 public Iterator<Object> iterator() {
142 return asList().iterator();
143 }
144
145 };
146
147
148 /**
149 * Empty {@code ISeq} implementation.
150 */
151 public static final ISeq<Object> ISEQ = new ISeq<Object>() {
152
153 @Override
154 public Iterator<Object> iterator() {
155 return asList().iterator();
156 }
157
158 @Override
159 public ISeq<Object> subSeq(final int start, final int end) {
160 throw new ArrayIndexOutOfBoundsException("ISeq is empty.");
161 }
162
163 @Override
164 public ISeq<Object> subSeq(final int start) {
165 throw new ArrayIndexOutOfBoundsException("ISeq is empty.");
166 }
167
168 @Override
169 public Object get(final int index) {
170 throw new ArrayIndexOutOfBoundsException("ISeq is empty.");
171 }
172
173 @Override
174 public int length() {
175 return 0;
176 }
177
178 @Override
179 public List<Object> asList() {
180 return Collections.emptyList();
181 }
182
183 @Override
184 public <B> ISeq<B> map(final Function<? super Object, ? extends B> mapper) {
185 requireNonNull(mapper);
186 return iseq();
187 }
188
189 @Override
190 public ISeq<Object> append(final Object... values) {
191 return ISeq.of(values);
192 }
193
194 @Override
195 public ISeq<Object> append(final Iterable<?> values) {
196 return ISeq.of(values);
197 }
198
199 @Override
200 public ISeq<Object> prepend(final Object... values) {
201 return ISeq.of(values);
202 }
203
204 @Override
205 public ISeq<Object> prepend(final Iterable<?> values) {
206 return ISeq.of(values);
207 }
208
209 @Override
210 public Stream<Object> stream() {
211 return Stream.empty();
212 }
213
214 @Override
215 public Stream<Object> parallelStream() {
216 return Stream.empty();
217 }
218
219 @Override
220 public Spliterator<Object> spliterator() {
221 return Spliterators.emptySpliterator();
222 }
223
224 @Override
225 public MSeq<Object> copy() {
226 return MSEQ;
227 }
228
229 };
230
231 @SuppressWarnings("unchecked")
232 public static <T> MSeq<T> mseq() {
233 return (MSeq<T>)MSEQ;
234 }
235
236 @SuppressWarnings("unchecked")
237 public static <T> ISeq<T> iseq() {
238 return (ISeq<T>)ISEQ;
239 }
240
241 }
|