@ -72,9 +72,8 @@ struct UpbExtensionTrait<int64_t> {
// not return an error if missing but the default msg
template < typename T >
struct UpbExtensionTrait < T > {
using DefaultType = int ;
using ReturnType = int ;
using DefaultFuncType = void ( * ) ( ) ;
using DefaultType = std : : false_type ;
using ReturnType = Ptr < const T > ;
} ;
// -------------------------------------------------------------------
@ -109,7 +108,11 @@ class ExtensionIdentifier {
const upb_MiniTableExtension * mini_table_ext_ ;
typename UpbExtensionTrait < ExtensionType > : : ReturnType default_value ( ) const {
return default_val_ ;
if constexpr ( IsHpbClass < ExtensionType > ) {
return ExtensionType : : default_instance ( ) ;
} else {
return default_val_ ;
}
}
typename UpbExtensionTrait < ExtensionType > : : DefaultType default_val_ ;
@ -266,26 +269,10 @@ absl::Status SetExtension(
template < typename T , typename Extendee , typename Extension ,
typename = hpb : : internal : : EnableIfHpbClassThatHasExtensions < T > >
absl : : StatusOr < Ptr < const Extension > > GetExtension (
absl : : StatusOr < typename internal : : UpbExtensionTrait < Extension > : : ReturnType >
GetExtension (
Ptr < T > message ,
const : : hpb : : internal : : ExtensionIdentifier < Extendee , Extension > & id ) {
upb_MessageValue value ;
const bool ok = : : hpb : : internal : : GetOrPromoteExtension (
hpb : : interop : : upb : : GetMessage ( message ) , id . mini_table_ext ( ) ,
hpb : : interop : : upb : : GetArena ( message ) , & value ) ;
if ( ! ok ) {
return ExtensionNotFoundError (
upb_MiniTableExtension_Number ( id . mini_table_ext ( ) ) ) ;
}
return Ptr < const Extension > ( : : hpb : : interop : : upb : : MakeCHandle < Extension > (
( upb_Message * ) value . msg_val , hpb : : interop : : upb : : GetArena ( message ) ) ) ;
}
template < typename T , typename Extendee , typename Extension ,
typename = hpb : : internal : : EnableIfHpbClassThatHasExtensions < T > >
decltype ( auto ) GetExtension (
const T * message ,
const hpb : : internal : : ExtensionIdentifier < Extendee , Extension > & id ) {
if constexpr ( std : : is_integral_v < Extension > ) {
auto default_val = hpb : : internal : : PrivateAccess : : GetDefaultValue ( id ) ;
absl : : StatusOr < Extension > res =
@ -294,10 +281,28 @@ decltype(auto) GetExtension(
default_val ) ;
return res ;
} else {
return GetExtension ( Ptr ( message ) , id ) ;
upb_MessageValue value ;
const bool ok = : : hpb : : internal : : GetOrPromoteExtension (
hpb : : interop : : upb : : GetMessage ( message ) , id . mini_table_ext ( ) ,
hpb : : interop : : upb : : GetArena ( message ) , & value ) ;
if ( ! ok ) {
return ExtensionNotFoundError (
upb_MiniTableExtension_Number ( id . mini_table_ext ( ) ) ) ;
}
return Ptr < const Extension > ( : : hpb : : interop : : upb : : MakeCHandle < Extension > (
( upb_Message * ) value . msg_val , hpb : : interop : : upb : : GetArena ( message ) ) ) ;
}
}
template < typename T , typename Extendee , typename Extension ,
typename = hpb : : internal : : EnableIfHpbClassThatHasExtensions < T > >
absl : : StatusOr < typename internal : : UpbExtensionTrait < Extension > : : ReturnType >
GetExtension (
const T * message ,
const hpb : : internal : : ExtensionIdentifier < Extendee , Extension > & id ) {
return GetExtension ( Ptr ( message ) , id ) ;
}
template < typename T , typename Extension >
constexpr uint32_t ExtensionNumber (
const internal : : ExtensionIdentifier < T , Extension > & id ) {