mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-09 21:50:45 +01:00
Binary IO also implemented and tested
This commit is contained in:
parent
c14547ddbe
commit
982a24514b
@ -51,6 +51,8 @@ namespace Grid {
|
|||||||
template <typename U>
|
template <typename U>
|
||||||
void writeDefault(const std::string &s, const std::vector<U> &x);
|
void writeDefault(const std::string &s, const std::vector<U> &x);
|
||||||
void writeDefault(const std::string &s, const char *x);
|
void writeDefault(const std::string &s, const char *x);
|
||||||
|
template <typename U>
|
||||||
|
void writeMultiDim(const std::string &s, const std::vector<size_t> & Dimensions, const U * pDataRowMajor, size_t NumElements);
|
||||||
private:
|
private:
|
||||||
std::ofstream file_;
|
std::ofstream file_;
|
||||||
};
|
};
|
||||||
@ -66,6 +68,8 @@ namespace Grid {
|
|||||||
void readDefault(const std::string &s, U &output);
|
void readDefault(const std::string &s, U &output);
|
||||||
template <typename U>
|
template <typename U>
|
||||||
void readDefault(const std::string &s, std::vector<U> &output);
|
void readDefault(const std::string &s, std::vector<U> &output);
|
||||||
|
template <typename U>
|
||||||
|
void readMultiDim(const std::string &s, std::vector<U> &buf, std::vector<size_t> &dim);
|
||||||
private:
|
private:
|
||||||
std::ifstream file_;
|
std::ifstream file_;
|
||||||
};
|
};
|
||||||
@ -92,6 +96,27 @@ namespace Grid {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename U>
|
||||||
|
void BinaryWriter::writeMultiDim(const std::string &s, const std::vector<size_t> & Dimensions, const U * pDataRowMajor, size_t NumElements)
|
||||||
|
{
|
||||||
|
uint64_t rank = static_cast<uint64_t>( Dimensions.size() );
|
||||||
|
uint64_t tmp = 1;
|
||||||
|
for( auto i = 0 ; i < rank ; i++ )
|
||||||
|
tmp *= Dimensions[i];
|
||||||
|
assert( tmp == NumElements && "Dimensions don't match size of data being written" );
|
||||||
|
// Total number of elements
|
||||||
|
write("", tmp);
|
||||||
|
// Number of dimensions
|
||||||
|
write("", rank);
|
||||||
|
// Followed by each dimension
|
||||||
|
for( auto i = 0 ; i < rank ; i++ ) {
|
||||||
|
tmp = Dimensions[i];
|
||||||
|
write("", tmp);
|
||||||
|
}
|
||||||
|
for( auto i = 0; i < NumElements; ++i)
|
||||||
|
write("", pDataRowMajor[i]);
|
||||||
|
}
|
||||||
|
|
||||||
// Reader template implementation ////////////////////////////////////////////
|
// Reader template implementation ////////////////////////////////////////////
|
||||||
template <typename U>
|
template <typename U>
|
||||||
void BinaryReader::readDefault(const std::string &s, U &output)
|
void BinaryReader::readDefault(const std::string &s, U &output)
|
||||||
@ -114,6 +139,30 @@ namespace Grid {
|
|||||||
read("", output[i]);
|
read("", output[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename U>
|
||||||
|
void BinaryReader::readMultiDim(const std::string &s, std::vector<U> &buf, std::vector<size_t> &dim)
|
||||||
|
{
|
||||||
|
// Number of elements
|
||||||
|
uint64_t NumElements;
|
||||||
|
read("", NumElements);
|
||||||
|
// Number of dimensions
|
||||||
|
uint64_t rank;
|
||||||
|
read("", rank);
|
||||||
|
// Followed by each dimension
|
||||||
|
uint64_t count = 1;
|
||||||
|
dim.resize(rank);
|
||||||
|
uint64_t tmp;
|
||||||
|
for( auto i = 0 ; i < rank ; i++ ) {
|
||||||
|
read("", tmp);
|
||||||
|
dim[i] = tmp;
|
||||||
|
count *= tmp;
|
||||||
|
}
|
||||||
|
assert( count == NumElements && "Dimensions don't match size of data being read" );
|
||||||
|
buf.resize(count);
|
||||||
|
for( auto i = 0; i < count; ++i)
|
||||||
|
read("", buf[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -159,9 +159,11 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define RDR_ Hdf5Reader
|
||||||
|
#define WTR_ Hdf5Writer
|
||||||
#define TensorWriteReadInnerNoInit( T ) \
|
#define TensorWriteReadInnerNoInit( T ) \
|
||||||
filename = "iotest_"s + std::to_string(++TestNum) + "_" #T ".h5"; \
|
filename = "iotest_"s + std::to_string(++TestNum) + "_" #T ".h5"; \
|
||||||
ioTest<Hdf5Writer, Hdf5Reader, T>(filename, t, #T, #T);
|
ioTest<WTR_, RDR_, T>(filename, t, #T, #T);
|
||||||
#define TensorWriteReadInner( T ) SequentialInit( t ); TensorWriteReadInnerNoInit( T )
|
#define TensorWriteReadInner( T ) SequentialInit( t ); TensorWriteReadInnerNoInit( T )
|
||||||
#define TensorWriteRead( T ) { T t ; TensorWriteReadInner( T ) }
|
#define TensorWriteRead( T ) { T t ; TensorWriteReadInner( T ) }
|
||||||
#define TensorWriteReadV(T, ... ) { T t( __VA_ARGS__ ); TensorWriteReadInner( T ) }
|
#define TensorWriteReadV(T, ... ) { T t( __VA_ARGS__ ); TensorWriteReadInner( T ) }
|
||||||
@ -183,7 +185,7 @@ void EigenHdf5IOTest(void)
|
|||||||
TensorWriteReadInner ( TensorRank5UShort );
|
TensorWriteReadInner ( TensorRank5UShort );
|
||||||
std::cout << " Testing alternate memory order read ... ";
|
std::cout << " Testing alternate memory order read ... ";
|
||||||
TensorRank5UShortAlt t2;
|
TensorRank5UShortAlt t2;
|
||||||
Hdf5Reader reader(filename);
|
RDR_ reader(filename);
|
||||||
read(reader, "TensorRank5UShort", t2);
|
read(reader, "TensorRank5UShort", t2);
|
||||||
bool good = true;
|
bool good = true;
|
||||||
for_all( t2, [&](unsigned short c, unsigned short n,
|
for_all( t2, [&](unsigned short c, unsigned short n,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user