/*
* Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
*
* Licensed 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 com.hazelcast.internal.util.collection;
import com.hazelcast.internal.memory.MemoryManager;
import com.hazelcast.internal.util.hashslot.HashSlotArray8byteKey;
import com.hazelcast.internal.util.hashslot.HashSlotCursor8byteKey;
import com.hazelcast.internal.util.hashslot.impl.HashSlotArray8byteKeyNoValue;
import static com.hazelcast.internal.memory.MemoryAllocator.NULL_ADDRESS;
import static com.hazelcast.internal.util.hashslot.impl.CapacityUtil.DEFAULT_CAPACITY;
import static com.hazelcast.internal.util.hashslot.impl.CapacityUtil.DEFAULT_LOAD_FACTOR;
/**
* {@link LongSet} implementation based on {@link HashSlotArray8byteKey}.
*/
public class LongSetHsa implements LongSet {
private final long nullValue;
private final HashSlotArray8byteKey hsa;
public LongSetHsa(long nullValue, MemoryManager memMgr) {
this(nullValue, memMgr, DEFAULT_CAPACITY, DEFAULT_LOAD_FACTOR);
}
public LongSetHsa(long nullValue, MemoryManager memMgr, int initialCapacity, float loadFactor) {
this.nullValue = nullValue;
this.hsa = new HashSlotArray8byteKeyNoValue(nullValue, memMgr, initialCapacity, loadFactor);
hsa.gotoNew();
}
@Override
public boolean add(long value) {
assert value != nullValue : "add() called with null-sentinel value " + nullValue;
return hsa.ensure(value) > 0;
}
@Override
public boolean remove(long value) {
assert value != nullValue : "remove() called with null-sentinel value " + nullValue;
return hsa.remove(value);
}
@Override
public boolean contains(long value) {
assert value != nullValue : "contains() called with null-sentinel value " + nullValue;
return hsa.get(value) != NULL_ADDRESS;
}
@Override
public long size() {
return hsa.size();
}
@Override
public boolean isEmpty() {
return size() == 0;
}
@Override
public void clear() {
hsa.clear();
}
@Override
public LongCursor cursor() {
assert hsa.address() >= 0 : "cursor() called on a disposed map";
return new Cursor();
}
@Override
public void dispose() {
hsa.dispose();
}
private final class Cursor implements LongCursor {
private final HashSlotCursor8byteKey hsaCursor = hsa.cursor();
@Override
public boolean advance() {
return hsaCursor.advance();
}
@Override
public long value() {
return hsaCursor.key();
}
@Override
public void reset() {
hsaCursor.reset();
}
}
}