1// Copyright 2021 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef INCLUDE_CPPGC_SENTINEL_POINTER_H_
6#define INCLUDE_CPPGC_SENTINEL_POINTER_H_
7
8#include <cstdint>
9
10namespace cppgc {
11namespace internal {
12
13// Special tag type used to denote some sentinel member. The semantics of the
14// sentinel is defined by the embedder.
15struct SentinelPointer {
16  static constexpr intptr_t kSentinelValue = 0b10;
17  template <typename T>
18  operator T*() const {
19    return reinterpret_cast<T*>(kSentinelValue);
20  }
21  // Hidden friends.
22  friend bool operator==(SentinelPointer, SentinelPointer) { return true; }
23  friend bool operator!=(SentinelPointer, SentinelPointer) { return false; }
24};
25
26}  // namespace internal
27
28constexpr internal::SentinelPointer kSentinelPointer;
29
30}  // namespace cppgc
31
32#endif  // INCLUDE_CPPGC_SENTINEL_POINTER_H_
33