// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef VM_VISITOR_H_
#define VM_VISITOR_H_

#include "vm/globals.h"

namespace dart {

// Forward declarations.
class Isolate;
class RawObject;

// An object pointer visitor interface.
class ObjectPointerVisitor {
 public:
  explicit ObjectPointerVisitor(Isolate* isolate) : isolate_(isolate) {}
  virtual ~ObjectPointerVisitor() {}

  Isolate* isolate() const { return isolate_; }

  // Range of pointers to visit 'first' <= pointer <= 'last'.
  virtual void VisitPointers(RawObject** first, RawObject** last) = 0;

  // len argument is the number of pointers to visit starting from 'p'.
  void VisitPointers(RawObject** p, intptr_t len) {
    VisitPointers(p, (p + len - 1));
  }

  void VisitPointer(RawObject** p) { VisitPointers(p , p); }

 private:
  Isolate* isolate_;

  DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectPointerVisitor);
};


// An object visitor interface.
class ObjectVisitor {
 public:
  explicit ObjectVisitor(Isolate* isolate) : isolate_(isolate) {}

  virtual ~ObjectVisitor() {}

  Isolate* isolate() const { return isolate_; }

  // Invoked for each object.
  virtual void VisitObject(RawObject* obj) = 0;

 private:
  Isolate* isolate_;

  DISALLOW_COPY_AND_ASSIGN(ObjectVisitor);
};


// An object finder visitor interface.
class FindObjectVisitor {
 public:
  explicit FindObjectVisitor(Isolate* isolate) : isolate_(isolate) {}
  virtual ~FindObjectVisitor() {}

  // Check if object matches find condition.
  virtual bool FindObject(RawObject* obj) = 0;

 private:
  Isolate* isolate_;

  DISALLOW_IMPLICIT_CONSTRUCTORS(FindObjectVisitor);
};

}  // namespace dart

#endif  // VM_VISITOR_H_
