dev #2
3 changed files with 155 additions and 0 deletions
51
src/opt/hdf5/include/h5_dataset.h
Normal file
51
src/opt/hdf5/include/h5_dataset.h
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
|
||||||
|
#ifndef __cxz_h5_dataset_h__
|
||||||
|
#define __cxz_h5_dataset_h__
|
||||||
|
|
||||||
|
#include "h5_types.h"
|
||||||
|
#include "h5_content_base.h"
|
||||||
|
|
||||||
|
namespace CNORXZ
|
||||||
|
{
|
||||||
|
namespace hdf5
|
||||||
|
{
|
||||||
|
class Dataset : public ContentBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DEFAULT_MEMBERS(Dataset);
|
||||||
|
Dataset(const String& name, const ContentBase* _parent);
|
||||||
|
~Dataset();
|
||||||
|
|
||||||
|
virtual ContentType type() const override final;
|
||||||
|
virtual bool ro() const override final;
|
||||||
|
virtual Dataset& open() override final;
|
||||||
|
virtual Dataset& close() override final;
|
||||||
|
virtual String path() const override final;
|
||||||
|
virtual String filename() const override final;
|
||||||
|
|
||||||
|
bool exists() const;
|
||||||
|
|
||||||
|
Dataset& init(const RangePtr& dataRange, hid_t type);
|
||||||
|
|
||||||
|
const RangePtr& dataRange() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
RangePtr mDataRange;
|
||||||
|
hid_t mType;
|
||||||
|
hid_t mFilespace;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class SDataset : public Dataset
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DEFAULT_MEMBERS(SDataset);
|
||||||
|
SDataset(const String& name, const ContentBase* _parent);
|
||||||
|
|
||||||
|
MArray<T> read() const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -4,6 +4,7 @@ set(libcnorxzhdf5_a_SOURCES
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/h5_file.cc
|
${CMAKE_CURRENT_SOURCE_DIR}/h5_file.cc
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/h5_group.cc
|
${CMAKE_CURRENT_SOURCE_DIR}/h5_group.cc
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/h5_table.cc
|
${CMAKE_CURRENT_SOURCE_DIR}/h5_table.cc
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/h5_dataset.cc
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(cnorxzhdf5_obj OBJECT
|
add_library(cnorxzhdf5_obj OBJECT
|
||||||
|
|
103
src/opt/hdf5/lib/h5_dataset.cc
Normal file
103
src/opt/hdf5/lib/h5_dataset.cc
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
|
||||||
|
#include "h5_dataset.h"
|
||||||
|
|
||||||
|
namespace CNORXZ
|
||||||
|
{
|
||||||
|
namespace hdf5
|
||||||
|
{
|
||||||
|
Dataset::Dataset(const String& name, const ContentBase* _parent) :
|
||||||
|
ContentBase(name, _parent)
|
||||||
|
{
|
||||||
|
if(exists()){
|
||||||
|
open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Dataset::~Dataset()
|
||||||
|
{
|
||||||
|
this->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
ContentType Dataset::type() const
|
||||||
|
{
|
||||||
|
return ContentType::DSET;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Dataset::ro() const
|
||||||
|
{
|
||||||
|
return mParent->ro();
|
||||||
|
}
|
||||||
|
|
||||||
|
Dataset& Dataset::open()
|
||||||
|
{
|
||||||
|
if(mId == 0 and exists()){
|
||||||
|
mId = H5Dopen(mParent->id(), mName.c_str(), H5P_DEFAULT);
|
||||||
|
mType = H5Dget_type(mId);
|
||||||
|
|
||||||
|
mFilespace = H5Dget_space(mId);
|
||||||
|
SizeT ndims = H5Sget_simple_extent_ndims(mFilespace);
|
||||||
|
Vector<hsize_t> dims(ndims);
|
||||||
|
H5Sget_simple_extent_dims(mFilespace, dims.data(), nullptr);
|
||||||
|
|
||||||
|
Vector<RangePtr> rs(ndims);
|
||||||
|
for(SizeT i = 0; i != ndims; ++i){
|
||||||
|
rs[i] = CRangeFactory(dims[i]).create();
|
||||||
|
}
|
||||||
|
mDataRange = yrange(rs);
|
||||||
|
|
||||||
|
// use when reading!!!:
|
||||||
|
//hid_t mem_space_id = H5Screate_simple(static_cast<hsize_t>(ndims), dims.data(), nullptr);
|
||||||
|
//hid_t xfer_plist_id = H5Pcreate(H5P_DATASET_XFER);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dataset& Dataset::close()
|
||||||
|
{
|
||||||
|
if(mId != 0){
|
||||||
|
//!!!
|
||||||
|
H5Sclose(mFilespace);
|
||||||
|
H5Tclose(mType);
|
||||||
|
H5Dclose(mId);
|
||||||
|
mId = 0;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
String Dataset::path() const
|
||||||
|
{
|
||||||
|
return mParent->path() + "/" + mName;
|
||||||
|
}
|
||||||
|
|
||||||
|
String Dataset::filename() const
|
||||||
|
{
|
||||||
|
return mParent->filename();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Dataset::exists() const
|
||||||
|
{
|
||||||
|
return H5Lexists(mParent->id(), mName.c_str(), H5P_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
Dataset& Dataset::init(const RangePtr& dataRange, hid_t type)
|
||||||
|
{
|
||||||
|
// check if type is valid type!!!
|
||||||
|
const hid_t dcpl_id = H5Pcreate(H5P_DATASET_CREATE);
|
||||||
|
// TODO: all sub-ranges explicity!!!:
|
||||||
|
const SizeT ndim = dataRange->dim();
|
||||||
|
Vector<hsize_t> exts(ndim);
|
||||||
|
mFilespace = H5Screate_simple(ndim, exts.data(), NULL);
|
||||||
|
mType = type;
|
||||||
|
mId = H5Dcreate(mParent->id(), mName.c_str(), mType, mFilespace,
|
||||||
|
H5P_DEFAULT, dcpl_id, H5P_DEFAULT);
|
||||||
|
H5Pclose(dcpl_id);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const RangePtr& Dataset::dataRange() const
|
||||||
|
{
|
||||||
|
return mDataRange;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue