/* * 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 static java.lang.String.format; import static net.openhft.chronicle.values.IntegerFieldModel.*; abstract class IntegerBackedNativeMemberGenerator extends MemberGenerator { final IntegerFieldModel backingFieldModel; IntegerBackedNativeMemberGenerator( FieldModel fieldModel, IntegerFieldModel backingFieldModel) { super(fieldModel); this.backingFieldModel = backingFieldModel; } abstract void finishGet( ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder, String value); /** * Returns integer value to write (as string) */ abstract String startSet(MethodSpec.Builder methodBuilder); @Override public void generateGet(ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { String value = backingFieldModel.genGet(valueBuilder, NORMAL_ACCESS_TYPE); finishGet(valueBuilder, methodBuilder, value); } @Override public void generateArrayElementGet( ArrayFieldModel arrayFieldModel, ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { arrayFieldModel.checkBounds(methodBuilder); String value = backingFieldModel.genArrayElementGet( arrayFieldModel, valueBuilder, methodBuilder, NORMAL_ACCESS_TYPE); finishGet(valueBuilder, methodBuilder, value); } @Override public void generateGetVolatile( ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { String value = backingFieldModel.genGet(valueBuilder, VOLATILE_ACCESS_TYPE); finishGet(valueBuilder, methodBuilder, value); } @Override public void generateArrayElementGetVolatile( ArrayFieldModel arrayFieldModel, ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { arrayFieldModel.checkBounds(methodBuilder); String value = backingFieldModel.genArrayElementGet( arrayFieldModel, valueBuilder, methodBuilder, VOLATILE_ACCESS_TYPE); finishGet(valueBuilder, methodBuilder, value); } @Override public void generateSet(ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { String valueToWrite = startSet(methodBuilder); backingFieldModel.genSet(valueBuilder, methodBuilder, NORMAL_ACCESS_TYPE, valueToWrite); } @Override public void generateArrayElementSet( ArrayFieldModel arrayFieldModel, ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { arrayFieldModel.checkBounds(methodBuilder); String valueToWrite = startSet(methodBuilder); backingFieldModel.genArrayElementSet(arrayFieldModel, valueBuilder, methodBuilder, NORMAL_ACCESS_TYPE, valueToWrite); } @Override public void generateSetVolatile( ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { String valueToWrite = startSet(methodBuilder); backingFieldModel.genSet(valueBuilder, methodBuilder, VOLATILE_ACCESS_TYPE, valueToWrite); } @Override public void generateArrayElementSetVolatile( ArrayFieldModel arrayFieldModel, ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { arrayFieldModel.checkBounds(methodBuilder); String valueToWrite = startSet(methodBuilder); backingFieldModel.genArrayElementSet(arrayFieldModel, valueBuilder, methodBuilder, VOLATILE_ACCESS_TYPE, valueToWrite); } @Override public void generateSetOrdered( ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { String valueToWrite = startSet(methodBuilder); backingFieldModel.genSet(valueBuilder, methodBuilder, ORDERED_ACCESS_TYPE, valueToWrite); } @Override public void generateArrayElementSetOrdered( ArrayFieldModel arrayFieldModel, ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { arrayFieldModel.checkBounds(methodBuilder); String valueToWrite = startSet(methodBuilder); backingFieldModel.genArrayElementSet(arrayFieldModel, valueBuilder, methodBuilder, ORDERED_ACCESS_TYPE, valueToWrite); } @Override void generateCopyFrom(ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { if (fieldModel.set != null) { methodBuilder.addStatement("$N(from.$N())", fieldModel.set.getName(), fieldModel.getOrGetVolatile().getName()); } else { methodBuilder.addStatement("$T $N = from.$N()", fieldModel.type, fieldModel.varName(), fieldModel.getOrGetVolatile().getName()); generateSet(valueBuilder, methodBuilder); } } @Override void generateArrayElementCopyFrom( ArrayFieldModel arrayFieldModel, ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { if (arrayFieldModel.set != null) { methodBuilder.addStatement("$N(index, from.$N(index))", arrayFieldModel.set.getName(), arrayFieldModel.getOrGetVolatile().getName()); } else { methodBuilder.addStatement("$T $N = from.$N(index)", fieldModel.type, fieldModel.varName(), arrayFieldModel.getOrGetVolatile().getName()); generateArrayElementSet(arrayFieldModel, valueBuilder, methodBuilder); } } @Override void generateWriteMarshallable(ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { methodBuilder.addStatement("bytes.$N($N)", backingFieldModel.writeMethod(), backingFieldModel.genGet(valueBuilder, NORMAL_ACCESS_TYPE)); } @Override void generateArrayElementWriteMarshallable( ArrayFieldModel arrayFieldModel, ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { String value = backingFieldModel.genArrayElementGet( arrayFieldModel, valueBuilder, methodBuilder, NORMAL_ACCESS_TYPE); methodBuilder.addStatement("bytes.$N($N)", backingFieldModel.writeMethod(), value); } @Override void generateReadMarshallable(ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { backingFieldModel.genSet(valueBuilder, methodBuilder, NORMAL_ACCESS_TYPE, readValue()); } @Override void generateArrayElementReadMarshallable( ArrayFieldModel arrayFieldModel, ValueBuilder valueBuilder, MethodSpec.Builder methodBuilder) { backingFieldModel.genArrayElementSet(arrayFieldModel, valueBuilder, methodBuilder, NORMAL_ACCESS_TYPE, readValue()); } private String readValue() { return format("bytes.%s()", backingFieldModel.readMethod()); } }