54 virtual std::string
name()
const = 0;
59 template <
typename T,
typename I>
64 const std::function<T(
I)>&,
65 const T default_value = T(),
69 H5::DataType
getType()
const override;
71 std::string
name()
const override;
78 template <
typename T,
typename I>
80 const std::function<T(
I)>& func,
81 const T default_value,
89 template <
typename T,
typename I>
95 template <
typename T,
typename I>
101 template <
typename T,
typename I>
105 template <
typename T,
typename I>
109 template <
typename T,
typename I>
125 template <
typename I>
127 template <
typename I>
133 template <
typename T>
134 void add(
const std::string& name,
const std::function<T(
I)>&,
135 const T& default_value = T(),
141 typename R=
decltype(std::declval<F>()(std::declval<I>())),
144 void add(
const std::string& name,
const F func,
const T& def = T(),
146 add<R>(name, std::function<R(
I)>(std::move(func)), R(def), comp);
153 template <
typename T>
162 template <
typename I>
163 template <
typename T>
165 const std::function<T(
I)>& fun,
170 throw std::logic_error(
"tried to insert '" + name +
"' twice");
177 template <
typename I>
194 template <
size_t N,
typename T,
typename I,
typename =
void>
196 static const bool ok_type = std::is_convertible<T,I>::value;
200 template <
size_t N,
typename T,
typename I>
201 struct CheckType <N,T,
I,decltype(*begin(std::declval<T&>()), void())> {
208 template <
typename T,
typename I>
209 struct CheckType <0,T,
I,decltype(*begin(std::declval<T&>()), void())> {
211 static const bool ok_type = std::is_convertible<T,I>::value;
223 template <
size_t N,
typename F,
typename T,
size_t M = N>
229 const std::array<hsize_t,M>& extent):
232 for (
const auto& arg: args) {
233 const size_t this_dim_max = extent.at(extent.size() - N);
234 if (offset >= this_dim_max)
return;
236 buffer.insert(
buffer.end(), in.buffer.begin(), in.buffer.end());
237 for (
const auto& in_ele: in.element_offsets){
238 std::array<hsize_t, N> element_pos;
239 element_pos.at(0) = offset;
240 std::copy(in_ele.begin(), in_ele.end(), element_pos.begin() + 1);
247 template <
typename F,
typename T,
size_t M>
252 const std::array<hsize_t,M>& ):
255 for (
const auto& filler: f) {
256 buffer.push_back(filler->getBuffer(args));
265 if (consumers.size() < 1) {
266 throw std::logic_error(
267 "you must specify at least one consumer when initializing the HDF5"
272 size_t dt_offset = 0;
274 type.insertMember(filler->name(), dt_offset, filler->getType());
282 size_t dt_offset = 0;
284 type.insertMember(filler->name(), dt_offset, filler->getWriteType());
292 template <
typename I,
size_t N>
295 const std::array<hsize_t,N>&
extent,
303 template <
typename I,
size_t N>
305 const std::array<hsize_t,N>& extent_,
306 hsize_t batch_size_):
316 std::vector<data_buffer_t> def;
318 def.push_back(filler->getDefault());
325 std::vector<hsize_t>
vec(std::array<hsize_t,N>
a) {
326 return std::vector<hsize_t>(
a.begin(),
a.end());
332 std::array<hsize_t, N> ar;
349 template <
size_t N,
typename I>
352 Writer(H5::Group& group,
const std::string& name,
363 template <
typename T>
369 template <
typename T>
382 template <
size_t N,
typename I>
385 const std::array<hsize_t,N>& extent,
397 template <
size_t N,
typename I>
402 cfg.batch_size ? *cfg.batch_size :
defaults::batch_size),
409 if (
m_par.batch_size < 1) {
410 throw std::logic_error(
"batch size must be > 0");
420 params.setFillValue(
m_par.type, default_value.data());
424 H5::CompType packed_type = buildWriteType(consumers.
getConsumers());
425 m_ds = group.createDataSet(cfg.name, packed_type, space, params);
430 template <
size_t N,
typename I>
435 }
catch (H5::Exception& err) {
437 }
catch (std::exception& err) {
442 template <
size_t N,
typename I>
443 template <
typename T>
453 checkType::depth >= N,
455 " ** H5 Writer rank is greater than the depth of fill(...) input! **"
466 !(checkType::any_type && !checkType::ok_type),
468 " ** H5 Writer input type matches fill(...), but rank is incorrect! **"
473 " ** H5 Writer input type doesn't match input for fill(...)! **"
478 hsize_t n_el = buf.element_offsets.size();
479 std::vector<hsize_t> elements;
480 for (
const auto& el_local: buf.element_offsets) {
481 std::array<hsize_t, N+1> el_global;
483 std::copy(el_local.begin(), el_local.end(), el_global.begin() + 1);
484 elements.insert(elements.end(), el_global.begin(), el_global.end());
487 m_file_space.selectElements(H5S_SELECT_APPEND, n_el, elements.data());
493 template <
size_t N,
typename I>
496 if (buffer_size == 0)
return;
499 std::vector<hsize_t> total_dims{buffer_size +
m_offset};
500 total_dims.insert(total_dims.end(),
501 m_par.extent.begin(),
503 m_ds.extend(total_dims.data());
504 m_file_space.setExtentSimple(total_dims.size(), total_dims.data());
509 assert(
static_cast<hsize_t
>(
m_file_space.getSelectNpoints())
511 H5::DataSpace mem_space(1, &n_buffer_pts);
519 template <
size_t N,
typename I>
534 template <
size_t N,
class I>
536 H5::Group& group,
const std::string& name,
540 return Writer<N,I>(group, name, consumers, extent, batch_size);
549 template <
typename T>
559 template <
size_t N,
typename T>
569 template <
typename T>
std::vector< size_t > vec
const std::vector< SharedConsumer< I > > & getConsumers() const
std::function< T(I)> function_type
void add(const std::string &name, const std::function< T(I)> &, const T &default_value=T(), Compression=Compression::STANDARD)
This should be the only method you need in this class.
std::vector< SharedConsumer< const T & > > m_consumers
std::set< std::string > m_used
void add(const std::string &name, const F func, const T &def=T(), Compression comp=Compression::STANDARD)
overload to cast lambdas into functions
Writer(H5::Group &group, const std::string &name, const Consumers< I > &consumers, const std::array< hsize_t, N > &extent=internal::uniform< N >(5), hsize_t batch_size=defaults::batch_size)
Writer(const Writer &)=delete
Writer(Writer &&)=default
Writer & operator=(Writer &)=delete
H5::DataSpace m_file_space
std::vector< internal::data_buffer_t > m_buffer
std::vector< SharedConsumer< const T & > > m_consumers
Writer(H5::Group &group, const Consumers< I > &consumers, const WriterConfiguration< N > &=WriterConfiguration< N >())
const internal::DSParameters< const T &, N > m_par
Consumers< I > consumer_type
WriterConfiguration< N > configuration_type
typename consumer_type::template function_type< T > function_type
implementation for variable filler
data_buffer_t getDefault() const override
DataConsumer(const std::string &, const std::function< T(I)> &, const T default_value=T(), Compression=Compression::STANDARD)
H5::DataType getWriteType() const override
H5::DataType getType() const override
std::string name() const override
data_buffer_t getBuffer(I) const override
H5::DataType m_write_type
std::function< T(I)> m_getter
virtual std::string name() const =0
virtual data_buffer_t getDefault() const =0
virtual H5::DataType getWriteType() const =0
virtual data_buffer_t getBuffer(I) const =0
virtual H5::DataType getType() const =0
clssses to add type traits for H5
H5::DSetCreatPropList getChunckedDatasetParams(const WriterConfiguration< N > &)
H5::CompType buildWriteType(const std::vector< SharedConsumer< I > > &con)
std::vector< hsize_t > vec(std::array< hsize_t, N > a)
H5::DataType getCompressedType(Compression comp)
H5::DataSpace getUnlimitedSpace(const std::vector< hsize_t > &max_length)
std::array< hsize_t, N > uniform(size_t val)
void printDestructorError(const std::string &msg)
const H5::DataType H5Traits< int >::type
void throwIfExists(const std::string &name, const H5::Group &in_group)
std::vector< data_buffer_t > buildDefault(const std::vector< SharedConsumer< I > > &f)
H5::CompType buildType(const std::vector< SharedConsumer< I > > &consumers)
Adapter to translate configuration info into the objects needed by the writer.
std::shared_ptr< internal::IDataConsumer< I > > SharedConsumer
Consumer Class.
Writer< N, const T & > CRefWriter
CRefWriter.
Writer< N, I > makeWriter(H5::Group &group, const std::string &name, const Consumers< I > &consumers, const std::array< hsize_t, N > &extent=internal::uniform< N >(5), hsize_t batch_size=defaults::batch_size)
makeWriter
Writer< 0, const T & > SimpleWriter
SimpleWriter.
Consumers< const T & > CRefConsumer
CRefConsumer.
static const bool any_type
CheckType< 0, decltype(*begin(std::declval< T & >())), I > subtype
static const bool ok_type
CheckType< N-1, decltype(*begin(std::declval< T & >())), I > subtype
static const bool ok_type
static const bool any_type
static const bool ok_type
static const bool any_type
Constant parameters for the writer.
std::array< hsize_t, N > extent
DSParameters(const std::vector< SharedConsumer< I > > &fillers, const std::array< hsize_t, N > &extent, hsize_t batch_size)
std::vector< data_buffer_t > buffer
DataFlattener(const F &f, T args, const std::array< hsize_t, M > &)
std::vector< std::array< hsize_t, 0 > > element_offsets
Data flattener class: this is used by the writer to read in the elements one by one and put them in a...
DataFlattener(const F &filler, T args, const std::array< hsize_t, M > &extent)
std::vector< data_buffer_t > buffer
std::vector< std::array< hsize_t, N > > element_offsets
We have lots of code to get around HDF5's rather weak typing.
consumer_t getConsumers()