//===--------------------- SourceMgr.h --------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
/// \file
/// This file implements class SourceMgr. Class SourceMgr abstracts the input
/// code sequence (a sequence of MCInst), and assings unique identifiers to
/// every instruction in the sequence.
///
//===----------------------------------------------------------------------===//

#ifndef LLVM_MCA_SOURCEMGR_H
#define LLVM_MCA_SOURCEMGR_H

#include "llvm/ADT/ArrayRef.h"

namespace llvm {
namespace mca {

class Instruction;

typedef std::pair<unsigned, const Instruction &> SourceRef;

class SourceMgr {
  using UniqueInst = std::unique_ptr<Instruction>;
  ArrayRef<UniqueInst> Sequence;
  unsigned Current;
  const unsigned Iterations;
  static const unsigned DefaultIterations = 100;

public:
  SourceMgr(ArrayRef<UniqueInst> S, unsigned Iter)
      : Sequence(S), Current(0), Iterations(Iter ? Iter : DefaultIterations) {}

  unsigned getNumIterations() const { return Iterations; }
  unsigned size() const { return Sequence.size(); }
  bool hasNext() const { return Current < (Iterations * Sequence.size()); }
  void updateNext() { ++Current; }

  SourceRef peekNext() const {
    assert(hasNext() && "Already at end of sequence!");
    return SourceRef(Current, *Sequence[Current % Sequence.size()]);
  }

  using const_iterator = ArrayRef<UniqueInst>::const_iterator;
  const_iterator begin() const { return Sequence.begin(); }
  const_iterator end() const { return Sequence.end(); }
};

} // namespace mca
} // namespace llvm

#endif // LLVM_MCA_SOURCEMGR_H
