2 * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.impl.schema.tree;
10 import static com.google.common.base.Verify.verify;
11 import static java.util.Objects.requireNonNull;
13 import java.util.ArrayList;
14 import java.util.Arrays;
15 import java.util.Iterator;
16 import java.util.NoSuchElementException;
17 import java.util.stream.Collector;
18 import org.opendaylight.yangtools.concepts.Immutable;
21 * A vector of values associated with a unique constraint. This is almost an {@link ArrayList}, except it is
24 final class UniqueValues implements Immutable, Iterable<Object> {
25 static final Collector<Object, ?, UniqueValues> COLLECTOR = Collector.of(ArrayList::new, ArrayList::add,
30 list -> new UniqueValues(list.toArray()));
32 private final Object[] objects;
33 private final int hashCode;
35 private UniqueValues(final Object[] objects) {
36 verify(objects.length != 0);
37 this.objects = objects;
38 this.hashCode = Arrays.deepHashCode(objects);
42 public Iterator<Object> iterator() {
43 return new Itr(objects);
47 public int hashCode() {
52 public boolean equals(final Object obj) {
53 return this == obj || obj instanceof UniqueValues && Arrays.deepEquals(objects, ((UniqueValues) obj).objects);
57 public String toString() {
58 return toString(objects);
61 private static String toString(final Object[] objects) {
62 final StringBuilder sb = new StringBuilder();
63 sb.append('[').append(BinaryValue.wrapToString(objects[0]));
64 for (int i = 1; i < objects.length; ++i) {
65 sb.append(", ").append(BinaryValue.wrapToString(objects[i]));
67 return sb.append(']').toString();
70 private static final class Itr implements Iterator<Object> {
71 private final Object[] objects;
73 private int offset = 0;
75 Itr(final Object[] objects) {
76 this.objects = requireNonNull(objects);
80 public boolean hasNext() {
81 return offset < objects.length;
85 public Object next() {
87 if (local >= objects.length) {
88 throw new NoSuchElementException();
91 return objects[local];