// Protocol Buffers - Google's data interchange format // Copyright 2025 Google LLC. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file or at // https://developers.google.com/open-source/licenses/bsd // This file contains C++ wrappers for the C API in accessors.h. #ifndef UPB_MESSAGE_ACCESSORS_HPP_ #define UPB_MESSAGE_ACCESSORS_HPP_ #include #include #include #include #include "upb/base/string_view.h" #include "upb/message/accessors.h" #include "upb/message/array.h" #include "upb/message/message.h" #include "upb/mini_table/field.h" namespace upb { template T GetMessageBaseField(upb_Message* msg, const upb_MiniTableField* field, T default_value); #define F(T, Func) \ template <> \ inline T GetMessageBaseField( \ upb_Message * msg, const upb_MiniTableField* field, T default_value) { \ return upb_Message_Get##Func(msg, field, default_value); \ } F(int32_t, Int32); F(int64_t, Int64); F(uint32_t, UInt32); F(uint64_t, UInt64); F(float, Float); F(double, Double); F(bool, Bool); #undef F template <> inline std::string GetMessageBaseField( upb_Message* msg, const upb_MiniTableField* field, std::string default_value) { upb_StringView default_sv = upb_StringView_FromDataAndSize( default_value.data(), default_value.size()); upb_StringView sv = upb_Message_GetString(msg, field, default_sv); return std::string(sv.data, sv.size); } template T FromMessageValue(upb_MessageValue value); #define F(type, member) \ template <> \ inline type FromMessageValue(upb_MessageValue value) { \ return value.member; \ } F(bool, bool_val); F(float, float_val); F(double, double_val); F(int32_t, int32_val); F(int64_t, int64_val); F(uint32_t, uint32_val); F(uint64_t, uint64_val); #undef F template <> inline std::string FromMessageValue(upb_MessageValue value) { return std::string(value.str_val.data, value.str_val.size); } template std::vector GetRepeatedField(upb_Message* msg, const upb_MiniTableField* field) { std::vector ret; const upb_Array* array = upb_Message_GetArray(msg, field); if (!array) return ret; size_t size = upb_Array_Size(array); ret.reserve(size); for (size_t i = 0; i < size; i++) { ret.push_back(FromMessageValue(upb_Array_Get(array, i))); } return ret; } } // namespace upb #endif // UPB_MESSAGE_ACCESSORS_HPP_