@ -107,12 +107,12 @@ class TypeInfoForTypeResolver : public TypeInfo {
virtual const google : : protobuf : : Field * FindField (
const google : : protobuf : : Type * type , StringPiece camel_case_name ) const {
if ( indexed_types_ . find ( type ) = = indexed_types_ . end ( ) ) {
PopulateNameLookupTable ( type ) ;
indexed_types_ . insert ( type ) ;
}
std : : map < const google : : protobuf : : Type * ,
CamelCaseNameTable > : : const_iterator it = indexed_types_ . find ( type ) ;
const CamelCaseNameTable & camel_case_name_table = ( it = = indexed_types_ . end ( ) )
? PopulateNameLookupTable ( type , & indexed_types_ [ type ] ) : it - > second ;
StringPiece name =
FindWithDefault ( camel_case_name_table_ , camel_case_name , StringPiece ( ) ) ;
FindWithDefault ( camel_case_name_table , camel_case_name , StringPiece ( ) ) ;
if ( name . empty ( ) ) {
// Didn't find a mapping. Use whatever provided.
name = camel_case_name ;
@ -123,6 +123,7 @@ class TypeInfoForTypeResolver : public TypeInfo {
private :
typedef util : : StatusOr < const google : : protobuf : : Type * > StatusOrType ;
typedef util : : StatusOr < const google : : protobuf : : Enum * > StatusOrEnum ;
typedef std : : map < StringPiece , StringPiece > CamelCaseNameTable ;
template < typename T >
static void DeleteCachedTypes ( std : : map < StringPiece , T > * cached_types ) {
@ -134,32 +135,35 @@ class TypeInfoForTypeResolver : public TypeInfo {
}
}
void PopulateNameLookupTable ( const google : : protobuf : : Type * type ) const {
const CamelCaseNameTable & PopulateNameLookupTable (
const google : : protobuf : : Type * type ,
CamelCaseNameTable * camel_case_name_table ) const {
for ( int i = 0 ; i < type - > fields_size ( ) ; + + i ) {
const google : : protobuf : : Field & field = type - > fields ( i ) ;
StringPiece name = field . name ( ) ;
StringPiece camel_case_name = field . json_name ( ) ;
const StringPiece * existing = InsertOrReturnExisting (
& camel_case_name_table_ , camel_case_name , name ) ;
camel_case_name_table , camel_case_name , name ) ;
if ( existing & & * existing ! = name ) {
GOOGLE_LOG ( WARNING ) < < " Field ' " < < name < < " ' and ' " < < * existing
< < " ' map to the same camel case name ' " < < camel_case_name
< < " '. " ;
}
}
return * camel_case_name_table ;
}
TypeResolver * type_resolver_ ;
// Stores string values that will be referenced by StringPieces in
// cached_types_, cached_enums_ and camel_case_name_table_ .
// cached_types_, cached_enums_.
mutable std : : set < string > string_storage_ ;
mutable std : : map < StringPiece , StatusOrType > cached_types_ ;
mutable std : : map < StringPiece , StatusOrEnum > cached_enums_ ;
mutable std : : set < const google : : protobuf : : Type * > indexed_types_ ;
mutable std : : map < StringPiece , StringPiece > camel_case_name_table _;
mutable std : : map < const google : : protobuf : : Type * ,
CamelCaseNameTable > indexed_types _ ;
} ;
} // namespace