One Hat Cyber Team
Your IP :
216.73.216.115
Server IP :
194.44.31.54
Server :
Linux zen.imath.kiev.ua 4.18.0-553.77.1.el8_10.x86_64 #1 SMP Fri Oct 3 14:30:23 UTC 2025 x86_64
Server Software :
Apache/2.4.37 (Rocky Linux) OpenSSL/1.1.1k
PHP Version :
5.6.40
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
usr
/
include
/
llvm
/
ADT
/
View File Name :
DenseMapInfoVariant.h
//===- DenseMapInfoVariant.h - Type traits for DenseMap<variant> *- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// This file defines DenseMapInfo traits for DenseMap<std::variant<Ts...>>. /// //===----------------------------------------------------------------------===// #ifndef LLVM_ADT_DENSEMAPINFOVARIANT_H #define LLVM_ADT_DENSEMAPINFOVARIANT_H #include "llvm/ADT/DenseMapInfo.h" #include <utility> #include <variant> namespace llvm { // Provide DenseMapInfo for variants whose all alternatives have DenseMapInfo. template <typename... Ts> struct DenseMapInfo<std::variant<Ts...>> { using Variant = std::variant<Ts...>; using FirstT = std::variant_alternative_t<0, Variant>; static inline Variant getEmptyKey() { return Variant(std::in_place_index<0>, DenseMapInfo<FirstT>::getEmptyKey()); } static inline Variant getTombstoneKey() { return Variant(std::in_place_index<0>, DenseMapInfo<FirstT>::getTombstoneKey()); } static unsigned getHashValue(const Variant &Val) { return std::visit( [&Val](auto &&Alternative) { using T = std::decay_t<decltype(Alternative)>; // Include index in hash to make sure same value as different // alternatives don't collide. return DenseMapInfo<std::pair<size_t, T>>::getHashValuePiecewise( Val.index(), Alternative); }, Val); } static bool isEqual(const Variant &LHS, const Variant &RHS) { if (LHS.index() != RHS.index()) return false; if (LHS.valueless_by_exception()) return true; // We want to dispatch to DenseMapInfo<T>::isEqual(LHS.get(I), RHS.get(I)) // We know the types are the same, but std::visit(V, LHS, RHS) doesn't. // We erase the type held in LHS to void*, and dispatch over RHS. const void *ErasedLHS = std::visit([](const auto &LHS) -> const void * { return &LHS; }, LHS); return std::visit( [&](const auto &RHS) -> bool { using T = std::remove_cv_t<std::remove_reference_t<decltype(RHS)>>; return DenseMapInfo<T>::isEqual(*static_cast<const T *>(ErasedLHS), RHS); }, RHS); } }; } // end namespace llvm #endif // LLVM_ADT_DENSEMAPINFOVARIANT_H