// 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 // Checks if the given struct contains a member, whether set or not. #define STRUCT_HAS_MEMBER(pointer, member) \ ((offsetof(std::remove_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_castmember)>((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_