/* * Copyright (C) 2015, 2016 higherfrequencytrading.com * Copyright (C) 2016 Roman Leventov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package net.openhft.chronicle.values; import com.squareup.javapoet.MethodSpec; import sun.misc.Unsafe; import java.util.Objects; import static java.lang.String.format; class ObjectHeapMemberGenerator extends HeapMemberGenerator { ObjectHeapMemberGenerator(FieldModel fieldModel) { super(fieldModel); } @Override String putVolatile() { return "putVolatileObject"; } @Override String putOrdered() { return "putOrderedObject"; } @Override String compareAndSwap() { return "compareAndSwapObject"; } @Override String arrayBase() { return "ARRAY_OBJECT_BASE_OFFSET"; } @Override String arrayScale() { return "ARRAY_OBJECT_INDEX_SCALE"; } @Override String wrap( ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder, String rawStoredValue) { return rawStoredValue; } @Override String unwrap(MethodSpec.Builder methodBuilder, String inputValue) { return inputValue; } @Override public void generateGetVolatile(ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { methodBuilder.addStatement("return ($T) $N.getObjectVolatile(this, $N)", fieldModel.type, valueBuilder.unsafe(), fieldOffset(valueBuilder)); } @Override public void generateArrayElementGetVolatile( ArrayFieldModel arrayFieldModel, ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { arrayFieldModel.checkBounds(methodBuilder); methodBuilder.addStatement("return ($T) $N.getObjectVolatile($N, " + "(long) $T.ARRAY_OBJECT_BASE_OFFSET + " + "(index * (long) $T.ARRAY_OBJECT_INDEX_SCALE))", fieldModel.type, valueBuilder.unsafe(), field, Unsafe.class, Unsafe.class); } @Override void generateEquals(ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { methodBuilder.addCode("if (!$T.equals($N, other.$N())) return false;\n", Objects.class, field, fieldModel.getOrGetVolatile().getName()); } @Override void generateArrayElementEquals( ArrayFieldModel arrayFieldModel, ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { methodBuilder.addCode("if (!$T.equals($N[index], other.$N(index))) return false;\n", Objects.class, field, arrayFieldModel.getOrGetVolatile().getName()); } @Override String generateHashCode(ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { return format("java.util.Objects.hashCode(%s)", field.name); } @Override String generateArrayElementHashCode( ArrayFieldModel arrayFieldModel, ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { return format("java.util.Objects.hashCode(%s[index])", field.name); } }