//===--- MetadataSourceBuilder.h - Metadata Source Builder ------*- 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
//
//===----------------------------------------------------------------------===//
//
// Implements utilities for constructing MetadataSources.
//
//===----------------------------------------------------------------------===//

#ifndef SWIFT_REFLECTION_METADATASOURCEBUILDER_H
#define SWIFT_REFLECTION_METADATASOURCEBUILDER_H

#include "swift/RemoteInspection/MetadataSource.h"

namespace swift {
namespace reflection {

class MetadataSourceBuilder {
  std::vector<std::unique_ptr<const MetadataSource>> MetadataSourcePool;
public:
  using Source = const MetadataSource *;

  MetadataSourceBuilder() {}

  MetadataSourceBuilder(const MetadataSourceBuilder &Other) = delete;
  MetadataSourceBuilder &operator=(const MetadataSourceBuilder &Other) = delete;

  template <typename MetadataSourceTy, typename... Args>
  MetadataSourceTy *make_source(Args... args) {
    auto MS = new MetadataSourceTy(::std::forward<Args>(args)...);
    MetadataSourcePool.push_back(std::unique_ptr<const MetadataSource>(MS));
    return MS;
  }

  const GenericArgumentMetadataSource *
  createGenericArgument(unsigned Index, const MetadataSource *Source) {
    return GenericArgumentMetadataSource::create(*this, Index, Source);
  }

  const MetadataCaptureMetadataSource *
  createMetadataCapture(unsigned Index) {
    return MetadataCaptureMetadataSource::create(*this, Index);
  }

  const ReferenceCaptureMetadataSource *
  createReferenceCapture(unsigned Index) {
    return ReferenceCaptureMetadataSource::create(*this, Index);
  }

  const ClosureBindingMetadataSource *
  createClosureBinding(unsigned Index) {
    return ClosureBindingMetadataSource::create(*this, Index);
  }

  const SelfMetadataSource *
  createSelf() {
    return SelfMetadataSource::create(*this);
  }

  const SelfWitnessTableMetadataSource *
  createSelfWitnessTable() {
    return SelfWitnessTableMetadataSource::create(*this);
  }
};

} // end namespace reflection
} // end namespace swift

#endif // SWIFT_REFLECTION_METADATASOURCEBUILDER_H
