// 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_
