- //===-- TapiUniversal.h - Text-based Dynamic Library Stub -------*- C++ -*-===// 
- // 
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
- // See https://llvm.org/LICENSE.txt for license information. 
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
- // 
- //===----------------------------------------------------------------------===// 
- // 
- // This file declares the TapiUniversal interface. 
- // 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_OBJECT_TAPIUNIVERSAL_H 
- #define LLVM_OBJECT_TAPIUNIVERSAL_H 
-   
- #include "llvm/ADT/StringRef.h" 
- #include "llvm/Object/Binary.h" 
- #include "llvm/Support/Error.h" 
- #include "llvm/Support/MemoryBufferRef.h" 
- #include "llvm/TextAPI/Architecture.h" 
- #include "llvm/TextAPI/InterfaceFile.h" 
-   
- namespace llvm { 
- namespace object { 
-   
- class TapiFile; 
-   
- class TapiUniversal : public Binary { 
- public: 
-   class ObjectForArch { 
-     const TapiUniversal *Parent; 
-     int Index; 
-   
-   public: 
-     ObjectForArch(const TapiUniversal *Parent, int Index) 
-         : Parent(Parent), Index(Index) {} 
-   
-     ObjectForArch getNext() const { return ObjectForArch(Parent, Index + 1); } 
-   
-     bool operator==(const ObjectForArch &Other) const { 
-       return (Parent == Other.Parent) && (Index == Other.Index); 
-     } 
-   
-     uint32_t getCPUType() const { 
-       auto Result = 
-           MachO::getCPUTypeFromArchitecture(Parent->Libraries[Index].Arch); 
-       return Result.first; 
-     } 
-   
-     uint32_t getCPUSubType() const { 
-       auto Result = 
-           MachO::getCPUTypeFromArchitecture(Parent->Libraries[Index].Arch); 
-       return Result.second; 
-     } 
-   
-     StringRef getArchFlagName() const { 
-       return MachO::getArchitectureName(Parent->Libraries[Index].Arch); 
-     } 
-   
-     std::string getInstallName() const { 
-       return std::string(Parent->Libraries[Index].InstallName); 
-     } 
-   
-     bool isTopLevelLib() const { 
-       return Parent->ParsedFile->getInstallName() == getInstallName(); 
-     } 
-   
-     Expected<std::unique_ptr<TapiFile>> getAsObjectFile() const; 
-   }; 
-   
-   class object_iterator { 
-     ObjectForArch Obj; 
-   
-   public: 
-     object_iterator(const ObjectForArch &Obj) : Obj(Obj) {} 
-     const ObjectForArch *operator->() const { return &Obj; } 
-     const ObjectForArch &operator*() const { return Obj; } 
-   
-     bool operator==(const object_iterator &Other) const { 
-       return Obj == Other.Obj; 
-     } 
-     bool operator!=(const object_iterator &Other) const { 
-       return !(*this == Other); 
-     } 
-   
-     object_iterator &operator++() { // Preincrement 
-       Obj = Obj.getNext(); 
-       return *this; 
-     } 
-   }; 
-   
-   TapiUniversal(MemoryBufferRef Source, Error &Err); 
-   static Expected<std::unique_ptr<TapiUniversal>> 
-   create(MemoryBufferRef Source); 
-   ~TapiUniversal() override; 
-   
-   object_iterator begin_objects() const { return ObjectForArch(this, 0); } 
-   object_iterator end_objects() const { 
-     return ObjectForArch(this, Libraries.size()); 
-   } 
-   
-   iterator_range<object_iterator> objects() const { 
-     return make_range(begin_objects(), end_objects()); 
-   } 
-   
-   const MachO::InterfaceFile &getInterfaceFile() { return *ParsedFile; } 
-   
-   uint32_t getNumberOfObjects() const { return Libraries.size(); } 
-   
-   static bool classof(const Binary *v) { return v->isTapiUniversal(); } 
-   
- private: 
-   struct Library { 
-     StringRef InstallName; 
-     MachO::Architecture Arch; 
-   }; 
-   
-   std::unique_ptr<MachO::InterfaceFile> ParsedFile; 
-   std::vector<Library> Libraries; 
- }; 
-   
- } // end namespace object. 
- } // end namespace llvm. 
-   
- #endif // LLVM_OBJECT_TAPIUNIVERSAL_H 
-