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 com.google.common.base.Preconditions;
11 import com.google.common.base.Verify;
12 import com.google.common.collect.UnmodifiableIterator;
13 import java.util.Iterator;
14 import java.util.List;
15 import javax.annotation.Nonnull;
16 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
18 final class StackedPathArguments extends PathArgumentList {
19 private final List<PathArgument> base;
20 private final List<PathArgument> stack;
22 public StackedPathArguments(@Nonnull final YangInstanceIdentifier base, @Nonnull final List<PathArgument> stack) {
23 Verify.verify(!stack.isEmpty());
24 this.base = base.getPathArguments();
30 return stack.size() + base.size();
34 public boolean contains(final Object o) {
35 final PathArgument srch = (PathArgument) Preconditions.checkNotNull(o);
36 return stack.contains(srch) || base.contains(srch);
40 public PathArgument get(final int index) {
41 if (index < base.size()) {
42 return base.get(index);
44 return stack.get(index - base.size());
49 public int indexOf(final Object o) {
50 final PathArgument srch = (PathArgument) Preconditions.checkNotNull(o);
52 int ret = base.indexOf(srch);
54 ret = stack.indexOf(srch);
56 return base.size() + ret;
63 public int lastIndexOf(final Object o) {
64 final PathArgument srch = (PathArgument) Preconditions.checkNotNull(o);
66 final int ret = stack.lastIndexOf(srch);
68 return base.size() + ret;
71 return base.lastIndexOf(srch);
75 public UnmodifiableIterator<PathArgument> iterator() {
76 return new IteratorImpl(base, stack);
79 private static final class IteratorImpl extends UnmodifiableIterator<PathArgument> {
80 private final Iterator<PathArgument> stack;
81 private final Iterator<PathArgument> base;
83 IteratorImpl(final Iterable<PathArgument> base, final Iterable<PathArgument> stack) {
84 this.base = base.iterator();
85 this.stack = stack.iterator();
89 public boolean hasNext() {
90 return stack.hasNext();
94 public PathArgument next() {