| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_SAFE_ACCESS_H_ | |
| #define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_SAFE_ACCESS_H_ | |
| #include <type_traits> | |
| // Checks if the given struct contains a member, whether set or not. | |
| #define STRUCT_HAS_MEMBER(pointer, member) \ | |
| ((offsetof(std::remove_pointer<decltype(pointer)>::type, member) + \ | |
| sizeof(pointer->member) <= \ | |
| pointer->struct_size)) | |
| #define SAFE_ACCESS(pointer, member, default_value) \ | |
| ([=]() { \ | |
| if (STRUCT_HAS_MEMBER(pointer, member)) { \ | |
| return pointer->member; \ | |
| } \ | |
| return static_cast<decltype(pointer->member)>((default_value)); \ | |
| })() | |
| /// Checks if the member exists and is non-null. | |
| #define SAFE_EXISTS(pointer, member) \ | |
| (SAFE_ACCESS(pointer, member, nullptr) != nullptr) | |
| /// Checks if exactly one of member1 or member2 exists and is non-null. | |
| #define SAFE_EXISTS_ONE_OF(pointer, member1, member2) \ | |
| (SAFE_EXISTS(pointer, member1) != SAFE_EXISTS(pointer, member2)) | |
| #endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_SAFE_ACCESS_H_ |