2 * Copyright (c) 2015 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.data.api;
10 import static com.google.common.base.Verify.verify;
11 import static java.util.Objects.requireNonNull;
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;
19 final class StackedPathArguments extends PathArgumentList {
20 private final List<PathArgument> base;
21 private final List<PathArgument> stack;
23 StackedPathArguments(final @NonNull YangInstanceIdentifier base, final @NonNull List<PathArgument> stack) {
24 verify(!stack.isEmpty());
25 this.base = base.getPathArguments();
31 return stack.size() + base.size();
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);
42 public PathArgument get(final int index) {
43 if (index < base.size()) {
44 return base.get(index);
46 return stack.get(index - base.size());
50 @SuppressWarnings("checkstyle:parameterName")
51 public int indexOf(final Object o) {
52 final PathArgument srch = (PathArgument) requireNonNull(o);
54 int ret = base.indexOf(srch);
56 ret = stack.indexOf(srch);
58 return base.size() + ret;
65 @SuppressWarnings("checkstyle:parameterName")
66 public int lastIndexOf(final Object o) {
67 final PathArgument srch = (PathArgument) requireNonNull(o);
69 final int ret = stack.lastIndexOf(srch);
71 return base.size() + ret;
74 return base.lastIndexOf(srch);
78 public UnmodifiableIterator<PathArgument> iterator() {
79 return new IteratorImpl(base, stack);
82 private static final class IteratorImpl extends UnmodifiableIterator<PathArgument> {
83 private final Iterator<PathArgument> stack;
84 private final Iterator<PathArgument> base;
86 IteratorImpl(final Iterable<PathArgument> base, final Iterable<PathArgument> stack) {
87 this.base = base.iterator();
88 this.stack = stack.iterator();
92 public boolean hasNext() {
93 return stack.hasNext();
97 public PathArgument next() {