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
|
#ifndef MSPROVIDERS_MSREADERS_INMEMORYREADER_H_
#define MSPROVIDERS_MSREADERS_INMEMORYREADER_H_
#include <span>
#include "msreader.h"
#include "../../structures/inmemorypart.h"
namespace wsclean {
class InMemoryReader final : public MSReader {
public:
InMemoryReader(
MSProvider* ms_provider, std::span<const InMemoryPartRow> rows,
std::vector<MSProvider::MetaData>::const_iterator meta_data_iterator)
: MSReader(ms_provider),
rows_(rows),
data_iterator_(rows.begin()),
meta_data_iterator_(meta_data_iterator){};
size_t RowId() const final { return data_iterator_ - rows_.begin(); }
bool CurrentRowAvailable() final { return data_iterator_ != rows_.end(); }
void NextInputRow() final {
++data_iterator_;
++meta_data_iterator_;
}
void ReadMeta(MSProvider::MetaData& metadata) final {
metadata = *meta_data_iterator_;
}
void ReadData(std::complex<float>* buffer) final {
std::copy(data_iterator_->data.begin(), data_iterator_->data.end(), buffer);
}
void ReadModel(std::complex<float>* buffer) final {
std::copy(data_iterator_->model_data.begin(),
data_iterator_->model_data.end(), buffer);
}
void ReadWeights(float* buffer) final {
std::copy(data_iterator_->weights.begin(), data_iterator_->weights.end(),
buffer);
}
void WriteImagingWeights(const float* buffer) final {
// In memory reader does not hold imaging weights, so do nothing.
}
private:
std::span<const InMemoryPartRow> rows_;
std::span<const InMemoryPartRow>::iterator data_iterator_;
std::vector<MSProvider::MetaData>::const_iterator meta_data_iterator_;
};
} // namespace wsclean
#endif
|