//===--- 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, STIK_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() == STIK_Reference;
  }
};

}
}

#endif
