//===--- ProgramImpl.h - Internal Program implementation---------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  Internal implementation for the Program class
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CLANG_INDEX_PROGRAMIMPL_H
#define LLVM_CLANG_INDEX_PROGRAMIMPL_H

#include "EntityImpl.h"
#include "clang/Basic/IdentifierTable.h"
#include "clang/Basic/LangOptions.h"

namespace clang {

namespace idx {
  class EntityListener;

class ProgramImpl {
public:
  typedef llvm::FoldingSet<EntityImpl> EntitySetTy;

private:
  EntitySetTy Entities;
  llvm::BumpPtrAllocator BumpAlloc;
  
  IdentifierTable Identifiers;
  SelectorTable Selectors;

  ProgramImpl(const ProgramImpl&); // do not implement
  ProgramImpl &operator=(const ProgramImpl &); // do not implement
  
public:
  ProgramImpl() : Identifiers(LangOptions()) { }
  
  EntitySetTy &getEntities() { return Entities; }
  IdentifierTable &getIdents() { return Identifiers; }
  SelectorTable &getSelectors() { return Selectors; }

  void *Allocate(unsigned Size, unsigned Align = 8) {
    return BumpAlloc.Allocate(Size, Align);
  }
};

} // namespace idx

} // namespace clang

#endif
