NoQ added a comment.

Here's some pseudo-code of the way i see it.

  // This interface mimics CloneDetector's interface, hence omnipotent but 
useless.
  
  class BasicConstraint {
  public:
    virtual void add(const StmtSequence &S) = 0;
    virtual vector<CloneGroup> findClones() = 0;
  };

  // This constraint separates statements by their hash values.
  // Useful for the first pass, when we can't afford the number of sequences
  // to slow us down.
  
  class HashingConstraint: public BasicConstraint {
    map<hash_t, CloneGroup> M;
  
  public:
    virtual hash_t hash(const StmtSequence &S) = 0;
  
    virtual void add(const StmtSequence &S) override {
      M[hash(S)].append(S);
    }
    virtual vector<CloneGroup> findClones() override {
      vector<CloneGroup> V;
      for (I in M)
        V.append(I.second);
      return V;
    }
  };

  // This interface does pairwise comparisons via the provided compare() 
function.
  // Quadratic but easy to use for later passes.
  
  class ComparingConstraint {
    vector<CloneGroup> V;
  
  public:
    virtual void compare(const StmtSequence &LHS, const StmtSequence &RHS) = 0;
  
    virtual void add(const StmtSequence &S) override {
      for (auto G in V) {
        if (compare(G[0], S))
          G.append(S);
        else
          V[V.length()].append(S);
      }
    }
    vector<CloneGroup> findClones() override {
      return V;
    }
  };

And inherit custom constraints from these building blocks, probably provide 
more building blocks.


https://reviews.llvm.org/D23418



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to