123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- //
- // Created by patrik on 11.08.17.
- //
- #ifndef HDF4CPP_HDFATTRIBUTE_H
- #define HDF4CPP_HDFATTRIBUTE_H
- #include <hdf4cpp/HdfException.h>
- #include <hdf4cpp/HdfObject.h>
- #include <hdf/hdf.h>
- #include <hdf/mfhdf.h>
- #include <string>
- #include <vector>
- #include <map>
- #include <memory>
- namespace hdf4cpp {
- class HdfAttributeBase : public HdfObject {
- public:
- HdfAttributeBase(int32 id, int32 index, Type type) : HdfObject(type, ATTRIBUTE), id(id), index(index) {
- if(id == FAIL || index == FAIL) {
- raiseException(INVALID_ID);
- }
- }
- virtual ~HdfAttributeBase() {}
- virtual intn size() const = 0;
- template <class T> void get(std::vector<T> &dest) {
- intn length = size();
- auto it = typeSizeMap.find(getDataType());
- if (it != typeSizeMap.end()) {
- if ((size_t) it->second != sizeof(T)) {
- raiseException(BUFFER_SIZE_NOT_ENOUGH);
- }
- dest.resize(length);
- get(dest.data());
- } else {
- raiseException(INVALID_DATA_TYPE);
- }
- }
- protected:
- int32 id;
- int32 index;
- virtual void get(void *dest) = 0;
- virtual int32 getDataType() const = 0;
- };
- class HdfDatasetAttribute : public HdfAttributeBase {
- public:
- HdfDatasetAttribute(int32 id, const std::string& name);
- intn size() const;
- private:
- intn _size;
- int32 dataType;
- void get(void *dest);
- int32 getDataType() const;
- };
- class HdfGroupAttribute : public HdfAttributeBase {
- public:
- HdfGroupAttribute(int32 id, const std::string& name);
- intn size() const;
- private:
- intn _size;
- int32 dataType;
- void get(void *dest);
- int32 getDataType() const;
- };
- class HdfDataAttribute : public HdfAttributeBase {
- public:
- HdfDataAttribute(int32 id, const std::string& name);
- intn size() const;
- private:
- intn _size;
- int32 dataType;
- void get(void *dest);
- int32 getDataType() const;
- };
- class HdfAttribute : public HdfObject {
- public:
- HdfAttribute(HdfAttributeBase *attribute) : HdfObject(attribute->getType(), attribute->getClassType()), attribute(attribute) {}
- HdfAttribute(const HdfAttribute&) = delete;
- HdfAttribute(HdfAttribute&& attr);
- HdfAttribute& operator=(const HdfAttribute& attribute) = delete;
- HdfAttribute& operator=(HdfAttribute&& attribute);
- Type getType() const;
- intn size() const;
- template <class T> void get(std::vector<T> &dest) {
- attribute->get(dest);
- }
- private:
- std::unique_ptr<HdfAttributeBase> attribute;
- };
- }
- #endif //HDF4CPP_HDFATTRIBUTE_H
|