1 //===- ConcreteSymbolEnumerator.h -------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_DEBUGINFO_PDB_CONCRETESYMBOLENUMERATOR_H
11 #define LLVM_DEBUGINFO_PDB_CONCRETESYMBOLENUMERATOR_H
14 #include "IPDBEnumChildren.h"
18 template <typename ChildType>
19 class ConcreteSymbolEnumerator : public IPDBEnumChildren<ChildType> {
21 ConcreteSymbolEnumerator(std::unique_ptr<IPDBEnumSymbols> SymbolEnumerator)
22 : Enumerator(std::move(SymbolEnumerator)) {}
24 virtual ~ConcreteSymbolEnumerator() {}
26 uint32_t getChildCount() const override {
27 return Enumerator->getChildCount();
30 std::unique_ptr<ChildType> getChildAtIndex(uint32_t Index) const {
31 std::unique_ptr<PDBSymbol> Child = Enumerator->getChildAtIndex(Index);
32 return make_concrete_child(std::move(Child));
35 std::unique_ptr<ChildType> getNext() {
36 std::unique_ptr<PDBSymbol> Child = Enumerator->getNext();
37 return make_concrete_child(std::move(Child));
40 void reset() { Enumerator->reset(); }
42 MyType *clone() const {
43 std::unique_ptr<IPDBEnumSymbols> WrappedClone(Enumerator->clone());
44 return new ConcreteSymbolEnumerator<ChildType>(std::move(WrappedClone));
48 std::unique_ptr<ChildType>
49 make_concrete_child(std::unique_ptr<PDBSymbol> Child) const {
50 ChildType *ConcreteChild = dyn_cast_or_null<ChildType>(Child.release());
51 return std::unique_ptr<ChildType>(ConcreteChild);
54 std::unique_ptr<IPDBEnumSymbols> Enumerator;