/// Get the name without looking up long names.
llvm::StringRef getName() const;
- uint64_t getSize() const;
+ /// Members are not larger than 4GB.
+ uint32_t getSize() const;
};
-static const ArchiveMemberHeader *ToHeader(const char *base) {
- return reinterpret_cast<const ArchiveMemberHeader *>(base);
-}
-
class Archive : public Binary {
virtual void anchor();
public:
/// \brief Offset from Data to the start of the file.
uint16_t StartOfFile;
+ const ArchiveMemberHeader *getHeader() const {
+ return reinterpret_cast<const ArchiveMemberHeader *>(Data.data());
+ }
+
public:
- Child(const Archive *p, StringRef d);
+ Child(const Archive *Parent, const char *Start);
bool operator ==(const Child &other) const {
- return (Parent == other.Parent) && (Data.begin() == other.Data.begin());
+ assert(Parent == other.Parent);
+ return Data.begin() == other.Data.begin();
}
bool operator <(const Child &other) const {
Child getNext() const;
error_code getName(StringRef &Result) const;
- StringRef getRawName() const { return ToHeader(Data.data())->getName(); }
+ StringRef getRawName() const { return getHeader()->getName(); }
/// \return the size of the archive member without the header or padding.
uint64_t getSize() const { return Data.size() - StartOfFile; }
class child_iterator {
Child child;
public:
- child_iterator() : child(Child(0, StringRef())) {}
+ child_iterator() : child(Child(0, 0)) {}
child_iterator(const Child &c) : child(c) {}
const Child* operator->() const {
return &child;