//===-- DiffLog.h - Difference Log Builder and accessories ------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This header defines the interface to the LLVM difference log builder.
//
//===----------------------------------------------------------------------===//

#ifndef _LLVM_DIFFLOG_H_
#define _LLVM_DIFFLOG_H_

#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"

namespace llvm {
  class Instruction;
  class Value;
  class Consumer;

  /// Trichotomy assumption
  enum DiffChange { DC_match, DC_left, DC_right };

  /// A temporary-object class for building up log messages.
  class LogBuilder {
    Consumer &consumer;

    /// The use of a stored StringRef here is okay because
    /// LogBuilder should be used only as a temporary, and as a
    /// temporary it will be destructed before whatever temporary
    /// might be initializing this format.
    StringRef Format;

    SmallVector<Value*, 4> Arguments;

  public:
    LogBuilder(Consumer &c, StringRef Format)
      : consumer(c), Format(Format) {}

    LogBuilder &operator<<(Value *V) {
      Arguments.push_back(V);
      return *this;
    }

    ~LogBuilder();

    StringRef getFormat() const;
    unsigned getNumArguments() const;
    Value *getArgument(unsigned I) const;
  };

  /// A temporary-object class for building up diff messages.
  class DiffLogBuilder {
    typedef std::pair<Instruction*,Instruction*> DiffRecord;
    SmallVector<DiffRecord, 20> Diff;

    Consumer &consumer;

  public:
    DiffLogBuilder(Consumer &c) : consumer(c) {}
    ~DiffLogBuilder();

    void addMatch(Instruction *L, Instruction *R);
    // HACK: VS 2010 has a bug in the stdlib that requires this.
    void addLeft(Instruction *L);
    void addRight(Instruction *R);

    unsigned getNumLines() const;
    DiffChange getLineKind(unsigned I) const;
    Instruction *getLeft(unsigned I) const;
    Instruction *getRight(unsigned I) const;
  };

}

#endif
