From ea30ac641b46c3d35ab170a0920ba5e119395d85 Mon Sep 17 00:00:00 2001 From: Sebastian Messmer Date: Sat, 24 Oct 2015 18:39:11 +0200 Subject: [PATCH] Data::LoadFromStream() and Data::StoreToStream() --- data/Data.cpp | 15 +++++++-------- data/Data.h | 13 +++++++++++-- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/data/Data.cpp b/data/Data.cpp index 3068f43e..90c8da20 100644 --- a/data/Data.cpp +++ b/data/Data.cpp @@ -15,14 +15,10 @@ boost::optional Data::LoadFromFile(const bf::path &filepath) { if (!file.good()) { return boost::none; } - size_t size = _getStreamSize(file); - - Data result(size); - result._readFromStream(file); - return std::move(result); + return LoadFromStream(file); } -size_t Data::_getStreamSize(istream &stream) { +std::streampos Data::_getStreamSize(istream &stream) { auto current_pos = stream.tellg(); //Retrieve length @@ -35,9 +31,12 @@ size_t Data::_getStreamSize(istream &stream) { return endpos - current_pos; } +Data Data::LoadFromStream(istream &stream) { + size_t size = _getStreamSize(stream); -void Data::_readFromStream(istream &stream) { - stream.read((char*)_data, _size); + Data result(size); + stream.read(static_cast(result.data()), result.size()); + return std::move(result); } } diff --git a/data/Data.h b/data/Data.h index 56023e99..42626463 100644 --- a/data/Data.h +++ b/data/Data.h @@ -35,11 +35,15 @@ public: void StoreToFile(const boost::filesystem::path &filepath) const; static boost::optional LoadFromFile(const boost::filesystem::path &filepath); + //TODO Test LoadFromStream/StoreToStream + static Data LoadFromStream(std::istream &stream); + void StoreToStream(std::ostream &stream) const; + private: size_t _size; void *_data; - static size_t _getStreamSize(std::istream &stream); + static std::streampos _getStreamSize(std::istream &stream); void _readFromStream(std::istream &stream); DISALLOW_COPY_AND_ASSIGN(Data); @@ -115,7 +119,12 @@ inline Data &Data::FillWithZeroes() { inline void Data::StoreToFile(const boost::filesystem::path &filepath) const { std::ofstream file(filepath.c_str(), std::ios::binary | std::ios::trunc); - file.write((const char*)_data, _size); + StoreToStream(file); +} + + +inline void Data::StoreToStream(std::ostream &stream) const { + stream.write(static_cast(_data), _size); } inline bool operator==(const Data &lhs, const Data &rhs) {