Commit 39834d8f authored by Mark Olesen's avatar Mark Olesen Committed by Andrew Heather
Browse files

ENH: add readContiguous detail (#1378)

- allows some internal handling for reading dissimilar storage types.
  Eg, scalars written as float (WM_SP), but read as double (WM_DP)

- reading binary parcel coordinates with dissimilar storage types is
  still pending
parent 1d79c045
......@@ -119,6 +119,8 @@ Foam::Istream& Foam::PackedList<Width>::read(Istream& is)
}
else
{
// NOTE: binary content should be independent of WM_LABEL_SIZE
if (len)
{
is.read
......
......@@ -223,7 +223,12 @@ Foam::Istream& Foam::operator>>(Foam::Istream& is, FixedList<T, N>& list)
{
// Binary and contiguous
is.read(reinterpret_cast<char*>(list.data()), N*sizeof(T));
Detail::readContiguous<T>
(
is,
reinterpret_cast<char*>(list.data()),
N*sizeof(T)
);
is.fatalCheck
(
......
......@@ -126,7 +126,12 @@ Foam::Istream& Foam::operator>>(Istream& is, List<T>& list)
{
// Non-empty, binary, contiguous
is.read(reinterpret_cast<char*>(list.data()), len*sizeof(T));
Detail::readContiguous<T>
(
is,
reinterpret_cast<char*>(list.data()),
len*sizeof(T)
);
is.fatalCheck
(
......
......@@ -259,7 +259,12 @@ Foam::Istream& Foam::operator>>(Istream& is, UList<T>& list)
{
// Non-empty, binary, contiguous
is.read(reinterpret_cast<char*>(list.data()), len*sizeof(T));
Detail::readContiguous<T>
(
is,
reinterpret_cast<char*>(list.data()),
len*sizeof(T)
);
is.fatalCheck
(
......
......@@ -47,6 +47,7 @@ SourceFiles
#include "IOstream.H"
#include "token.H"
#include "contiguous.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
......@@ -194,10 +195,50 @@ inline Istream& operator>>(Istream& is, IOstreamManip f)
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Detail
{
//- Read binary block of contiguous data, possibly with conversion
template<class T>
void readContiguous(Istream& is, char* data, std::streamsize byteCount)
{
is.beginRawRead();
if (is_contiguous_label<T>::value)
{
readRawLabel
(
is,
reinterpret_cast<label*>(data),
byteCount/sizeof(label)
);
}
else if (is_contiguous_scalar<T>::value)
{
readRawScalar
(
is,
reinterpret_cast<scalar*>(data),
byteCount/sizeof(scalar)
);
}
else
{
is.readRaw(data, byteCount);
}
is.endRawRead();
}
} // End namespace Detail
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
......
......@@ -112,7 +112,12 @@ bool Foam::Matrix<Form, Type>::readMatrix(Istream& is)
{
if (len)
{
is.read(reinterpret_cast<char*>(v_), len*sizeof(Type));
Detail::readContiguous<Type>
(
is,
reinterpret_cast<char*>(v_),
len*sizeof(Type)
);
is.fatalCheck("readMatrix : reading the binary block");
}
......
......@@ -305,8 +305,9 @@ Foam::Istream& Foam::operator>>(Istream& is, boundBox& bb)
}
else
{
is.read
Detail::readContiguous<boundBox>
(
is,
reinterpret_cast<char*>(&bb.min_),
sizeof(boundBox)
);
......
......@@ -134,7 +134,12 @@ inline Foam::Istream& Foam::operator>>(Istream& is, labelledTri& t)
}
else
{
is.read(reinterpret_cast<char*>(&t), sizeof(labelledTri));
Detail::readContiguous<labelledTri>
(
is,
reinterpret_cast<char*>(&t),
sizeof(labelledTri)
);
}
is.check(FUNCTION_NAME);
......
......@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd |
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011 OpenFOAM Foundation
......@@ -61,8 +61,9 @@ Foam::Istream& Foam::operator>>(Foam::Istream& is, Foam::refinementData& wDist)
}
else
{
is.read
Detail::readContiguous<refinementData>
(
is,
reinterpret_cast<char*>(&wDist.refinementCount_),
sizeof(refinementData)
);
......
......@@ -495,22 +495,21 @@ Foam::Istream& Foam::operator>>(Istream& is, AABBTree<Type>& tree)
if (is.format() == IOstream::ASCII)
{
is >> tree.maxLevel_
>> tree.minLeafSize_
>> tree.boundBoxes_
>> tree.addressing_;
>> tree.minLeafSize_;
}
else
{
is.read
(
reinterpret_cast<char*>(&tree.maxLevel_),
sizeof(tree.maxLevel_)
+ sizeof(tree.minLeafSize_)
);
is >> tree.boundBoxes_
>> tree.addressing_;
is.beginRawRead();
readRawLabel(is, &tree.maxLevel_);
readRawLabel(is, &tree.minLeafSize_);
is.endRawRead();
}
is >> tree.boundBoxes_
>> tree.addressing_;
is.check(FUNCTION_NAME);
return is;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment