diff --git a/src/OpenMesh/Core/IO/SR_binary_spec.hh b/src/OpenMesh/Core/IO/SR_binary_spec.hh index bc922727..1e5a509b 100644 --- a/src/OpenMesh/Core/IO/SR_binary_spec.hh +++ b/src/OpenMesh/Core/IO/SR_binary_spec.hh @@ -347,11 +347,11 @@ struct binary< std::vector< T > > { for(auto v : _v) { size += binary::size_of(v); - if(_store_size) - { - unsigned int N = _v.size(); - size += binary::size_of(); - } + } + if(_store_size) + { + unsigned int N = _v.size(); + size += binary::size_of(); } return size; @@ -370,11 +370,24 @@ struct binary< std::vector< T > > { if (_swap) bytes += std::accumulate( _v.begin(), _v.end(), static_cast(0), FunctorStore(_os,_swap) ); - else { - auto bytes_of_vec = size_of(_v, false); - bytes += bytes_of_vec; - if (_v.size() > 0) - _os.write( reinterpret_cast(&_v[0]), bytes_of_vec); + else + { + auto elem_size = binary::size_of(); + if (elem_size != IO::UnknownSize && elem_size == sizeof(elem_type)) + { + // size of all elements is known, equal, and densely packed in vector. + // Just store vector data + auto bytes_of_vec = size_of(_v, false); + bytes += bytes_of_vec; + if (_v.size() > 0) + _os.write( reinterpret_cast(&_v[0]), bytes_of_vec); + } + else + { + // store individual elements + for (const auto& v : _v) + bytes += binary::store(_os, v, _swap); + } } return _os.good() ? bytes : 0; } @@ -395,10 +408,22 @@ struct binary< std::vector< T > > { FunctorRestore(_is, _swap) ); else { - auto bytes_of_vec = size_of(_v, false); - bytes += bytes_of_vec; - if (_v.size() > 0) - _is.read( reinterpret_cast(&_v[0]), bytes_of_vec ); + auto elem_size = binary::size_of(); + if (elem_size != IO::UnknownSize && elem_size == sizeof(elem_type)) + { + // size of all elements is known, equal, and densely packed in vector. + // Just restore vector data + auto bytes_of_vec = size_of(_v, false); + bytes += bytes_of_vec; + if (_v.size() > 0) + _is.read( reinterpret_cast(&_v[0]), bytes_of_vec ); + } + else + { + // restore individual elements + for (auto& v : _v) + bytes += binary::restore(_is, v, _swap); + } } return _is.good() ? bytes : 0; } diff --git a/src/OpenMesh/Core/Utils/Property.hh b/src/OpenMesh/Core/Utils/Property.hh index ec48e22a..2db5f6a7 100644 --- a/src/OpenMesh/Core/Utils/Property.hh +++ b/src/OpenMesh/Core/Utils/Property.hh @@ -161,8 +161,8 @@ public: virtual size_t restore( std::istream& _istr, bool _swap ) override { - if ( IO::is_streamable() && element_size() != IO::UnknownSize ) - return IO::restore(_istr, data_, _swap, false); //does not need to restore its length + if ( IO::is_streamable() && element_size() != IO::UnknownSize) + return IO::restore(_istr, data_, _swap, false); //does not need to restore its length size_t bytes = 0; for (size_t i=0; i