| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ |
| 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <functional> | 10 #include <functional> |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 const uint32_t kUnionDataSize = 16; | 67 const uint32_t kUnionDataSize = 16; |
| 68 | 68 |
| 69 template <typename T> | 69 template <typename T> |
| 70 class Array_Data; | 70 class Array_Data; |
| 71 | 71 |
| 72 template <typename K, typename V> | 72 template <typename K, typename V> |
| 73 class Map_Data; | 73 class Map_Data; |
| 74 | 74 |
| 75 using String_Data = Array_Data<char>; | 75 using String_Data = Array_Data<char>; |
| 76 | 76 |
| 77 size_t Align(size_t size); | 77 inline size_t Align(size_t size) { |
| 78 char* AlignPointer(char* ptr); | 78 return (size + 7) & ~0x7; |
| 79 } |
| 79 | 80 |
| 80 bool IsAligned(const void* ptr); | 81 inline bool IsAligned(const void* ptr) { |
| 82 return !(reinterpret_cast<uintptr_t>(ptr) & 0x7); |
| 83 } |
| 81 | 84 |
| 82 // Pointers are encoded as relative offsets. The offsets are relative to the | 85 // Pointers are encoded as relative offsets. The offsets are relative to the |
| 83 // address of where the offset value is stored, such that the pointer may be | 86 // address of where the offset value is stored, such that the pointer may be |
| 84 // recovered with the expression: | 87 // recovered with the expression: |
| 85 // | 88 // |
| 86 // ptr = reinterpret_cast<char*>(offset) + *offset | 89 // ptr = reinterpret_cast<char*>(offset) + *offset |
| 87 // | 90 // |
| 88 // A null pointer is encoded as an offset value of 0. | 91 // A null pointer is encoded as an offset value of 0. |
| 89 // | 92 // |
| 90 void EncodePointer(const void* ptr, uint64_t* offset); | 93 inline void EncodePointer(const void* ptr, uint64_t* offset) { |
| 94 if (!ptr) { |
| 95 *offset = 0; |
| 96 return; |
| 97 } |
| 98 |
| 99 const char* p_obj = reinterpret_cast<const char*>(ptr); |
| 100 const char* p_slot = reinterpret_cast<const char*>(offset); |
| 101 DCHECK(p_obj > p_slot); |
| 102 |
| 103 *offset = static_cast<uint64_t>(p_obj - p_slot); |
| 104 } |
| 105 |
| 91 // Note: This function doesn't validate the encoded pointer value. | 106 // Note: This function doesn't validate the encoded pointer value. |
| 92 inline const void* DecodePointer(const uint64_t* offset) { | 107 inline const void* DecodePointer(const uint64_t* offset) { |
| 93 if (!*offset) | 108 if (!*offset) |
| 94 return nullptr; | 109 return nullptr; |
| 95 return reinterpret_cast<const char*>(offset) + *offset; | 110 return reinterpret_cast<const char*>(offset) + *offset; |
| 96 } | 111 } |
| 97 | 112 |
| 98 #pragma pack(push, 1) | 113 #pragma pack(push, 1) |
| 99 | 114 |
| 100 struct StructHeader { | 115 struct StructHeader { |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 | 380 |
| 366 template <> | 381 template <> |
| 367 struct DataViewTraits<NativeStructDataView> { | 382 struct DataViewTraits<NativeStructDataView> { |
| 368 using MojomType = NativeStructPtr; | 383 using MojomType = NativeStructPtr; |
| 369 }; | 384 }; |
| 370 | 385 |
| 371 } // namespace internal | 386 } // namespace internal |
| 372 } // namespace mojo | 387 } // namespace mojo |
| 373 | 388 |
| 374 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ | 389 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ |
| OLD | NEW |