/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.flink.graph.types.valuearray; import org.apache.flink.core.memory.DataInputView; import org.apache.flink.core.memory.DataOutputView; import org.apache.flink.core.memory.MemorySegment; import org.apache.flink.types.IntValue; import org.apache.flink.types.NullValue; import java.io.IOException; import java.util.Iterator; /** * An array of {@link NullValue}. */ public class NullValueArray implements ValueArray<NullValue> { // the number of elements currently stored private int position; // location of the bookmark used by mark() and reset() private transient int mark; // hash result stored as normalized key private IntValue hashValue = new IntValue(); /** * Initializes an expandable array with default capacity. */ public NullValueArray() { } /** * Initializes a fixed-size array with the provided number of bytes. * * @param bytes number of bytes of the encapsulated array */ public NullValueArray(int bytes) { this(); } // -------------------------------------------------------------------------------------------- @Override public String toString() { StringBuilder sb = new StringBuilder("["); for (int idx = 0 ; idx < this.position ; idx++) { sb.append("∅"); if (idx < position - 1) { sb.append(","); } } sb.append("]"); return sb.toString(); } // -------------------------------------------------------------------------------------------- // Iterable // -------------------------------------------------------------------------------------------- private final ReadIterator iterator = new ReadIterator(); @Override public Iterator<NullValue> iterator() { iterator.reset(); return iterator; } private class ReadIterator implements Iterator<NullValue> { private int pos; @Override public boolean hasNext() { return pos < position; } @Override public NullValue next() { pos++; return NullValue.getInstance(); } @Override public void remove() { throw new UnsupportedOperationException("remove"); } public void reset() { pos = 0; } } // -------------------------------------------------------------------------------------------- // IOReadableWritable // -------------------------------------------------------------------------------------------- @Override public void write(DataOutputView out) throws IOException { out.writeInt(position); } @Override public void read(DataInputView in) throws IOException { position = in.readInt(); mark = 0; } // -------------------------------------------------------------------------------------------- // NormalizableKey // -------------------------------------------------------------------------------------------- @Override public int getMaxNormalizedKeyLen() { return hashValue.getMaxNormalizedKeyLen(); } @Override public void copyNormalizedKey(MemorySegment target, int offset, int len) { hashValue.setValue(position); hashValue.copyNormalizedKey(target, offset, len); } // -------------------------------------------------------------------------------------------- // Comparable // -------------------------------------------------------------------------------------------- @Override public int compareTo(ValueArray<NullValue> o) { NullValueArray other = (NullValueArray) o; return Integer.compare(position, other.position); } // -------------------------------------------------------------------------------------------- // Key // -------------------------------------------------------------------------------------------- @Override public int hashCode() { return position; } @Override public boolean equals(Object obj) { if (obj instanceof NullValueArray) { NullValueArray other = (NullValueArray) obj; return position == other.position; } return false; } // -------------------------------------------------------------------------------------------- // ResettableValue // -------------------------------------------------------------------------------------------- @Override public void setValue(ValueArray<NullValue> value) { value.copyTo(this); } // -------------------------------------------------------------------------------------------- // CopyableValue // -------------------------------------------------------------------------------------------- @Override public int getBinaryLength() { return hashValue.getBinaryLength(); } @Override public void copyTo(ValueArray<NullValue> target) { NullValueArray other = (NullValueArray) target; other.position = position; } @Override public ValueArray<NullValue> copy() { ValueArray<NullValue> copy = new NullValueArray(); this.copyTo(copy); return copy; } @Override public void copy(DataInputView source, DataOutputView target) throws IOException { target.write(source, getBinaryLength()); } // -------------------------------------------------------------------------------------------- // ValueArray // -------------------------------------------------------------------------------------------- @Override public int size() { return position; } @Override public boolean isFull() { return position == Integer.MAX_VALUE; } @Override public boolean add(NullValue value) { if (position == Integer.MAX_VALUE) { return false; } position++; return true; } @Override public boolean addAll(ValueArray<NullValue> other) { NullValueArray source = (NullValueArray) other; long newPosition = position + (long) source.position; if (newPosition > Integer.MAX_VALUE) { return false; } position = (int) newPosition; return true; } @Override public void clear() { position = 0; } @Override public void mark() { mark = position; } @Override public void reset() { position = mark; } }