// Needed for equal() in order to achieve linear performance for complex types.
// Uses up (recursively) copies of the InputStream in both Anys that got created in equal().
private boolean equalMember(TypeCode memberType, InputStream myStream, InputStream otherStream) {
// Resolve aliases here
TypeCode realType = realType(memberType);
try {
switch (realType.kind().value()) {
// handle primitive types
case TCKind._tk_null:
case TCKind._tk_void:
return true;
case TCKind._tk_short:
return (myStream.read_short() == otherStream.read_short());
case TCKind._tk_long:
return (myStream.read_long() == otherStream.read_long());
case TCKind._tk_ushort:
return (myStream.read_ushort() == otherStream.read_ushort());
case TCKind._tk_ulong:
return (myStream.read_ulong() == otherStream.read_ulong());
case TCKind._tk_float:
return (myStream.read_float() == otherStream.read_float());
case TCKind._tk_double:
return (myStream.read_double() == otherStream.read_double());
case TCKind._tk_boolean:
return (myStream.read_boolean() == otherStream.read_boolean());
case TCKind._tk_char:
return (myStream.read_char() == otherStream.read_char());
case TCKind._tk_wchar:
return (myStream.read_wchar() == otherStream.read_wchar());
case TCKind._tk_octet:
return (myStream.read_octet() == otherStream.read_octet());
case TCKind._tk_any:
return myStream.read_any().equal(otherStream.read_any());
case TCKind._tk_TypeCode:
return myStream.read_TypeCode().equal(otherStream.read_TypeCode());
case TCKind._tk_string:
return myStream.read_string().equals(otherStream.read_string());
case TCKind._tk_wstring:
return (myStream.read_wstring().equals(otherStream.read_wstring()));
case TCKind._tk_longlong:
return (myStream.read_longlong() == otherStream.read_longlong());
case TCKind._tk_ulonglong:
return (myStream.read_ulonglong() == otherStream.read_ulonglong());
case TCKind._tk_objref:
return (myStream.read_Object().equals(otherStream.read_Object()));
case TCKind._tk_Principal:
return (myStream.read_Principal().equals(otherStream.read_Principal()));
case TCKind._tk_enum:
return (myStream.read_long() == otherStream.read_long());
case TCKind._tk_fixed:
return (myStream.read_fixed().compareTo(otherStream.read_fixed()) == 0);
case TCKind._tk_except:
case TCKind._tk_struct: {
int length = realType.member_count();
for (int i=0; i<length; i++) {
if ( ! equalMember(realType.member_type(i), myStream, otherStream)) {
return false;
}
}
return true;
}
case TCKind._tk_union: {
Any myDiscriminator = orb.create_any();
Any otherDiscriminator = orb.create_any();
myDiscriminator.read_value(myStream, realType.discriminator_type());
otherDiscriminator.read_value(otherStream, realType.discriminator_type());
if ( ! myDiscriminator.equal(otherDiscriminator)) {
return false;
}
TypeCodeImpl realTypeCodeImpl = TypeCodeImpl.convertToNative(orb, realType);
int memberIndex = realTypeCodeImpl.currentUnionMemberIndex(myDiscriminator);
if (memberIndex == -1)
throw wrapper.unionDiscriminatorError() ;
if ( ! equalMember(realType.member_type(memberIndex), myStream, otherStream)) {
return false;
}
return true;
}
case TCKind._tk_sequence: {
int length = myStream.read_long();
otherStream.read_long(); // just so that the two stream are in sync
for (int i=0; i<length; i++) {
if ( ! equalMember(realType.content_type(), myStream, otherStream)) {
return false;
}
}
return true;
}
case TCKind._tk_array: {
int length = realType.member_count();
for (int i=0; i<length; i++) {
if ( ! equalMember(realType.content_type(), myStream, otherStream)) {
return false;
}
}
return true;
}