1 //===- ConcreteSymbolEnumerator.h -------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_DEBUGINFO_PDB_CONCRETESYMBOLENUMERATOR_H 11 #define LLVM_DEBUGINFO_PDB_CONCRETESYMBOLENUMERATOR_H 12 13 #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" 14 #include "llvm/DebugInfo/PDB/PDBTypes.h" 15 #include "llvm/Support/Casting.h" 16 #include <algorithm> 17 #include <cstdint> 18 #include <memory> 19 20 namespace llvm { 21 namespace pdb { 22 23 template <typename ChildType> 24 class ConcreteSymbolEnumerator : public IPDBEnumChildren<ChildType> { 25 public: 26 ConcreteSymbolEnumerator(std::unique_ptr<IPDBEnumSymbols> SymbolEnumerator) 27 : Enumerator(std::move(SymbolEnumerator)) {} 28 29 ~ConcreteSymbolEnumerator() override = default; 30 31 uint32_t getChildCount() const override { 32 return Enumerator->getChildCount(); 33 } 34 35 std::unique_ptr<ChildType> getChildAtIndex(uint32_t Index) const override { 36 std::unique_ptr<PDBSymbol> Child = Enumerator->getChildAtIndex(Index); 37 return make_concrete_child(std::move(Child)); 38 } 39 40 std::unique_ptr<ChildType> getNext() override { 41 std::unique_ptr<PDBSymbol> Child = Enumerator->getNext(); 42 return make_concrete_child(std::move(Child)); 43 } 44 45 void reset() override { Enumerator->reset(); } 46 47 ConcreteSymbolEnumerator<ChildType> *clone() const override { 48 std::unique_ptr<IPDBEnumSymbols> WrappedClone(Enumerator->clone()); 49 return new ConcreteSymbolEnumerator<ChildType>(std::move(WrappedClone)); 50 } 51 52 private: 53 std::unique_ptr<ChildType> 54 make_concrete_child(std::unique_ptr<PDBSymbol> Child) const { 55 ChildType *ConcreteChild = dyn_cast_or_null<ChildType>(Child.release()); 56 return std::unique_ptr<ChildType>(ConcreteChild); 57 } 58 59 std::unique_ptr<IPDBEnumSymbols> Enumerator; 60 }; 61 62 } // end namespace pdb 63 } // end namespace llvm 64 65 #endif // LLVM_DEBUGINFO_PDB_CONCRETESYMBOLENUMERATOR_H 66