const MrcDensityMapOfFloatReader& reader() const;
private:
- std::vector<char> buffer_;
- InMemoryDeserializer serializer_;
- const MrcDensityMapOfFloatReader reader_;
+ const std::vector<char> buffer_;
+ std::unique_ptr<InMemoryDeserializer> serializer_;
+ std::unique_ptr<MrcDensityMapOfFloatReader> reader_;
};
MrcDensityMapOfFloatFromFileReader::Impl::Impl(const std::string& filename) :
buffer_(readCharBufferFromFile(filename)),
- serializer_(buffer_, false),
- reader_(&serializer_)
+ serializer_(std::make_unique<InMemoryDeserializer>(buffer_, false)),
+ reader_(std::make_unique<MrcDensityMapOfFloatReader>(serializer_.get()))
{
- layout_right::mapping<dynamicExtents3D> map(getDynamicExtents3D(reader_.header()));
- if (map.required_span_size() != reader_.constView().ssize())
+ if (!mrcHeaderIsSane(reader_->header()))
+ {
+ serializer_ = std::make_unique<InMemoryDeserializer>(buffer_, false, EndianSwapBehavior::DoSwap);
+ reader_ = std::make_unique<MrcDensityMapOfFloatReader>(serializer_.get());
+ if (!mrcHeaderIsSane(reader_->header()))
+ {
+ GMX_THROW(FileIOError(
+ "Header of '" + filename
+ + "' fails sanity check for little- as well as big-endian reading."));
+ }
+ }
+
+ layout_right::mapping<dynamicExtents3D> map(getDynamicExtents3D(reader_->header()));
+ if (map.required_span_size() != reader_->constView().ssize())
{
GMX_THROW(FileIOError("File header density extent information of " + filename
+ "' does not match density data size"));
const MrcDensityMapOfFloatReader& MrcDensityMapOfFloatFromFileReader::Impl::reader() const
{
- return reader_;
+ return *reader_;
}
/********************************************************************
* upon construction and returns coordinate transformation into the density
* lattice as well as the density data.
*
+ * Attempts reading with swapped endianess if header is not sane.
+ *
+ * Performs basic sanity checks on header information and data size.
+ *
* \note File reading is completed during construction. When the constructor
* completes succesfully, transformation to density lattice and density
* data are valid, irrespective of the state of the read file.