1318663Sdim//===- TypeCollection.h - A collection of CodeView type records -*- C++ -*-===//
2318663Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6318663Sdim//
7318663Sdim//===----------------------------------------------------------------------===//
8318663Sdim
9318663Sdim#ifndef LLVM_DEBUGINFO_CODEVIEW_TYPECOLLECTION_H
10318663Sdim#define LLVM_DEBUGINFO_CODEVIEW_TYPECOLLECTION_H
11318663Sdim
12318663Sdim#include "llvm/ADT/StringRef.h"
13318663Sdim
14318663Sdim#include "llvm/DebugInfo/CodeView/TypeIndex.h"
15318663Sdim#include "llvm/DebugInfo/CodeView/TypeRecord.h"
16318663Sdim
17318663Sdimnamespace llvm {
18318663Sdimnamespace codeview {
19318663Sdimclass TypeCollection {
20318663Sdimpublic:
21318663Sdim  virtual ~TypeCollection() = default;
22318663Sdim
23318663Sdim  bool empty() { return size() == 0; }
24318663Sdim
25318663Sdim  virtual Optional<TypeIndex> getFirst() = 0;
26318663Sdim  virtual Optional<TypeIndex> getNext(TypeIndex Prev) = 0;
27318663Sdim
28318663Sdim  virtual CVType getType(TypeIndex Index) = 0;
29318663Sdim  virtual StringRef getTypeName(TypeIndex Index) = 0;
30318663Sdim  virtual bool contains(TypeIndex Index) = 0;
31318663Sdim  virtual uint32_t size() = 0;
32318663Sdim  virtual uint32_t capacity() = 0;
33327952Sdim
34327952Sdim  template <typename TFunc> void ForEachRecord(TFunc Func) {
35327952Sdim    Optional<TypeIndex> Next = getFirst();
36327952Sdim
37327952Sdim    while (Next.hasValue()) {
38327952Sdim      TypeIndex N = *Next;
39327952Sdim      Func(N, getType(N));
40327952Sdim      Next = getNext(N);
41327952Sdim    }
42327952Sdim  }
43318663Sdim};
44318663Sdim}
45318663Sdim}
46318663Sdim
47318663Sdim#endif
48