/*
* 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.jctools.channels.mapping;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.jctools.channels.spsc.SpscOffHeapFixedSizeRingBuffer;
public class ClassViewModel {
private final Class<?> implementationParent;
private final Class<?>[] constructorParams;
private final Class<?> structInterface;
private final TypeInspector inspector;
public ClassViewModel(
Class<?> implementationParent, Class<?>[] constructorParams, Class<?> structInterface,
TypeInspector inspector) {
this.implementationParent = implementationParent;
this.constructorParams = constructorParams;
this.structInterface = structInterface;
this.inspector = inspector;
}
public String className() {
return implementationParent.getSimpleName() + "_" + structInterface.getSimpleName();
}
public String implementationParent() {
return cleanClassName(implementationParent);
}
public String flyweightInterface() {
return cleanClassName(structInterface);
}
// Account for anonymous inner classes
private String cleanClassName(Class<?> cls) {
return cls.getName().replace('$', '.');
}
public List<Variable> constructorParams() {
List<Variable> variables = new ArrayList<Variable>(constructorParams.length);
for (int i = 0; i < constructorParams.length; i++) {
variables.add(new Variable(constructorParams[i].getName(), "arg" + i, 0, ""));
}
return variables;
}
public List<Variable> fields() {
int fieldOffset = SpscOffHeapFixedSizeRingBuffer.MESSAGE_INDICATOR_SIZE;
List<Variable> fields = new ArrayList<Variable>();
for (Method method : inspector.getters) {
Primitive type = Primitive.of(method.getReturnType());
String name = method.getName().substring(3);
fields.add(new Variable(type.javaEquivalent.getName(), name, fieldOffset, type.unsafeMethodSuffix()));
fieldOffset += type.sizeInBytes;
}
return fields;
}
}