chromium/v8/src/zone/zone-type-traits.h

// Copyright 2020 the V8 project 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 V8_ZONE_ZONE_TYPE_TRAITS_H_
#define V8_ZONE_ZONE_TYPE_TRAITS_H_

#include "src/common/globals.h"

#ifdef V8_COMPRESS_ZONES
#include "src/zone/compressed-zone-ptr.h"
#endif

namespace v8 {
namespace internal {

template <typename T>
class ZoneList;

// ZonePtrList is a ZoneList of pointers to ZoneObjects allocated in the same
// zone as the list object.
ZonePtrList;

FullZonePtr;

template <typename T>
class CompressedZonePtr;

//
// ZoneTypeTraits provides type aliases for compressed or full pointer
// dependent types based on a static flag. It helps organizing fine-grained
// control over which parts of the code base should use compressed zone
// pointers.
// For example:
//   using ZoneNodePtr = typename ZoneTypeTraits<kCompressGraphZone>::Ptr<Node>;
//
// or
//   template <typename T>
//   using AstZonePtr = typename ZoneTypeTraits<kCompressAstZone>::Ptr<T>;
//
template <bool kEnableCompression>
struct ZoneTypeTraits;

template <>
struct ZoneTypeTraits<false> {};

template <>
struct ZoneTypeTraits<true> {};

// This requirement is necessary for being able to use memcopy in containers
// of zone pointers.
// TODO(ishell): Re-enable once compressed pointers are supported in containers.
// static_assert(
//     std::is_trivially_copyable<
//         ZoneTypeTraits<COMPRESS_ZONES_BOOL>::Ptr<int>>::value,
//     "ZoneTypeTraits<COMPRESS_ZONES_BOOL>::Ptr<T> must be trivially
//     copyable");

//
// is_compressed_pointer<T> predicate can be used for checking if T is a
// compressed pointer.
//
template <typename>
struct is_compressed_pointer : std::false_type {};

is_compressed_pointer<CompressedZonePtr<T>>;

is_compressed_pointer<const CompressedZonePtr<T>>;

}  // namespace internal
}  // namespace v8

#endif  // V8_ZONE_ZONE_TYPE_TRAITS_H_