// // Created by patrik on 10.08.17. // #ifndef GRASP_SEGMENTER_HDFFILE_H #define GRASP_SEGMENTER_HDFFILE_H #include #include #include #include namespace hdf4cpp { class HdfFile { public: HdfFile(const std::string& path); ~HdfFile(); bool isValid(); HdfItem get(const std::string& name); std::vector getAll(const std::string& name); HdfAttribute getAttribute(const std::string& name); class Iterator; Iterator begin() const; Iterator end() const; private: int32 getDatasetId(const std::string& name); int32 getGroupId(const std::string& name); int32 getDataId(const std::string& name); std::vector getDatasetIds(const std::string& name); std::vector getGroupIds(const std::string& name); std::vector getDataIds(const std::string& name); int32 sId; int32 vId; std::vector > loneRefs; }; class HdfFile::Iterator : public std::iterator { public: Iterator(const HdfFile* file, int32 index) : file(file), index(index) {} bool operator!=(const Iterator& it) { return index != it.index; } bool operator==(const Iterator& it) { return index == it.index; } Iterator& operator++() { ++index; return *this; } Iterator operator++(int) { Iterator it(*this); ++index; return it; } Iterator& operator--() { --index; return *this; } Iterator operator--(int) { Iterator it(*this); --index; return it; } HdfItem operator*() { if(index < 0 || index >= file->loneRefs.size()) { throw std::runtime_error("HDF4CPP: cannot access invalid item"); } int32 ref = file->loneRefs[index].first; switch(file->loneRefs[index].second) { case VGROUP: { int32 id = Vattach(file->vId, ref, "r"); return HdfItem(new HdfGroupItem(id), file->sId, file->vId); } case VDATA: { int32 id = VSattach(file->vId, ref, "r"); return HdfItem(new HdfDataItem(id), file->sId, file->vId); } default: { return HdfItem(nullptr, file->sId, file->vId); } } } private: const HdfFile *file; int32 index; }; } #endif //GRASP_SEGMENTER_HDFFILE_H