| // 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 <cstddef> | |
| #include <cstdint> | |
| #include <string> | |
| #include <vector> | |
| #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 <typename T> | |
| T GetMessageBaseField(upb_Message* msg, const upb_MiniTableField* field, | |
| T default_value); | |
| #define F(T, Func) \ | |
| template <> \ | |
| inline T GetMessageBaseField<T>( \ | |
| 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<std::string>( | |
| 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 <typename T> | |
| T FromMessageValue(upb_MessageValue value); | |
| #define F(type, member) \ | |
| template <> \ | |
| inline type FromMessageValue<type>(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<std::string>(upb_MessageValue value) { | |
| return std::string(value.str_val.data, value.str_val.size); | |
| } | |
| template <typename T> | |
| std::vector<T> GetRepeatedField(upb_Message* msg, | |
| const upb_MiniTableField* field) { | |
| std::vector<T> 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<T>(upb_Array_Get(array, i))); | |
| } | |
| return ret; | |
| } | |
| } // namespace upb | |
| #endif // UPB_MESSAGE_ACCESSORS_HPP_ |