• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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