2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.parser.stmt.reactor;
10 import com.google.common.base.Preconditions;
11 import java.util.Arrays;
12 import javax.annotation.Nonnull;
15 * Simple integer-to-StatementContextBase map optimized for size and restricted in scope of operations.
17 * @author Robert Varga
19 abstract class StatementMap {
20 private static final class Empty extends StatementMap {
22 StatementContextBase<?, ?, ?> get(final int index) {
27 StatementMap put(final int index, final StatementContextBase<?, ?, ?> object) {
28 return index == 0 ? new Singleton(object) : new Regular(index, object);
32 private static final class Regular extends StatementMap {
33 private StatementContextBase<?, ?, ?>[] elements;
35 Regular(final int index, final StatementContextBase<?, ?, ?> object) {
36 elements = new StatementContextBase<?, ?, ?>[index + 1];
37 elements[index] = Preconditions.checkNotNull(object);
40 Regular(final StatementContextBase<?, ?, ?> object0, final int index,
41 final StatementContextBase<?, ?, ?> object) {
42 elements = new StatementContextBase<?, ?, ?>[index + 1];
43 elements[0] = Preconditions.checkNotNull(object0);
44 elements[index] = Preconditions.checkNotNull(object);
48 StatementContextBase<?, ?, ?> get(final int index) {
49 if (index >= elements.length) {
53 return elements[index];
57 StatementMap put(final int index, final StatementContextBase<?, ?, ?> object) {
58 if (index < elements.length) {
59 Preconditions.checkArgument(elements[index] == null);
61 elements = Arrays.copyOf(elements, index + 1);
64 elements[index] = Preconditions.checkNotNull(object);
69 private static final class Singleton extends StatementMap {
70 private final StatementContextBase<?, ?, ?> object;
72 Singleton(final StatementContextBase<?, ?, ?> object) {
73 this.object = Preconditions.checkNotNull(object);
77 StatementContextBase<?, ?, ?> get(final int index) {
78 return index == 0 ? object : null;
82 StatementMap put(final int index, final StatementContextBase<?, ?, ?> object) {
83 Preconditions.checkArgument(index != 0);
84 return new Regular(this.object, index, object);
88 private static final StatementMap EMPTY = new Empty();
90 static StatementMap empty() {
94 abstract StatementContextBase<?, ?, ?> get(int index);
95 abstract @Nonnull StatementMap put(int index, @Nonnull StatementContextBase<?, ?, ?> object);