Home | History | Annotate | Download | only in PDB
      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