diff --git a/include/itkInputStreamBase.h b/include/itkInputStreamBase.h index f06fc0a44..04ae73268 100644 --- a/include/itkInputStreamBase.h +++ b/include/itkInputStreamBase.h @@ -18,12 +18,10 @@ #ifndef itkInputStreamBase_h #define itkInputStreamBase_h -#include "itkPipeline.h" -#include "itkWasmStringStream.h" - +#include +#include // For istream. +#include // For unique_ptr. #include -#include -#include #include "WebAssemblyInterfaceExport.h" @@ -54,52 +52,30 @@ class WebAssemblyInterface_EXPORT InputStreamBase std::istream * GetPointer() { - return m_IStream; + return m_IStream.get(); } void - SetJSON(const std::string & json) - { - if (m_DeleteIStream && m_IStream != nullptr) - { - delete m_IStream; - } - m_DeleteIStream = false; - m_WasmStringStream = WasmStringStream::New(); - m_WasmStringStream->SetJSON(json.c_str()); - - m_IStream = &(m_WasmStringStream->GetStringStream()); - } + SetJSON(const std::string & json); virtual void SetFileName(const std::string & fileName) = 0; protected: void - SetFile(const std::string & fileName, const std::ios_base::openmode openMode) - { - if (m_DeleteIStream && m_IStream != nullptr) - { - delete m_IStream; - } - m_IStream = new std::ifstream(fileName, openMode); - m_DeleteIStream = true; - } + SetFile(const std::string & fileName, const std::ios_base::openmode openMode); InputStreamBase() = default; - virtual ~InputStreamBase() - { - if (m_DeleteIStream && m_IStream != nullptr) - { - delete m_IStream; - } - } -private: - std::istream * m_IStream{ nullptr }; - bool m_DeleteIStream{ false }; + // Move semantics for its derived classes: + InputStreamBase(InputStreamBase &&) = default; + InputStreamBase & + operator=(InputStreamBase &&) = default; - WasmStringStream::Pointer m_WasmStringStream; + virtual ~InputStreamBase(); + +private: + std::unique_ptr m_IStream; }; diff --git a/src/itkInputStreamBase.cxx b/src/itkInputStreamBase.cxx index 60050e230..8e3cd7cc7 100644 --- a/src/itkInputStreamBase.cxx +++ b/src/itkInputStreamBase.cxx @@ -16,16 +16,38 @@ * *=========================================================================*/ #include "itkInputStreamBase.h" +#include "itkPipeline.h" +#include "itkWasmStringStream.h" -#include #ifndef ITK_WASM_NO_MEMORY_IO # include "itkWasmExports.h" #endif +#include +#include + namespace itk { namespace wasm { +void +InputStreamBase::SetJSON(const std::string & json) +{ + const auto wasmStringStream = WasmStringStream::New(); + wasmStringStream->SetJSON(json.c_str()); + m_IStream = std::make_unique(std::move(wasmStringStream->GetStringStream())); +} + + +void +InputStreamBase::SetFile(const std::string & fileName, const std::ios_base::openmode openMode) +{ + m_IStream = std::make_unique(fileName, openMode); +} + + +InputStreamBase::~InputStreamBase() = default; + bool lexical_cast(const std::string & input, InputStreamBase & inputStream)