Populate data/ hierarchy
[yangtools.git] / data / yang-data-api / src / main / java / org / opendaylight / yangtools / yang / data / api / StackedPathArguments.java
1 /*
2  * Copyright (c) 2015 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.data.api;
9
10 import static com.google.common.base.Verify.verify;
11 import static java.util.Objects.requireNonNull;
12
13 import com.google.common.collect.UnmodifiableIterator;
14 import java.util.Iterator;
15 import java.util.List;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
18
19 final class StackedPathArguments extends PathArgumentList {
20     private final List<PathArgument> base;
21     private final List<PathArgument> stack;
22
23     StackedPathArguments(final @NonNull YangInstanceIdentifier base, final @NonNull List<PathArgument> stack) {
24         verify(!stack.isEmpty());
25         this.base = base.getPathArguments();
26         this.stack = stack;
27     }
28
29     @Override
30     public int size() {
31         return stack.size() + base.size();
32     }
33
34     @Override
35     @SuppressWarnings("checkstyle:parameterName")
36     public boolean contains(final Object o) {
37         final PathArgument srch = (PathArgument) requireNonNull(o);
38         return stack.contains(srch) || base.contains(srch);
39     }
40
41     @Override
42     public PathArgument get(final int index) {
43         if (index < base.size()) {
44             return base.get(index);
45         }
46         return stack.get(index - base.size());
47     }
48
49     @Override
50     @SuppressWarnings("checkstyle:parameterName")
51     public int indexOf(final Object o) {
52         final PathArgument srch = (PathArgument) requireNonNull(o);
53
54         int ret = base.indexOf(srch);
55         if (ret == -1) {
56             ret = stack.indexOf(srch);
57             if (ret != -1) {
58                 return base.size() + ret;
59             }
60         }
61         return ret;
62     }
63
64     @Override
65     @SuppressWarnings("checkstyle:parameterName")
66     public int lastIndexOf(final Object o) {
67         final PathArgument srch = (PathArgument) requireNonNull(o);
68
69         final int ret = stack.lastIndexOf(srch);
70         if (ret != -1) {
71             return base.size() + ret;
72         }
73
74         return base.lastIndexOf(srch);
75     }
76
77     @Override
78     public UnmodifiableIterator<PathArgument> iterator() {
79         return new IteratorImpl(base, stack);
80     }
81
82     private static final class IteratorImpl extends UnmodifiableIterator<PathArgument> {
83         private final Iterator<PathArgument> stack;
84         private final Iterator<PathArgument> base;
85
86         IteratorImpl(final Iterable<PathArgument> base, final Iterable<PathArgument> stack) {
87             this.base = base.iterator();
88             this.stack = stack.iterator();
89         }
90
91         @Override
92         public boolean hasNext() {
93             return stack.hasNext();
94         }
95
96         @Override
97         public PathArgument next() {
98             if (base.hasNext()) {
99                 return base.next();
100             }
101             return stack.next();
102         }
103     }
104 }