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 10 namespace cppgc { 11 namespace internal { 12 13 // Special tag type used to denote some sentinel member. The semantics of the 14 // sentinel is defined by the embedder. 15 struct SentinelPointer { 16 static constexpr intptr_t kSentinelValue = 0b10; 17 template <typename T> operator T*cppgc::internal::SentinelPointer18 operator T*() const { 19 return reinterpret_cast<T*>(kSentinelValue); 20 } 21 // Hidden friends. operator ==cppgc::internal::SentinelPointer22 friend bool operator==(SentinelPointer, SentinelPointer) { return true; } operator !=cppgc::internal::SentinelPointer23 friend bool operator!=(SentinelPointer, SentinelPointer) { return false; } 24 }; 25 26 } // namespace internal 27 28 constexpr internal::SentinelPointer kSentinelPointer; 29 30 } // namespace cppgc 31 32 #endif // INCLUDE_CPPGC_SENTINEL_POINTER_H_ 33