@ -33,6 +33,7 @@
// Sanjay Ghemawat, Jeff Dean, and others.
// Sanjay Ghemawat, Jeff Dean, and others.
# include <map>
# include <map>
# include <math.h>
# include <string>
# include <string>
# include <google/protobuf/compiler/javanano/javanano_primitive_field.h>
# include <google/protobuf/compiler/javanano/javanano_primitive_field.h>
@ -174,6 +175,38 @@ int FixedSize(FieldDescriptor::Type type) {
return - 1 ;
return - 1 ;
}
}
// Returns true if the field has a default value equal to NaN.
bool IsDefaultNaN ( const FieldDescriptor * field ) {
switch ( field - > type ( ) ) {
case FieldDescriptor : : TYPE_INT32 : return false ;
case FieldDescriptor : : TYPE_UINT32 : return false ;
case FieldDescriptor : : TYPE_SINT32 : return false ;
case FieldDescriptor : : TYPE_FIXED32 : return false ;
case FieldDescriptor : : TYPE_SFIXED32 : return false ;
case FieldDescriptor : : TYPE_INT64 : return false ;
case FieldDescriptor : : TYPE_UINT64 : return false ;
case FieldDescriptor : : TYPE_SINT64 : return false ;
case FieldDescriptor : : TYPE_FIXED64 : return false ;
case FieldDescriptor : : TYPE_SFIXED64 : return false ;
case FieldDescriptor : : TYPE_FLOAT :
return isnan ( field - > default_value_float ( ) ) ;
case FieldDescriptor : : TYPE_DOUBLE :
return isnan ( field - > default_value_double ( ) ) ;
case FieldDescriptor : : TYPE_BOOL : return false ;
case FieldDescriptor : : TYPE_STRING : return false ;
case FieldDescriptor : : TYPE_BYTES : return false ;
case FieldDescriptor : : TYPE_ENUM : return false ;
case FieldDescriptor : : TYPE_GROUP : return false ;
case FieldDescriptor : : TYPE_MESSAGE : return false ;
// No default because we want the compiler to complain if any new
// types are added.
}
GOOGLE_LOG ( FATAL ) < < " Can't get here. " ;
return false ;
}
// Return true if the type is a that has variable length
// Return true if the type is a that has variable length
// for instance String's.
// for instance String's.
bool IsVariableLenType ( JavaType type ) {
bool IsVariableLenType ( JavaType type ) {
@ -308,6 +341,9 @@ GenerateSerializationCode(io::Printer* printer) const {
} else if ( IsReferenceType ( GetJavaType ( descriptor_ ) ) ) {
} else if ( IsReferenceType ( GetJavaType ( descriptor_ ) ) ) {
printer - > Print ( variables_ ,
printer - > Print ( variables_ ,
" if (!this.$name$.equals($default$)) { \n " ) ;
" if (!this.$name$.equals($default$)) { \n " ) ;
} else if ( IsDefaultNaN ( descriptor_ ) ) {
printer - > Print ( variables_ ,
" if (!$capitalized_type$.isNaN(this.$name$)) { \n " ) ;
} else {
} else {
printer - > Print ( variables_ ,
printer - > Print ( variables_ ,
" if (this.$name$ != $default$) { \n " ) ;
" if (this.$name$ != $default$) { \n " ) ;
@ -332,6 +368,9 @@ GenerateSerializedSizeCode(io::Printer* printer) const {
} else if ( IsReferenceType ( GetJavaType ( descriptor_ ) ) ) {
} else if ( IsReferenceType ( GetJavaType ( descriptor_ ) ) ) {
printer - > Print ( variables_ ,
printer - > Print ( variables_ ,
" if (!this.$name$.equals($default$)) { \n " ) ;
" if (!this.$name$.equals($default$)) { \n " ) ;
} else if ( IsDefaultNaN ( descriptor_ ) ) {
printer - > Print ( variables_ ,
" if (!$capitalized_type$.isNaN(this.$name$)) { \n " ) ;
} else {
} else {
printer - > Print ( variables_ ,
printer - > Print ( variables_ ,
" if (this.$name$ != $default$) { \n " ) ;
" if (this.$name$ != $default$) { \n " ) ;