From 53002389e1536aeb0d18e9c1cd3eb040c02e77e2 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Mon, 21 Sep 2015 15:58:44 +0200 Subject: [PATCH] gmio_support: add gmio_[i/o]stream_cpp() functions --- src/gmio_support/stream_cpp.h | 122 +++++++++++++++++++++++------- tests/fake_support/CMakeLists.txt | 2 +- tests/fake_support/main.cpp | 12 +-- 3 files changed, 103 insertions(+), 33 deletions(-) diff --git a/src/gmio_support/stream_cpp.h b/src/gmio_support/stream_cpp.h index 83e8a07..1a55a91 100644 --- a/src/gmio_support/stream_cpp.h +++ b/src/gmio_support/stream_cpp.h @@ -29,29 +29,41 @@ #include #include -template -gmio_stream_t gmio_stream_cpp(STREAM* s); +/*! Returns a gmio_stream for C++ input stream (cookie will hold \p s ) */ +template +gmio_stream_t gmio_istream_cpp(std::basic_istream* s); + +/*! Returns a gmio_stream for C++ output stream (cookie will hold \p s ) */ +template +gmio_stream_t gmio_ostream_cpp(std::basic_ostream* s); + + + // // Implementation // +#ifndef DOXYGEN + +namespace gmio { +namespace internal { template -gmio_bool_t gmio_stream_cpp_at_end(void* cookie) +gmio_bool_t stream_cpp_at_end(void* cookie) { STREAM* s = static_cast(cookie); return s->eof(); } template -int gmio_stream_cpp_error(void* cookie) +int stream_cpp_error(void* cookie) { STREAM* s = static_cast(cookie); return s->rdstate(); } template -size_t gmio_stream_cpp_read( +size_t istream_cpp_read( void* cookie, void* ptr, size_t item_size, size_t item_count) { STREAM* s = static_cast(cookie); @@ -60,7 +72,7 @@ size_t gmio_stream_cpp_read( } template -size_t gmio_stream_cpp_write( +size_t ostream_cpp_write( void* cookie, const void* ptr, size_t item_size, size_t item_count) { STREAM* s = static_cast(cookie); @@ -70,7 +82,7 @@ size_t gmio_stream_cpp_write( } template -size_t gmio_stream_cpp_size(void* cookie) +size_t istream_cpp_size(void* cookie) { STREAM* s = static_cast(cookie); std::streampos pos = s->tellg(); @@ -78,44 +90,102 @@ size_t gmio_stream_cpp_size(void* cookie) std::streampos begin_pos = s->tellg(); s->seekg(0, std::ios_base::end); std::streampos end_pos = s->tellg(); - s->seekg(pos, std::ios_base::beg); + s->seekg(pos, std::ios_base::beg); // Restore pos return end_pos - begin_pos; } template -int gmio_stream_cpp_get_pos(void* cookie, gmio_stream_pos_t* pos) +size_t ostream_cpp_size(void* cookie) { STREAM* s = static_cast(cookie); - std::streampos spos = s->tellg(); + std::streampos pos = s->tellp(); + s->seekp(0, std::ios_base::beg); + std::streampos begin_pos = s->tellp(); + s->seekp(0, std::ios_base::end); + std::streampos end_pos = s->tellp(); + s->seekp(pos, std::ios_base::beg); // Restore pos + return end_pos - begin_pos; +} + +GMIO_INLINE void copy_cpp_streampos(gmio_stream_pos_t* pos, std::streampos spos) +{ std::memcpy(&pos->cookie[0], &spos, sizeof(std::streampos)); +} + +GMIO_INLINE std::streampos to_cpp_streampos(const gmio_stream_pos_t* pos) +{ + std::streampos spos; + std::memcpy(&spos, &pos->cookie[0], sizeof(std::streampos)); + return spos; +} + +template +int istream_cpp_get_pos(void* cookie, gmio_stream_pos_t* pos) +{ + copy_cpp_streampos(pos, static_cast(cookie)->tellg()); return 0; } template -static int gmio_stream_cpp_set_pos(void* cookie, const gmio_stream_pos_t* pos) +int istream_cpp_set_pos(void* cookie, const gmio_stream_pos_t* pos) { - STREAM* s = static_cast(cookie); - std::streampos spos; - std::memcpy(&spos, &pos->cookie[0], sizeof(std::streampos)); - s->seekg(spos); - s->seekp(spos); + static_cast(cookie)->seekg(to_cpp_streampos(pos)); return 0; // TODO: return error code } template -gmio_stream_t gmio_stream_cpp(STREAM* s) +int ostream_cpp_get_pos(void* cookie, gmio_stream_pos_t* pos) { - gmio_stream_t stream = gmio_stream_null(); - stream.cookie = s; - stream.func_at_end = gmio_stream_cpp_at_end; - stream.func_error = gmio_stream_cpp_error; - stream.func_read = gmio_stream_cpp_read; - stream.func_write = gmio_stream_cpp_write; - stream.func_size = gmio_stream_cpp_size; - stream.func_get_pos = gmio_stream_cpp_get_pos; - stream.func_set_pos = gmio_stream_cpp_set_pos; + copy_cpp_streampos(pos, static_cast(cookie)->tellp()); + return 0; +} + +template +static int ostream_cpp_set_pos(void* cookie, const gmio_stream_pos_t* pos) +{ + static_cast(cookie)->seekp(to_cpp_streampos(pos)); + return 0; // TODO: return error code +} + +template +void stream_cpp_init_common(STREAM* s, gmio_stream_t* stream) +{ + *stream = gmio_stream_null(); + stream->cookie = s; + stream->func_at_end = gmio::internal::stream_cpp_at_end; + stream->func_error = gmio::internal::stream_cpp_error; +} + +} // namespace internal +} // namespace gmio + +template +gmio_stream_t gmio_istream_cpp(std::basic_istream* s) +{ + typedef std::basic_istream CppStream; + gmio_stream_t stream; + gmio::internal::stream_cpp_init_common(s, &stream); + stream.func_size = gmio::internal::istream_cpp_size; + stream.func_read = gmio::internal::istream_cpp_read; + stream.func_get_pos = gmio::internal::istream_cpp_get_pos; + stream.func_set_pos = gmio::internal::istream_cpp_set_pos; return stream; } +template +gmio_stream_t gmio_ostream_cpp(std::basic_ostream* s) +{ + typedef std::basic_ostream CppStream; + gmio_stream_t stream; + gmio::internal::stream_cpp_init_common(s, &stream); + stream.func_size = gmio::internal::ostream_cpp_size; + stream.func_write = gmio::internal::ostream_cpp_write; + stream.func_get_pos = gmio::internal::ostream_cpp_get_pos; + stream.func_set_pos = gmio::internal::ostream_cpp_set_pos; + return stream; +} + +#endif // !DOXYGEN + #endif /* GMIO_SUPPORT_STREAM_CPP_H */ /*! @} */ diff --git a/tests/fake_support/CMakeLists.txt b/tests/fake_support/CMakeLists.txt index 43e3361..1cd1d05 100644 --- a/tests/fake_support/CMakeLists.txt +++ b/tests/fake_support/CMakeLists.txt @@ -30,7 +30,7 @@ add_executable( qt/QtCore/QtGlobal ../../src/gmio_support/stl_occ.cpp ../../src/gmio_support/stream_qt.cpp) -link_libraries(gmio) +target_link_libraries(fake_support gmio) include_directories( ${CMAKE_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/opencascade diff --git a/tests/fake_support/main.cpp b/tests/fake_support/main.cpp index c5a1a7b..d8d463e 100644 --- a/tests/fake_support/main.cpp +++ b/tests/fake_support/main.cpp @@ -1,12 +1,10 @@ #include "../../src/gmio_stl/stl_io.h" #include "../../src/gmio_support/stl_occ.h" +#include "../../src/gmio_support/stream_qt.h" +#include "../../src/gmio_support/stream_cpp.h" #include -#include "../../src/gmio_support/stream_qt.h" - #include - -#include "../../src/gmio_support/stream_cpp.h" #include int main() @@ -20,8 +18,10 @@ int main() gmio_stream_qiodevice(&file); // C++ - //std::ifstream s("test.txt"); - //gmio_stream_t stream = gmio_stream_cpp(&s); + std::ifstream is("test.txt"); + gmio_istream_cpp(&is); + std::ofstream os("test.txt"); + gmio_ostream_cpp(&os); return 0; }