//===--- APIntMap.h - A map with APInts as the keys -------------*- C++ -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // // LLVM does not allow arbitrary APInts to be the keys of a DenseMap because // APInts are only comparable if they have the same bit-width. This map // implementation assumes that its keys will always be constrained to their // minimum width, so it's not a general-purpose structure, but it does work. // //===----------------------------------------------------------------------===// #ifndef SWIFT_BASIC_APINTMAP_H #define SWIFT_BASIC_APINTMAP_H #include "llvm/ADT/APInt.h" #include "llvm/ADT/DenseMap.h" #include "swift/Basic/LLVM.h" namespace swift { struct WidthPreservingAPIntDenseMapInfo { // For the special values, we use -1 with a bit-width that isn't minimal // for the value, then use a parser that always produces values with // minimal bit-widths so that we don't get a conflict. static inline APInt getEmptyKey() { return APInt::getAllOnesValue(/*bitwidth*/2); } static inline APInt getTombstoneKey() { return APInt::getAllOnesValue(/*bitwidth*/3); } static unsigned getHashValue(const APInt &Key) { return static_cast(hash_value(Key)); } static bool isEqual(const APInt &LHS, const APInt &RHS) { return LHS.getBitWidth() == RHS.getBitWidth() && LHS == RHS; } }; template using APIntMap = llvm::DenseMap; } #endif