package org.jruby.ext.ffi.jffi;
import com.kenai.jffi.CallingConvention;
import java.util.Arrays;
import org.jruby.RubyHash;
import org.jruby.ext.ffi.Enums;
import org.jruby.ext.ffi.Type;
final class Signature {
private final Type resultType;
private final Type[] parameterTypes;
private final CallingConvention convention;
private final boolean ignoreError;
private final RubyHash enums;
public Signature(Type resultType, Type[] parameterTypes,
CallingConvention convention, boolean ignoreError, RubyHash enums) {
this.resultType = resultType;
this.parameterTypes = (Type[]) parameterTypes.clone();
this.convention = convention;
this.ignoreError = ignoreError;
this.enums = enums;
}
@Override
public boolean equals(Object o) {
if (o == null || !o.getClass().equals(getClass())) {
return false;
}
Signature rhs = (Signature) o;
return resultType.equals(rhs.resultType) && convention.equals(rhs.convention)
&& ignoreError == rhs.ignoreError
&& Arrays.equals(parameterTypes, rhs.parameterTypes)
&& ((enums == null && rhs.enums == null) || enums.equals(rhs.enums))
;
}
@Override
public int hashCode() {
return resultType.hashCode()
^ convention.hashCode()
^ Boolean.valueOf(ignoreError).hashCode()
^ Arrays.hashCode(parameterTypes)
^ (enums == null ? 0 : enums.hashCode());
}
public CallingConvention getCallingConvention() {
return convention;
}
public boolean isIgnoreError() {
return ignoreError;
}
public int getParameterCount() {
return parameterTypes.length;
}
public Type getParameterType(int parameterIndex) {
return parameterTypes[parameterIndex];
}
public Type getResultType() {
return resultType;
}
public RubyHash getEnums() {
return enums;
}
}