BUG-3263: return a List of PathArguments
[yangtools.git] / yang / 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  * This program and the accompanying materials are made available under the
4  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
5  * and is available at http://www.eclipse.org/legal/epl-v10.html
6  */
7 package org.opendaylight.yangtools.yang.data.api;
8
9 import com.google.common.base.Preconditions;
10 import com.google.common.collect.UnmodifiableIterator;
11 import java.util.Iterator;
12 import java.util.List;
13 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
14
15 final class StackedPathArguments extends PathArgumentList {
16     private final List<PathArgument> base;
17     private final List<PathArgument> stack;
18
19     public StackedPathArguments(final YangInstanceIdentifier base, final List<PathArgument> stack) {
20         this.base = base.getPathArguments();
21         this.stack = Preconditions.checkNotNull(stack);
22     }
23
24     @Override
25     public int size() {
26         return stack.size() + base.size();
27     }
28
29     @Override
30     public boolean contains(final Object o) {
31         final PathArgument srch = (PathArgument) Preconditions.checkNotNull(o);
32         return stack.contains(srch) || base.contains(srch);
33     }
34
35     @Override
36     public final PathArgument get(final int index) {
37         if (index < base.size()) {
38             return base.get(index);
39         } else {
40             return stack.get(index - base.size());
41         }
42     }
43
44     @Override
45     public final int indexOf(final Object o) {
46         final PathArgument srch = (PathArgument) Preconditions.checkNotNull(o);
47
48         int ret = base.indexOf(srch);
49         if (ret == -1) {
50             ret = stack.indexOf(srch);
51             if (ret != -1) {
52                 return base.size() + ret;
53             }
54         }
55         return ret;
56     }
57
58     @Override
59     public final int lastIndexOf(final Object o) {
60         final PathArgument srch = (PathArgument) Preconditions.checkNotNull(o);
61
62         final int ret = stack.lastIndexOf(srch);
63         if (ret != -1) {
64             return base.size() + ret;
65         }
66
67         return base.lastIndexOf(srch);
68     }
69
70     @Override
71     public UnmodifiableIterator<PathArgument> iterator() {
72         return new IteratorImpl(base, stack);
73     }
74
75     private static final class IteratorImpl extends UnmodifiableIterator<PathArgument> {
76         private final Iterator<PathArgument> stack;
77         private final Iterator<PathArgument> base;
78
79         IteratorImpl(final Iterable<PathArgument> base, final Iterable<PathArgument> stack) {
80             this.base = base.iterator();
81             this.stack = stack.iterator();
82         }
83
84         @Override
85         public boolean hasNext() {
86             return stack.hasNext();
87         }
88
89         @Override
90         public PathArgument next() {
91             if (base.hasNext()) {
92                 return base.next();
93             }
94             return stack.next();
95         }
96     }
97 }