BUG-5717: add unique child identifier
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / StatementMap.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.parser.stmt.reactor;
9
10 import com.google.common.base.Preconditions;
11 import java.util.Arrays;
12 import javax.annotation.Nonnull;
13
14 /**
15  * Simple integer-to-StatementContextBase map optimized for size and restricted in scope of operations.
16  *
17  * @author Robert Varga
18  */
19 abstract class StatementMap {
20     private static final class Empty extends StatementMap {
21         @Override
22         StatementContextBase<?, ?, ?> get(final int index) {
23             return null;
24         }
25
26         @Override
27         StatementMap put(final int index, final StatementContextBase<?, ?, ?> object) {
28             return index == 0 ? new Singleton(object) : new Regular(index, object);
29         }
30     }
31
32     private static final class Regular extends StatementMap {
33         private StatementContextBase<?, ?, ?>[] elements;
34
35         Regular(final int index, final StatementContextBase<?, ?, ?> object) {
36             elements = new StatementContextBase<?, ?, ?>[index + 1];
37             elements[index] = Preconditions.checkNotNull(object);
38         }
39
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);
45         }
46
47         @Override
48         StatementContextBase<?, ?, ?> get(final int index) {
49             if (index >= elements.length) {
50                 return null;
51             }
52
53             return elements[index];
54         }
55
56         @Override
57         StatementMap put(final int index, final StatementContextBase<?, ?, ?> object) {
58             if (index < elements.length) {
59                 Preconditions.checkArgument(elements[index] == null);
60             } else {
61                 elements = Arrays.copyOf(elements, index + 1);
62             }
63
64             elements[index] = Preconditions.checkNotNull(object);
65             return this;
66         }
67     }
68
69     private static final class Singleton extends StatementMap {
70         private final StatementContextBase<?, ?, ?> object;
71
72         Singleton(final StatementContextBase<?, ?, ?> object) {
73             this.object = Preconditions.checkNotNull(object);
74         }
75
76         @Override
77         StatementContextBase<?, ?, ?> get(final int index) {
78             return index == 0 ? object : null;
79         }
80
81         @Override
82         StatementMap put(final int index, final StatementContextBase<?, ?, ?> object) {
83             Preconditions.checkArgument(index != 0);
84             return new Regular(this.object, index, object);
85         }
86     }
87
88     private static final StatementMap EMPTY = new Empty();
89
90     static StatementMap empty() {
91         return EMPTY;
92     }
93
94     abstract StatementContextBase<?, ?, ?> get(int index);
95     abstract @Nonnull StatementMap put(int index, @Nonnull StatementContextBase<?, ?, ?> object);
96 }