1//===- ConcreteSymbolEnumerator.h -------------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef LLVM_DEBUGINFO_PDB_CONCRETESYMBOLENUMERATOR_H 10#define LLVM_DEBUGINFO_PDB_CONCRETESYMBOLENUMERATOR_H 11 12#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" 13#include "llvm/DebugInfo/PDB/PDBTypes.h" 14#include "llvm/Support/Casting.h" 15#include <algorithm> 16#include <cstdint> 17#include <memory> 18 19namespace llvm { 20namespace pdb { 21 22template <typename ChildType> 23class ConcreteSymbolEnumerator : public IPDBEnumChildren<ChildType> { 24public: 25 ConcreteSymbolEnumerator(std::unique_ptr<IPDBEnumSymbols> SymbolEnumerator) 26 : Enumerator(std::move(SymbolEnumerator)) {} 27 28 ~ConcreteSymbolEnumerator() override = default; 29 30 uint32_t getChildCount() const override { 31 return Enumerator->getChildCount(); 32 } 33 34 std::unique_ptr<ChildType> getChildAtIndex(uint32_t Index) const override { 35 std::unique_ptr<PDBSymbol> Child = Enumerator->getChildAtIndex(Index); 36 return unique_dyn_cast_or_null<ChildType>(Child); 37 } 38 39 std::unique_ptr<ChildType> getNext() override { 40 return unique_dyn_cast_or_null<ChildType>(Enumerator->getNext()); 41 } 42 43 void reset() override { Enumerator->reset(); } 44 45private: 46 47 std::unique_ptr<IPDBEnumSymbols> Enumerator; 48}; 49 50} // end namespace pdb 51} // end namespace llvm 52 53#endif // LLVM_DEBUGINFO_PDB_CONCRETESYMBOLENUMERATOR_H 54