1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2023 Google Inc. All rights reserved.
3 //
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file or at
6 // https://developers.google.com/open-source/licenses/bsd
7
8 // -----------------------------------------------------------------------------
9 // Ruby <-> upb data conversion functions. Strictly free of dependencies on
10 // Ruby interpreter internals.
11
12 #include "shared_convert.h"
13
shared_Msgval_IsEqual(upb_MessageValue val1,upb_MessageValue val2,upb_CType type,const upb_MessageDef * msgdef,upb_Status * status)14 bool shared_Msgval_IsEqual(upb_MessageValue val1, upb_MessageValue val2,
15 upb_CType type, const upb_MessageDef* msgdef,
16 upb_Status* status) {
17 switch (type) {
18 case kUpb_CType_Bool:
19 return memcmp(&val1, &val2, 1) == 0;
20 case kUpb_CType_Float:
21 case kUpb_CType_Int32:
22 case kUpb_CType_UInt32:
23 case kUpb_CType_Enum:
24 return memcmp(&val1, &val2, 4) == 0;
25 case kUpb_CType_Double:
26 case kUpb_CType_Int64:
27 case kUpb_CType_UInt64:
28 return memcmp(&val1, &val2, 8) == 0;
29 case kUpb_CType_String:
30 case kUpb_CType_Bytes:
31 return val1.str_val.size == val2.str_val.size &&
32 memcmp(val1.str_val.data, val2.str_val.data, val1.str_val.size) ==
33 0;
34 case kUpb_CType_Message: {
35 const upb_MiniTable* m = upb_MessageDef_MiniTable(msgdef);
36 const int options = 0;
37 return upb_Message_IsEqual(val1.msg_val, val2.msg_val, m, options);
38 }
39 default:
40 upb_Status_SetErrorMessage(status, "Internal error, unexpected type");
41 return false;
42 }
43 }
44
shared_Msgval_GetHash(upb_MessageValue val,upb_CType type,const upb_MessageDef * msgdef,uint64_t seed,upb_Status * status)45 uint64_t shared_Msgval_GetHash(upb_MessageValue val, upb_CType type,
46 const upb_MessageDef* msgdef, uint64_t seed,
47 upb_Status* status) {
48 switch (type) {
49 case kUpb_CType_Bool:
50 return _upb_Hash(&val, 1, seed);
51 case kUpb_CType_Float:
52 case kUpb_CType_Int32:
53 case kUpb_CType_UInt32:
54 case kUpb_CType_Enum:
55 return _upb_Hash(&val, 4, seed);
56 case kUpb_CType_Double:
57 case kUpb_CType_Int64:
58 case kUpb_CType_UInt64:
59 return _upb_Hash(&val, 8, seed);
60 case kUpb_CType_String:
61 case kUpb_CType_Bytes:
62 return _upb_Hash(val.str_val.data, val.str_val.size, seed);
63 case kUpb_CType_Message:
64 return shared_Message_Hash(val.msg_val, msgdef, seed, status);
65 default:
66 upb_Status_SetErrorMessage(status, "Internal error, unexpected type");
67 return 0;
68 }
69 }
70