// Copyright (c) 2012, 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_CLASS_TABLE_H_
#define VM_CLASS_TABLE_H_

#include "platform/assert.h"
#include "vm/globals.h"

namespace dart {

class Class;
class ObjectPointerVisitor;
class RawClass;
class JSONStream;

class ClassTable {
 public:
  ClassTable();
  ~ClassTable();

  RawClass* At(intptr_t index) const {
    ASSERT(IsValidIndex(index));
    return table_[index];
  }

  intptr_t IsValidIndex(intptr_t index) const {
    return (index > 0) && (index < top_);
  }

  bool HasValidClassAt(intptr_t index) const {
    ASSERT(IsValidIndex(index));
    return table_[index] != NULL;
  }

  intptr_t NumCids() const { return top_; }

  void Register(const Class& cls);

  void VisitObjectPointers(ObjectPointerVisitor* visitor);

  void Print();

  void PrintToJSONStream(JSONStream* stream);

  static intptr_t table_offset() {
    return OFFSET_OF(ClassTable, table_);
  }

 private:
  static const int initial_capacity_ = 512;
  static const int capacity_increment_ = 256;

  intptr_t top_;
  intptr_t capacity_;

  RawClass** table_;

  DISALLOW_COPY_AND_ASSIGN(ClassTable);
};

}  // namespace dart

#endif  // VM_CLASS_TABLE_H_
