diff --git a/six/modules/c++/cphd/CMakeLists.txt b/six/modules/c++/cphd/CMakeLists.txt
index 464a171654..02aa25336d 100644
--- a/six/modules/c++/cphd/CMakeLists.txt
+++ b/six/modules/c++/cphd/CMakeLists.txt
@@ -13,6 +13,7 @@ coda_add_module(
source/CPHDXMLParser.cpp
source/Channel.cpp
source/Data.cpp
+ source/DataWriter.cpp
source/Dwell.cpp
source/ErrorParameters.cpp
source/FileHeader.cpp
diff --git a/six/modules/c++/cphd/cphd.vcxproj b/six/modules/c++/cphd/cphd.vcxproj
index 692a2e63d3..e7ab142f9c 100644
--- a/six/modules/c++/cphd/cphd.vcxproj
+++ b/six/modules/c++/cphd/cphd.vcxproj
@@ -121,6 +121,7 @@
+
@@ -156,6 +157,7 @@
+
diff --git a/six/modules/c++/cphd/cphd.vcxproj.filters b/six/modules/c++/cphd/cphd.vcxproj.filters
index e9fb88640e..0eace9d1af 100644
--- a/six/modules/c++/cphd/cphd.vcxproj.filters
+++ b/six/modules/c++/cphd/cphd.vcxproj.filters
@@ -1,189 +1,195 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
\ No newline at end of file
diff --git a/six/modules/c++/cphd/include/cphd/CPHDReader.h b/six/modules/c++/cphd/include/cphd/CPHDReader.h
index 97956555e7..84cc7031f2 100644
--- a/six/modules/c++/cphd/include/cphd/CPHDReader.h
+++ b/six/modules/c++/cphd/include/cphd/CPHDReader.h
@@ -19,8 +19,9 @@
* see .
*
*/
-#ifndef __CPHD_CPHD_READER_H__
-#define __CPHD_CPHD_READER_H__
+#ifndef SIX_cphd_CPHDReader_h_INCLUDED_
+#define SIX_cphd_CPHDReader_h_INCLUDED_
+#pragma once
#include
@@ -162,4 +163,4 @@ struct CPHDReader final
};
}
-#endif
+#endif // SIX_cphd_CPHDReader_h_INCLUDED_
diff --git a/six/modules/c++/cphd/include/cphd/CPHDWriter.h b/six/modules/c++/cphd/include/cphd/CPHDWriter.h
index ce0921059c..1341cbb829 100644
--- a/six/modules/c++/cphd/include/cphd/CPHDWriter.h
+++ b/six/modules/c++/cphd/include/cphd/CPHDWriter.h
@@ -20,8 +20,8 @@
*
*/
-#ifndef __CPHD_CPHD_WRITER_H__
-#define __CPHD_CPHD_WRITER_H__
+#ifndef SIX_cphd_CPHDWriter_h_INCLUDED_
+#define SIX_cphd_CPHDWriter_h_INCLUDED_
#pragma once
#include
@@ -35,143 +35,11 @@
#include
#include
#include
+#include
namespace cphd
{
-/*
- * \class DataWriter
- *
- * \brief Class to handle writing to file and byte swapping
- */
-struct DataWriter
-{
- /*
- * \func DataWriter
- * \brief Constructor
- *
- * \param stream The seekable output stream to be written
- * \param numThreads Number of threads for parallel processing
- */
- DataWriter(std::shared_ptr stream,
- size_t numThreads);
-
- /*
- * Destructor
- */
- virtual ~DataWriter();
-
- /*
- * \func operator()
- * \brief Overload operator performs write and endian swap
- *
- * \param data Pointer to the data that will be written to the filestream
- * \param numElements Total number of elements in array
- * \param elementSize Size of each element
- */
- virtual void operator()(const sys::ubyte* data,
- size_t numElements,
- size_t elementSize) = 0;
- virtual void operator()(const std::byte* data,
- size_t numElements,
- size_t elementSize)
- {
- (*this)(reinterpret_cast(data), numElements, elementSize);
- }
-
-protected:
- //! Output stream of CPHD
- std::shared_ptr mStream;
- //! Number of threads for parallelism
- const size_t mNumThreads;
-};
-
-/*
- * \class DataWriterLittleEndian
- *
- * \brief Class to handle writing to output stream and byte swapping
- *
- * For little endian to big endian storage
- */
-struct DataWriterLittleEndian final : public DataWriter
-{
- /*
- * \func DataWriterLittleEndian
- * \brief Constructor
- *
- * \param stream The seekable output stream to be written
- * \param numThreads Number of threads for parallel processing
- * \param scratchSize Size of buffer to be used for scratch space
- */
- DataWriterLittleEndian(std::shared_ptr stream,
- size_t numThreads,
- size_t scratchSize);
-
- /*
- * \func operator()
- * \brief Overload operator performs write and endian swap
- *
- * \param data Pointer to the data that will be written to the filestream
- * \param numElements Total number of elements in array
- * \param elementSize Size of each element
- */
- void operator()(const sys::ubyte* data,
- size_t numElements,
- size_t elementSize) override;
- void operator()(const std::byte* data,
- size_t numElements,
- size_t elementSize) override
- {
- (*this)(reinterpret_cast(data), numElements, elementSize);
- }
-
-
-private:
- // Scratch space buffer
- std::vector mScratch;
-};
-
-/*
- * \class DataWriterBigEndian
- *
- * \brief Class to handle writing to file
- *
- * No byte swap. Already big endian.
- */
-struct DataWriterBigEndian final : public DataWriter
-{
- /*
- * \func DataWriter
- * \brief Constructor
- *
- * \param stream The seekable output stream to be written
- * \param numThreads Number of threads for parallel processing
- */
- DataWriterBigEndian(std::shared_ptr stream,
- size_t numThreads);
-
- /*
- * \func operator()
- * \brief Overload operator performs write
- *
- * No endian swapping is necessary. Already Big Endian.
- *
- * \param data Pointer to the data that will be written to the filestream
- * \param numElements Total number of elements in array
- * \param elementSize Size of each element
- */
- void operator()(const sys::ubyte* data,
- size_t numElements,
- size_t elementSize) override;
- void operator()(const std::byte* data,
- size_t numElements,
- size_t elementSize) override
- {
- (*this)(reinterpret_cast(data), numElements, elementSize);
- }
-};
-
-
/*
* \class CPHDWriter
* \brief CPHD write handler
@@ -179,7 +47,7 @@ struct DataWriterBigEndian final : public DataWriter
* Used to write a CPHD file. You must be able to provide the
* appropriate metadata and vector based metadata.
*/
-struct CPHDWriter
+struct CPHDWriter final
{
/*
* \func Constructor
@@ -233,6 +101,13 @@ struct CPHDWriter
size_t numThreads = 0,
size_t scratchSpaceSize = 4 * 1024 * 1024);
+ CPHDWriter() = delete;
+ CPHDWriter(const CPHDWriter&) = delete;
+ CPHDWriter& operator=(const CPHDWriter&) = delete;
+ CPHDWriter(CPHDWriter&&) = delete;
+ CPHDWriter& operator=(CPHDWriter&&) = delete;
+ ~CPHDWriter() = default;
+
/*
* \func write
* \brief Writes the complete CPHD into the file.
@@ -351,6 +226,10 @@ struct CPHDWriter
{
mStream->close();
}
+ std::shared_ptr getStream() const
+ {
+ return mStream;
+ }
private:
/*
@@ -387,7 +266,6 @@ struct CPHDWriter
//! DataWriter object
std::unique_ptr mDataWriter;
- void initializeDataWriter();
// Book-keeping element
//! metadata information
@@ -407,4 +285,4 @@ struct CPHDWriter
};
}
-#endif
+#endif // SIX_cphd_CPHDWriter_h_INCLUDED_
diff --git a/six/modules/c++/cphd/include/cphd/DataWriter.h b/six/modules/c++/cphd/include/cphd/DataWriter.h
new file mode 100644
index 0000000000..70983224d1
--- /dev/null
+++ b/six/modules/c++/cphd/include/cphd/DataWriter.h
@@ -0,0 +1,183 @@
+/* =========================================================================
+ * This file is part of cphd-c++
+ * =========================================================================
+ *
+ * (C) Copyright 2004 - 2019, MDA Information Systems LLC
+ *
+ * cphd-c++ is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; If not,
+ * see .
+ *
+ */
+
+#ifndef SIX_cphd_DataWriter_h_INCLUDED_
+#define SIX_cphd_DataWriter_h_INCLUDED_
+#pragma once
+
+#include
+#include
+#include // std::byte
+
+#include
+#include
+
+namespace cphd
+{
+
+/*
+ * \class DataWriter
+ *
+ * \brief Class to handle writing to file and byte swapping
+ */
+struct DataWriter
+{
+ /*
+ * \func DataWriter
+ * \brief Constructor
+ *
+ * \param stream The seekable output stream to be written
+ * \param numThreads Number of threads for parallel processing
+ */
+ DataWriter(io::OutputStream& stream, size_t numThreads);
+
+ DataWriter() = delete;
+ DataWriter(const DataWriter&) = delete;
+ DataWriter& operator=(const DataWriter&) = delete;
+ DataWriter(DataWriter&&) = default;
+ DataWriter& operator=(DataWriter&&) = default;
+
+ /*
+ * Destructor
+ */
+ virtual ~DataWriter() = default;
+
+ /*
+ * \func operator()
+ * \brief Overload operator performs write and endian swap
+ *
+ * \param data Pointer to the data that will be written to the filestream
+ * \param numElements Total number of elements in array
+ * \param elementSize Size of each element
+ */
+ virtual void operator()(const void* data, size_t numElements, size_t elementSize) = 0;
+
+protected:
+ //! Output stream of CPHD
+ io::OutputStream& mStream;
+ //! Number of threads for parallelism
+ const size_t mNumThreads;
+};
+
+/*
+ * \class DataWriterLittleEndian
+ *
+ * \brief Class to handle writing to output stream and byte swapping
+ *
+ * For little endian to big endian storage
+ */
+struct DataWriterLittleEndian final : public DataWriter
+{
+ /*
+ * \func DataWriterLittleEndian
+ * \brief Constructor
+ *
+ * \param stream The seekable output stream to be written
+ * \param numThreads Number of threads for parallel processing
+ * \param scratchSize Size of buffer to be used for scratch space
+ */
+ DataWriterLittleEndian(io::OutputStream&, size_t numThreads, size_t scratchSize);
+ DataWriterLittleEndian() = delete;
+ DataWriterLittleEndian(const DataWriterLittleEndian&) = delete;
+ DataWriterLittleEndian& operator=(const DataWriterLittleEndian&) = delete;
+ DataWriterLittleEndian(DataWriterLittleEndian&&) = default;
+ DataWriterLittleEndian& operator=(DataWriterLittleEndian&&) = default;
+ ~DataWriterLittleEndian() = default;
+
+ /*
+ * \func operator()
+ * \brief Overload operator performs write and endian swap
+ *
+ * \param data Pointer to the data that will be written to the filestream
+ * \param numElements Total number of elements in array
+ * \param elementSize Size of each element
+ */
+ void operator()(const void* data, size_t numElements, size_t elementSize) override;
+
+private:
+ // Scratch space buffer
+ std::vector mScratch;
+};
+
+/*
+ * \class DataWriterBigEndian
+ *
+ * \brief Class to handle writing to file
+ *
+ * No byte swap. Already big endian.
+ */
+struct DataWriterBigEndian final : public DataWriter
+{
+ /*
+ * \func DataWriter
+ * \brief Constructor
+ *
+ * \param stream The seekable output stream to be written
+ * \param numThreads Number of threads for parallel processing
+ */
+ DataWriterBigEndian(io::OutputStream&, size_t numThreads);
+ DataWriterBigEndian() = delete;
+ DataWriterBigEndian(const DataWriterBigEndian&) = delete;
+ DataWriterBigEndian& operator=(const DataWriterBigEndian&) = delete;
+ DataWriterBigEndian(DataWriterBigEndian&&) = default;
+ DataWriterBigEndian& operator=(DataWriterBigEndian&&) = default;
+ ~DataWriterBigEndian() = default;
+
+ /*
+ * \func operator()
+ * \brief Overload operator performs write
+ *
+ * No endian swapping is necessary. Already Big Endian.
+ *
+ * \param data Pointer to the data that will be written to the filestream
+ * \param numElements Total number of elements in array
+ * \param elementSize Size of each element
+ */
+ void operator()(const void* data, size_t numElements, size_t elementSize) override;
+};
+
+// Create the appropriate DataWriter instance using std::endian::native. There are fancier
+// ways of doing this compile-time "if" check, but this is relatively straight-forward to understand;
+// C++20 brings `consteval if`.
+namespace details
+{
+ template
+ auto make_DataWriter(io::OutputStream&, size_t numThreads, size_t scratchSize);
+ template<>
+ inline auto make_DataWriter(io::OutputStream& stream, size_t numThreads, size_t /*scratchSize*/)
+ {
+ return std::make_unique(stream, numThreads);
+ }
+ template<>
+ inline auto make_DataWriter(io::OutputStream& stream, size_t numThreads, size_t scratchSize)
+ {
+ return std::make_unique(stream, numThreads, scratchSize);
+ }
+}
+inline auto make_DataWriter(io::OutputStream& stream, size_t numThreads, size_t scratchSize)
+{
+ return details::make_DataWriter(stream, numThreads, scratchSize);
+}
+
+}
+
+#endif // SIX_cphd_DataWriter_h_INCLUDED_
diff --git a/six/modules/c++/cphd/source/CPHDWriter.cpp b/six/modules/c++/cphd/source/CPHDWriter.cpp
index dfa2914ba7..e80946b0e5 100644
--- a/six/modules/c++/cphd/source/CPHDWriter.cpp
+++ b/six/modules/c++/cphd/source/CPHDWriter.cpp
@@ -39,81 +39,6 @@
namespace cphd
{
-DataWriter::DataWriter(std::shared_ptr stream,
- size_t numThreads) :
- mStream(stream),
- mNumThreads(numThreads == 0 ? std::thread::hardware_concurrency() : numThreads)
-{
-}
-
-DataWriter::~DataWriter()
-{
-}
-
-DataWriterLittleEndian::DataWriterLittleEndian(
- std::shared_ptr stream,
- size_t numThreads,
- size_t scratchSize) :
- DataWriter(stream, numThreads),
- mScratch(scratchSize)
-{
-}
-
-void DataWriterLittleEndian::operator()(const sys::ubyte* data,
- size_t numElements,
- size_t elementSize)
-{
- size_t dataProcessed = 0;
- const size_t dataSize = numElements * elementSize;
- while (dataProcessed < dataSize)
- {
- const size_t dataToProcess =
- std::min(mScratch.size(), dataSize - dataProcessed);
-
- memcpy(mScratch.data(), data + dataProcessed, dataToProcess);
-
- cphd::byteSwap(mScratch.data(),
- elementSize,
- dataToProcess / elementSize,
- mNumThreads);
-
- mStream->write(mScratch.data(), dataToProcess);
-
- dataProcessed += dataToProcess;
- }
-}
-
-DataWriterBigEndian::DataWriterBigEndian(
- std::shared_ptr stream, size_t numThreads) :
- DataWriter(stream, numThreads)
-{
-}
-
-void DataWriterBigEndian::operator()(const sys::ubyte* data,
- size_t numElements,
- size_t elementSize)
-{
- mStream->write(data,
- numElements * elementSize);
-}
-
-void CPHDWriter::initializeDataWriter()
-{
- // Get the correct dataWriter.
- // The CPHD file needs to be big endian.
- auto endianness = std::endian::native; // "conditional expression is constant"
- if (endianness == std::endian::big)
- {
- mDataWriter = std::make_unique(mStream, mNumThreads);
- }
- else
- {
- mDataWriter = std::make_unique(mStream,
- mNumThreads,
- mScratchSpaceSize);
- }
-}
-
CPHDWriter::CPHDWriter(const Metadata& metadata,
std::shared_ptr outStream,
@@ -127,7 +52,9 @@ CPHDWriter::CPHDWriter(const Metadata& metadata,
mSchemaPaths(schemaPaths),
mStream(outStream)
{
- initializeDataWriter();
+ // Get the correct dataWriter.
+ // The CPHD file needs to be big endian.
+ mDataWriter = make_DataWriter(*mStream, mNumThreads, mScratchSpaceSize);
}
CPHDWriter::CPHDWriter(const Metadata& metadata,
@@ -135,16 +62,12 @@ CPHDWriter::CPHDWriter(const Metadata& metadata,
const std::vector& schemaPaths,
size_t numThreads,
size_t scratchSpaceSize) :
- mMetadata(metadata),
- mElementSize(metadata.data.getNumBytesPerSample()),
- mScratchSpaceSize(scratchSpaceSize),
- mNumThreads(numThreads),
- mSchemaPaths(schemaPaths)
+ CPHDWriter(metadata,
+ std::make_shared(pathname), // Initialize output stream
+ schemaPaths,
+ numThreads,
+ scratchSpaceSize)
{
- // Initialize output stream
- mStream = std::make_shared(pathname);
-
- initializeDataWriter();
}
void CPHDWriter::writeMetadata(size_t supportSize,
diff --git a/six/modules/c++/cphd/source/DataWriter.cpp b/six/modules/c++/cphd/source/DataWriter.cpp
new file mode 100644
index 0000000000..6196712990
--- /dev/null
+++ b/six/modules/c++/cphd/source/DataWriter.cpp
@@ -0,0 +1,83 @@
+/* =========================================================================
+ * This file is part of cphd-c++
+ * =========================================================================
+ *
+ * (C) Copyright 2004 - 2019, MDA Information Systems LLC
+ *
+ * cphd-c++ is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; If not,
+ * see .
+ *
+ */
+#include
+
+#include
+#include
+
+#include
+
+#include
+#undef min
+#undef max
+
+
+namespace cphd
+{
+DataWriter::DataWriter(io::OutputStream& stream, size_t numThreads) :
+ mStream(stream),
+ mNumThreads(numThreads == 0 ? std::thread::hardware_concurrency() : numThreads)
+{
+}
+
+DataWriterLittleEndian::DataWriterLittleEndian(
+ io::OutputStream& stream,
+ size_t numThreads,
+ size_t scratchSize) :
+ DataWriter(stream, numThreads),
+ mScratch(scratchSize)
+{
+}
+void DataWriterLittleEndian::operator()(const void* pData, size_t numElements, size_t elementSize)
+{
+ const auto data = static_cast(pData);
+
+ size_t dataProcessed = 0;
+ const size_t dataSize = numElements * elementSize;
+ while (dataProcessed < dataSize)
+ {
+ const size_t dataToProcess =
+ std::min(mScratch.size(), dataSize - dataProcessed);
+
+ memcpy(mScratch.data(), data + dataProcessed, dataToProcess);
+
+ cphd::byteSwap(mScratch.data(),
+ elementSize,
+ dataToProcess / elementSize,
+ mNumThreads);
+
+ mStream.write(mScratch.data(), dataToProcess);
+
+ dataProcessed += dataToProcess;
+ }
+}
+
+DataWriterBigEndian::DataWriterBigEndian(io::OutputStream& stream, size_t numThreads) :
+ DataWriter(stream, numThreads)
+{
+}
+void DataWriterBigEndian::operator()(const void* data, size_t numElements, size_t elementSize)
+{
+ mStream.write(data, numElements * elementSize);
+}
+
+}
diff --git a/six/modules/c++/cphd03/include/cphd03/CPHDWriter.h b/six/modules/c++/cphd03/include/cphd03/CPHDWriter.h
index 22566a88b5..e02924c28b 100644
--- a/six/modules/c++/cphd03/include/cphd03/CPHDWriter.h
+++ b/six/modules/c++/cphd03/include/cphd03/CPHDWriter.h
@@ -42,7 +42,7 @@ namespace cphd03
* \brief Used to write a CPHD file. You must be able to provide the
* appropriate metadata and vector based metadata.
*/
-struct CPHDWriter
+struct CPHDWriter final
{
/*
* \func Constructor
@@ -90,6 +90,13 @@ struct CPHDWriter
size_t numThreads = 0,
size_t scratchSpaceSize = 4 * 1024 * 1024);
+ CPHDWriter() = delete;
+ CPHDWriter(const CPHDWriter&) = delete;
+ CPHDWriter& operator=(const CPHDWriter&) = delete;
+ CPHDWriter(CPHDWriter&&) = delete;
+ CPHDWriter& operator=(CPHDWriter&&) = delete;
+ ~CPHDWriter() = default;
+
/*
* \func addImage
* \brief Pushes a new image to the file for writing. This only works with
@@ -168,10 +175,11 @@ struct CPHDWriter
void close()
{
- if (mStream.get())
- {
- mStream->close();
- }
+ mStream->close();
+ }
+ std::shared_ptr getStream() const
+ {
+ return mStream;
}
private:
@@ -187,7 +195,6 @@ struct CPHDWriter
size_t size);
std::unique_ptr mDataWriter;
- void initializeDataWriter();
Metadata mMetadata;
const size_t mElementSize;
@@ -199,8 +206,8 @@ struct CPHDWriter
std::vector mCPHDData;
std::vector mVBMData;
- size_t mCPHDSize;
- size_t mVBMSize;
+ size_t mCPHDSize = 0;
+ size_t mVBMSize = 0;
};
}
diff --git a/six/modules/c++/cphd03/source/CPHDWriter.cpp b/six/modules/c++/cphd03/source/CPHDWriter.cpp
index 75ce7160d6..91d5d93537 100644
--- a/six/modules/c++/cphd03/source/CPHDWriter.cpp
+++ b/six/modules/c++/cphd03/source/CPHDWriter.cpp
@@ -34,22 +34,6 @@
namespace cphd03
{
-void CPHDWriter::initializeDataWriter()
-{
- //! Get the correct dataWriter.
- // The CPHD file needs to be big endian.
- auto endianness = std::endian::native; // "conditional expression is constant"
- if (endianness == std::endian::big)
- {
- mDataWriter = std::make_unique(mStream, mNumThreads);
- }
- else
- {
- mDataWriter = std::make_unique(mStream, mNumThreads, mScratchSpaceSize);
- }
-}
-
-
CPHDWriter::CPHDWriter(const Metadata& metadata,
std::shared_ptr stream,
size_t numThreads,
@@ -58,28 +42,22 @@ CPHDWriter::CPHDWriter(const Metadata& metadata,
mElementSize(metadata.data.getNumBytesPerSample()),
mScratchSpaceSize(scratchSpaceSize),
mNumThreads(numThreads),
- mStream(stream),
- mCPHDSize(0),
- mVBMSize(0)
+ mStream(stream)
{
- initializeDataWriter();
+ //! Get the correct dataWriter.
+ // The CPHD file needs to be big endian.
+ mDataWriter = cphd::make_DataWriter(*mStream, mNumThreads, mScratchSpaceSize);
}
CPHDWriter::CPHDWriter(const Metadata& metadata,
const std::string& pathname,
size_t numThreads,
size_t scratchSpaceSize) :
- mMetadata(metadata),
- mElementSize(metadata.data.getNumBytesPerSample()),
- mScratchSpaceSize(scratchSpaceSize),
- mNumThreads(numThreads),
- mCPHDSize(0),
- mVBMSize(0)
-{
- // Create file stream to write
- mStream = std::make_shared(pathname);
-
- initializeDataWriter();
+ CPHDWriter(metadata,
+ std::make_shared(pathname), // Create file stream to write
+ numThreads,
+ scratchSpaceSize)
+{
}
template