//===--- ReferenceTypeInfo.h - Supplement for reference 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 ReferenceTypeInfo, which supplements the
// FixedTypeInfo interface for types with reference semantics.
//
//===----------------------------------------------------------------------===//

#ifndef SWIFT_IRGEN_REFERENCETYPEINFO_H
#define SWIFT_IRGEN_REFERENCETYPEINFO_H

#include "LoadableTypeInfo.h"

namespace swift {
namespace irgen {

class WeakTypeInfo;
class UnownedTypeInfo;
class TypeConverter;
  
/// \brief An abstract class designed for use when implementing a type
/// that has reference semantics.
class ReferenceTypeInfo : public LoadableTypeInfo {
protected:
  // FIXME: Get spare bits for pointers from a TargetInfo-like structure.
  ReferenceTypeInfo(llvm::Type *type, Size size, SpareBitVector spareBits,
                    Alignment align, IsPOD_t pod = IsNotPOD)
    : LoadableTypeInfo(type, size, spareBits, align, pod,
                       IsFixedSize, SpecialTypeInfoKind::Reference)
  {}

public:
  /// Strongly retains a value.
  virtual void strongRetain(IRGenFunction &IGF, Explosion &in,
                            Atomicity atomicity) const = 0;

  /// Strongly releases a value.
  virtual void strongRelease(IRGenFunction &IGF, Explosion &in,
                             Atomicity atomicity) const = 0;

  /// Strongly retains a value that has come from a safe [unowned] reference.
  /// This operation is not supported for all reference types.
  virtual void strongRetainUnowned(IRGenFunction &IGF, Explosion &in,
                                   Atomicity atomicity) const = 0;

  /// Strongly retains a value that has come from a safe [unowned] reference.
  /// This operation is not supported for all reference types.
  virtual void strongRetainUnownedRelease(IRGenFunction &IGF,
                                          Explosion &in,
                                          Atomicity atomicity) const = 0;

  /// Weakly retains a value in the manner of a safe [unowned] reference.
  /// This operation is not supported for all reference types.
  virtual void unownedRetain(IRGenFunction &IGF, Explosion &in,
                             Atomicity atomicity) const = 0;

  /// Weakly releases a value in the manner of a safe [unowned] reference.
  /// This operation is not supported for all reference types.
  virtual void unownedRelease(IRGenFunction &IGF, Explosion &in,
                              Atomicity atomicity) const = 0;

  /// Load a reference from a safe [unowned] reference in memory and
  /// destroy the [unowned] location.
  virtual void unownedTakeStrong(IRGenFunction &IGF, Address addr,
                                 Explosion &out) const = 0;

  /// Load a reference from a safe [unowned] reference in memory.
  virtual void unownedLoadStrong(IRGenFunction &IGF, Address addr,
                                 Explosion &out) const = 0;

  /// Initialize a safe [unowned] reference in memory.
  virtual void unownedInit(IRGenFunction &IGF, Explosion &in,
                           Address dest) const = 0;

  /// Assign to an initialized safe [unowned] reference in memory.
  virtual void unownedAssign(IRGenFunction &IGF, Explosion &in,
                             Address dest) const = 0;

  /// Produce the storage information for [weak] storage.
  virtual const WeakTypeInfo *createWeakStorageType(TypeConverter &TC) const = 0;

  /// Produce the storage information for [unowned] storage.
  ///
  /// The reference-counting operations done by the value operations
  /// on the [unowned] storage type are assumed to be basically the
  /// same operations as weakRetain and weakRelease.
  virtual const TypeInfo *createUnownedStorageType(TypeConverter &TC)
    const = 0;

  /// Produce the storage information for @unowned(unsafe) storage.
  virtual const TypeInfo *createUnmanagedStorageType(TypeConverter &TC)
    const = 0;

  static bool classof(const ReferenceTypeInfo *type) { return true; }
  static bool classof(const TypeInfo *type) {
    return type->getSpecialTypeInfoKind() == SpecialTypeInfoKind::Reference;
  }
};

}
}

#endif
