// 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. template <typename T> using ZonePtrList = ZoneList<T*>; template <typename T> using FullZonePtr = T*; 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 <typename T> using Ptr = FullZonePtr<T>; }; template <> struct ZoneTypeTraits<true> { template <typename T> using Ptr = CompressedZonePtr<T>; }; // 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 {}; template <typename T> struct is_compressed_pointer<CompressedZonePtr<T>> : std::true_type {}; template <typename T> struct is_compressed_pointer<const CompressedZonePtr<T>> : std::true_type {}; } // namespace internal } // namespace v8 #endif // V8_ZONE_ZONE_TYPE_TRAITS_H_