/* * Copyright 2015 Terracotta, Inc., a Software AG company. * * 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 org.terracotta.offheapstore.util; import org.terracotta.offheapstore.storage.SplitStorageEngine; import org.terracotta.offheapstore.storage.StorageEngine; public interface Generator { public interface SpecialInteger { int value(); } SpecialInteger generate(int i); StorageEngine<SpecialInteger, SpecialInteger> engine(); Factory<StorageEngine<SpecialInteger, SpecialInteger>> factory(); public static final Generator GOOD_GENERATOR = new Generator() { @Override public String toString() { return "GoodGenerator"; } @Override public SpecialInteger generate(final int i) { return new GoodInteger(i); } @Override public Factory<StorageEngine<SpecialInteger, SpecialInteger>> factory() { return new Factory<StorageEngine<SpecialInteger, SpecialInteger>>() { @Override public StorageEngine<SpecialInteger, SpecialInteger> newInstance() { return engine(); } }; } @Override public StorageEngine engine() { return new StorageEngine<SpecialInteger, SpecialInteger>() { @Override public void clear() { //no-op } @Override public Long writeMapping(SpecialInteger key, SpecialInteger value, int hash, int metadata) { return SplitStorageEngine.encoding(key.value(), value.value()); } @Override public void attachedMapping(long encoding, int hash, int metadata) { //no-op } @Override public void freeMapping(long encoding, int hash, boolean removal) { //no-op } @Override public SpecialInteger readValue(long encoding) { return new GoodInteger(SplitStorageEngine.valueEncoding(encoding)); } @Override public boolean equalsValue(Object value, long encoding) { return (value instanceof GoodInteger) && ((GoodInteger) value).value() == SplitStorageEngine.valueEncoding(encoding); } @Override public SpecialInteger readKey(long encoding, int hashCode) { return new GoodInteger(SplitStorageEngine.keyEncoding(encoding)); } @Override public boolean equalsKey(Object key, long encoding) { return (key instanceof GoodInteger) && ((GoodInteger) key).value() == SplitStorageEngine.keyEncoding(encoding); } @Override public long getAllocatedMemory() { return 0; } @Override public long getOccupiedMemory() { return 0; } @Override public long getVitalMemory() { return 0; } @Override public long getDataSize() { return 0; } @Override public void invalidateCache() { //no-op } @Override public void bind(Owner owner) { //no-op } @Override public void destroy() { //no-op } @Override public boolean shrink() { return false; } }; } }; public static final Generator BAD_GENERATOR = new Generator() { @Override public String toString() { return "BadGenerator"; } @Override public SpecialInteger generate(final int i) { return new BadInteger(i); } @Override public Factory<StorageEngine<SpecialInteger, SpecialInteger>> factory() { return new Factory<StorageEngine<SpecialInteger, SpecialInteger>>() { @Override public StorageEngine<SpecialInteger, SpecialInteger> newInstance() { return engine(); } }; } @Override public StorageEngine engine() { return new StorageEngine<SpecialInteger, SpecialInteger>() { @Override public void clear() { //no-op } @Override public Long writeMapping(SpecialInteger key, SpecialInteger value, int hash, int metadata) { return SplitStorageEngine.encoding(key.value(), value.value()); } @Override public void attachedMapping(long encoding, int hash, int metadata) { //no-op } @Override public void freeMapping(long encoding, int hash, boolean removal) { //no-op } @Override public SpecialInteger readValue(long encoding) { return new BadInteger(SplitStorageEngine.valueEncoding(encoding)); } @Override public boolean equalsValue(Object value, long encoding) { return (value instanceof BadInteger) && ((BadInteger) value).value() == SplitStorageEngine.valueEncoding(encoding); } @Override public SpecialInteger readKey(long encoding, int hashCode) { return new BadInteger(SplitStorageEngine.keyEncoding(encoding)); } @Override public boolean equalsKey(Object key, long encoding) { return (key instanceof BadInteger) && ((BadInteger) key).value() == SplitStorageEngine.keyEncoding(encoding); } @Override public long getAllocatedMemory() { return 0; } @Override public long getOccupiedMemory() { return 0; } @Override public long getVitalMemory() { return 0; } @Override public long getDataSize() { return 0; } @Override public void invalidateCache() { //no-op } @Override public void bind(Owner owner) { //no-op } @Override public void destroy() { //no-op } @Override public boolean shrink() { return false; } }; } }; public static final Factory<StorageEngine<SpecialInteger, SpecialInteger>> BAD_FACTORY = new Factory<StorageEngine<SpecialInteger, SpecialInteger>>() { @Override public StorageEngine<SpecialInteger, SpecialInteger> newInstance() { return BAD_GENERATOR.engine(); } }; static class GoodInteger implements SpecialInteger { private final int n; GoodInteger(int i) { this.n = i; } @Override public int hashCode() { return n; } @Override public boolean equals(Object o) { if (o instanceof GoodInteger) { return ((GoodInteger) o).n == n; } else { return false; } } @Override public int value() { return n; } } public static class BadInteger implements SpecialInteger { public static final int HASHCODE = 42; private final int n; BadInteger(int i) { this.n = i; } @Override public int hashCode() { return HASHCODE; } @Override public boolean equals(Object o) { if (o instanceof BadInteger) { return ((BadInteger) o).n == n; } else { return false; } } @Override public int value() { return n; } } }