| //===--- WeakTypeInfo.h - Supplemental API for [weak] types -----*- 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines WeakTypeInfo, which supplements the FixedTypeInfo |
| // interface for types that implement [weak] references. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef SWIFT_IRGEN_WEAKTYPEINFO_H |
| #define SWIFT_IRGEN_WEAKTYPEINFO_H |
| |
| #include "FixedTypeInfo.h" |
| |
| namespace swift { |
| namespace irgen { |
| |
| /// \brief An abstract class designed for use when implementing a |
| /// ReferenceStorageType with [weak] ownership. |
| class WeakTypeInfo : public FixedTypeInfo { |
| protected: |
| WeakTypeInfo(llvm::Type *type, Size size, Alignment align, |
| const SpareBitVector &spareBits) |
| : FixedTypeInfo(type, size, spareBits, align, IsNotPOD, |
| IsNotBitwiseTakable, IsFixedSize, |
| SpecialTypeInfoKind::Weak) {} |
| |
| WeakTypeInfo(llvm::Type *type, Size size, Alignment align, |
| SpareBitVector &&spareBits) |
| : FixedTypeInfo(type, size, std::move(spareBits), align, IsNotPOD, |
| IsNotBitwiseTakable, IsFixedSize, |
| SpecialTypeInfoKind::Weak) {} |
| |
| public: |
| virtual void weakLoadStrong(IRGenFunction &IGF, Address addr, |
| Explosion &out) const = 0; |
| virtual void weakTakeStrong(IRGenFunction &IGF, Address addr, |
| Explosion &out) const = 0; |
| virtual void weakInit(IRGenFunction &IGF, Explosion &src, |
| Address dest) const = 0; |
| virtual void weakAssign(IRGenFunction &IGF, Explosion &src, |
| Address dest) const = 0; |
| |
| static bool classof(const WeakTypeInfo *type) { return true; } |
| static bool classof(const TypeInfo *type) { |
| return type->getSpecialTypeInfoKind() == SpecialTypeInfoKind::Weak; |
| } |
| }; |
| |
| } |
| } |
| |
| #endif |