File: BufferedHDFArray.cpp

package info (click to toggle)
pbseqlib 0~20161219-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 5,924 kB
  • ctags: 5,123
  • sloc: cpp: 82,727; makefile: 305; python: 239; sh: 8
file content (92 lines) | stat: -rw-r--r-- 3,696 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "BufferedHDFArray.hpp"

/*
 *
 * Implementation of a 1-D array for IO from an HDF array.
 * This is templated, but specialized for a few data types, so that 
 * the HDF data types do not need to be specified by anybody.
 *
 *  Two examples of the usage of this class follow:
 *
 *	HDFArray<int> nElemArray;
 * 	nElemArray.Initialize(hdfFile, "PulseData/BaseCalls/ZMW/NumEvent");
 *  nElemArray.Read(i, i+1, &nElem);
 *
 * 	HDFArray<unsigned char> qualArray;
 *	qualArray.Initialize(hdfFile, "PulseData/BaseCalls/QualityValue");
 *  qualArray.Read(cur, cur + nElem, qual);
 *
 */

//
// Type specializations for some standard types. Use the macro for
// vanilla specializations (that only require the HDF type ID to be
// specified). 
//
#define DEFINE_TYPED_READ_ARRAY(T, Pred) template<>  \
   	void BufferedHDFArray<T>::Read(DSLength start, DSLength end, T* dest) { \
   	Read(start,end, Pred, dest); \
	}

DEFINE_TYPED_READ_ARRAY(int, H5::PredType::NATIVE_INT)
DEFINE_TYPED_READ_ARRAY(char, H5::PredType::NATIVE_INT8)
DEFINE_TYPED_READ_ARRAY(unsigned char, H5::PredType::NATIVE_UINT8)
DEFINE_TYPED_READ_ARRAY(unsigned int, H5::PredType::NATIVE_UINT)
DEFINE_TYPED_READ_ARRAY(uint16_t, H5::PredType::NATIVE_UINT16)
DEFINE_TYPED_READ_ARRAY(float, H5::PredType::NATIVE_FLOAT)
DEFINE_TYPED_READ_ARRAY(char*, H5::PredType::C_S1)


#define DEFINE_TYPED_READ_DATASET(T, Pred) template<> \
	void BufferedHDFArray<T>::ReadDataset(std::vector<T> &dest) { \
	dest.resize(arrayLength); \
  Read(0, arrayLength, Pred, &dest[0]); \
}

DEFINE_TYPED_READ_DATASET(int, H5::PredType::NATIVE_INT)
DEFINE_TYPED_READ_DATASET(char, H5::PredType::NATIVE_INT8)
DEFINE_TYPED_READ_DATASET(unsigned char, H5::PredType::NATIVE_UINT8)
DEFINE_TYPED_READ_DATASET(unsigned int, H5::PredType::NATIVE_UINT)
DEFINE_TYPED_READ_DATASET(uint16_t, H5::PredType::NATIVE_UINT16)
DEFINE_TYPED_READ_DATASET(float, H5::PredType::NATIVE_FLOAT)
DEFINE_TYPED_READ_DATASET(char*, H5::PredType::C_S1)


#define DEFINE_TYPED_CREATE_ARRAY(T, Pred) template<> \
	void BufferedHDFArray<T>::TypedCreate(H5::DataSpace &fileSpace, H5::DSetCreatPropList &cparms) { \
	T zero; zero = 0;\
	cparms.setFillValue(Pred, &zero);\
	dataset = container->createDataSet(datasetName.c_str(), Pred, fileSpace, cparms); \
}

DEFINE_TYPED_CREATE_ARRAY(int, H5::PredType::NATIVE_INT)
DEFINE_TYPED_CREATE_ARRAY(char, H5::PredType::NATIVE_INT8)
DEFINE_TYPED_CREATE_ARRAY(char*, H5::StrType(0,H5T_VARIABLE))
DEFINE_TYPED_CREATE_ARRAY(unsigned char, H5::PredType::NATIVE_UINT8)
DEFINE_TYPED_CREATE_ARRAY(unsigned int, H5::PredType::NATIVE_UINT)
DEFINE_TYPED_CREATE_ARRAY(float, H5::PredType::NATIVE_FLOAT)
DEFINE_TYPED_CREATE_ARRAY(uint16_t, H5::PredType::NATIVE_UINT16)

template<>
void BufferedHDFArray<string>::TypedCreate(H5::DataSpace &space, H5::DSetCreatPropList &cparms) {
    H5::StrType varStrType(0,H5T_VARIABLE);
    dataset = container->createDataSet(datasetName.c_str(), varStrType, space, cparms);
}


#define DEFINE_TYPED_WRITE_ARRAY(T, Pred) template<> \
void BufferedHDFArray<T>::TypedWrite(const T *data, \
    const H5::DataSpace &memorySpace, const H5::DataSpace &fileSpace) { \
    dataset.write(data, Pred, memorySpace, fileSpace); \
}

DEFINE_TYPED_WRITE_ARRAY(int, H5::PredType::NATIVE_INT)
DEFINE_TYPED_WRITE_ARRAY(unsigned int, H5::PredType::NATIVE_UINT)
DEFINE_TYPED_WRITE_ARRAY(unsigned char, H5::PredType::NATIVE_UINT8)
DEFINE_TYPED_WRITE_ARRAY(char, H5::PredType::NATIVE_INT8)
DEFINE_TYPED_WRITE_ARRAY(float, H5::PredType::NATIVE_FLOAT)
DEFINE_TYPED_WRITE_ARRAY(uint16_t, H5::PredType::NATIVE_UINT16)
DEFINE_TYPED_WRITE_ARRAY(char*, H5::StrType(0,H5T_VARIABLE))
DEFINE_TYPED_WRITE_ARRAY(std::string, H5::StrType(0,H5T_VARIABLE))