diff --git a/six/modules/c++/cphd/cphd.vcxproj b/six/modules/c++/cphd/cphd.vcxproj index e7ab142f9..f7503b5b7 100644 --- a/six/modules/c++/cphd/cphd.vcxproj +++ b/six/modules/c++/cphd/cphd.vcxproj @@ -90,6 +90,7 @@ AdvancedVectorExtensions2 MultiThreadedDLL stdc11 + pch.h diff --git a/six/modules/c++/cphd03/cphd03.vcxproj b/six/modules/c++/cphd03/cphd03.vcxproj index 54d884e9d..22792629a 100644 --- a/six/modules/c++/cphd03/cphd03.vcxproj +++ b/six/modules/c++/cphd03/cphd03.vcxproj @@ -90,6 +90,7 @@ AdvancedVectorExtensions2 MultiThreadedDLL stdc11 + pch.h diff --git a/six/modules/c++/scene/scene.vcxproj b/six/modules/c++/scene/scene.vcxproj index 0eb0e122a..4ac8f2688 100644 --- a/six/modules/c++/scene/scene.vcxproj +++ b/six/modules/c++/scene/scene.vcxproj @@ -92,6 +92,7 @@ AdvancedVectorExtensions2 MultiThreadedDLL stdc11 + pch.h diff --git a/six/modules/c++/six.convert/six.convert.vcxproj b/six/modules/c++/six.convert/six.convert.vcxproj index a28b85f3e..98b0446e6 100644 --- a/six/modules/c++/six.convert/six.convert.vcxproj +++ b/six/modules/c++/six.convert/six.convert.vcxproj @@ -89,6 +89,7 @@ AdvancedVectorExtensions2 MultiThreadedDLL stdc11 + pch.h diff --git a/six/modules/c++/six.sicd/include/six/sicd/ImageData.h b/six/modules/c++/six.sicd/include/six/sicd/ImageData.h index 55563b019..10d57f773 100644 --- a/six/modules/c++/six.sicd/include/six/sicd/ImageData.h +++ b/six/modules/c++/six.sicd/include/six/sicd/ImageData.h @@ -40,7 +40,11 @@ namespace six namespace sicd { using cx_float = std::complex; -using AMP8I_PHS8I_t = std::pair; +struct AMP8I_PHS8I_t final // std::pair isn't trivial_copyable() +{ + uint8_t first; // amplitude + uint8_t second; // phase +}; //! Fixed size 256 element array of complex values. using input_values_t = std::array, UINT8_MAX + 1>; //! Fixed size 256 x 256 matrix of complex values. diff --git a/six/modules/c++/six.sicd/include/six/sicd/Utilities.h b/six/modules/c++/six.sicd/include/six/sicd/Utilities.h index d56b06dbc..898a000c7 100644 --- a/six/modules/c++/six.sicd/include/six/sicd/Utilities.h +++ b/six/modules/c++/six.sicd/include/six/sicd/Utilities.h @@ -654,7 +654,7 @@ extern void writeAsNITF(const std::filesystem::path&, const std::vector> make_complex_image(const types::RowCol&); - extern std::vector to_bytes(const ComplexImageResult&, ptrdiff_t cutoff=-1); + extern std::vector toBytes(const ComplexImageResult&, ptrdiff_t cutoff=-1); } } diff --git a/six/modules/c++/six.sicd/six.sicd.vcxproj b/six/modules/c++/six.sicd/six.sicd.vcxproj index 5127169e5..92b676a1e 100644 --- a/six/modules/c++/six.sicd/six.sicd.vcxproj +++ b/six/modules/c++/six.sicd/six.sicd.vcxproj @@ -90,6 +90,7 @@ AdvancedVectorExtensions2 MultiThreadedDLL stdc11 + pch.h diff --git a/six/modules/c++/six.sicd/source/Utilities.cpp b/six/modules/c++/six.sicd/source/Utilities.cpp index 6f04c5f66..71ef8251a 100644 --- a/six/modules/c++/six.sicd/source/Utilities.cpp +++ b/six/modules/c++/six.sicd/source/Utilities.cpp @@ -38,6 +38,8 @@ #include #include #include +#include + #include #include #include @@ -1638,23 +1640,21 @@ std::vector> six::sicd::testing::make_complex_image(const ty return image; } -std::vector six::sicd::testing::to_bytes(const ComplexImageResult& result, ptrdiff_t cutoff) +std::vector six::sicd::testing::toBytes(const ComplexImageResult& result, ptrdiff_t cutoff) { const auto& image = result.widebandData; - const auto bytes = six::as_bytes(image); + const auto bytes = sys::as_bytes(image); std::vector retval; const auto& data = *(result.pComplexData); if (data.getPixelType() == six::PixelType::AMP8I_PHS8I) { retval.resize(image.size() * data.getNumBytesPerPixel()); - const std::span pRetval(retval.data(), retval.size()); - data.convertPixels(bytes, pRetval, cutoff); + data.convertPixels(bytes, sys::make_span(retval), cutoff); } else { - auto pBytes = bytes.data(); - retval.insert(retval.begin(), pBytes, pBytes + bytes.size()); + retval.insert(retval.begin(), bytes.begin(), bytes.end()); } return retval; diff --git a/six/modules/c++/six.sicd/unittests/test_AMP8I_PHS8I.cpp b/six/modules/c++/six.sicd/unittests/test_AMP8I_PHS8I.cpp index 6d09b437f..7f2ef7bf1 100644 --- a/six/modules/c++/six.sicd/unittests/test_AMP8I_PHS8I.cpp +++ b/six/modules/c++/six.sicd/unittests/test_AMP8I_PHS8I.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -166,7 +167,7 @@ TEST_CASE(test_8bit_ampphs) { for (uint16_t input_value = 0; input_value <= UINT8_MAX; input_value++) { - AMP8I_PHS8I_t input(static_cast(input_amplitude), static_cast(input_value)); + AMP8I_PHS8I_t input{ static_cast(input_amplitude), static_cast(input_value) }; const auto S = six::sicd::Utilities::from_AMP8I_PHS8I(static_cast(input_amplitude), static_cast(input_value), nullptr); inputs.push_back(std::move(input)); @@ -232,7 +233,14 @@ static std::vector > read_8bit_ampphs(const std::string& tes return retval; } -static std::pair to_AMP8I_PHS8I(const six::sicd::ImageData& imageData, const std::vector>& widebandData) +template +struct Pair final // std::pair is not trivial copyable +{ + T first; + T second; +}; + +static Pair to_AMP8I_PHS8I(const six::sicd::ImageData& imageData, const std::vector>& widebandData) { // image is far too big to call to_AMP8I_PHS8I() with DEBUG code const auto size = sys::debug ? widebandData.size() / 200 : widebandData.size(); @@ -240,7 +248,7 @@ static std::pair to_AMP8I_PHS8I(const six::sicd::ImageData& std::vector results(widebandData_.size()); imageData.to_AMP8I_PHS8I(widebandData_, std::span< AMP8I_PHS8I_t>(results.data(), results.size()), 0); - std::pair retval(0, 0); + Pair retval{ 0, 0 }; for (const auto& r : results) { retval.first += r.first; @@ -271,7 +279,7 @@ TEST_CASE(read_8bit_ampphs_with_table) imageData.amplitudeTable.reset(std::make_unique< six::AmplitudeTable>(AmpTable)); const auto actual = to_AMP8I_PHS8I(imageData, widebandData); const auto expected(sys::debug ? - std::pair(12647523, 16973148) : std::pair(3044868397, 3394353166)); + Pair{12647523, 16973148} : Pair{ 3044868397, 3394353166 }); //TEST_ASSERT_EQ(actual.first, expected.first); // TODO TEST_ASSERT_EQ(actual.second, expected.second); } @@ -290,7 +298,7 @@ TEST_CASE(read_8bit_ampphs_no_table) six::sicd::ImageData imageData; const auto actual = to_AMP8I_PHS8I(imageData, widebandData); const auto expected(sys::debug ? - std::pair(12647654, 16973148) : std::pair(3044873160, 3394353122)); + Pair{12647654, 16973148} : Pair{ 3044873160, 3394353122 }); TEST_ASSERT_EQ(actual.first, expected.first); TEST_ASSERT_EQ(actual.second, expected.second); } @@ -368,7 +376,7 @@ template static void adjust_image(TImage& image) { // Make it easier to know what we're looking at when examining a binary dump of the SICD - const auto pImageBytes = six::as_writable_bytes(image); + const auto pImageBytes = sys::as_writable_bytes(image); pImageBytes[0] = static_cast('['); for (size_t i = 1; i < pImageBytes.size() - 1; i++) @@ -413,7 +421,7 @@ static void test_assert_eq(std::span bytes, const std::vector(bytes.data(), bytes.size())); } @@ -504,7 +512,7 @@ static void test_assert_image_(const std::string& testName, complexData.imageData->to_AMP8I_PHS8I(input, result_); static const std::vector expected_amp8i_phs8i{ - AMP8I_PHS8I_t(91, 42), AMP8I_PHS8I_t(42, 42), AMP8I_PHS8I_t(42, 42), AMP8I_PHS8I_t(42, 93) }; // "[******]" + AMP8I_PHS8I_t{91, 42}, AMP8I_PHS8I_t{42, 42}, AMP8I_PHS8I_t{42, 42}, AMP8I_PHS8I_t{42, 93} }; // "[******]" for (size_t i = 0; i < result.size(); i++) { TEST_ASSERT_EQ(result[i].first, expected_amp8i_phs8i[i].first); @@ -714,7 +722,7 @@ TEST_CASE(test_ComplexToAMP8IPHS8I) for(int i = 0; i < 256; i++) { for(int j = 0; j < 256; j++) { Pairs p; - p.integral = {i, j}; + p.integral = {gsl::narrow(i), gsl::narrow(j)}; p.floating = six::sicd::Utilities::from_AMP8I_PHS8I(i, j, &litudeTable); candidates.push_back(p); } diff --git a/six/modules/c++/six.sicd/unittests/test_valid_six.cpp b/six/modules/c++/six.sicd/unittests/test_valid_six.cpp index 28bb32710..aaf8f7985 100644 --- a/six/modules/c++/six.sicd/unittests/test_valid_six.cpp +++ b/six/modules/c++/six.sicd/unittests/test_valid_six.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -323,7 +324,7 @@ static void test_assert_eq(std::span bytes, const std::vector(bytes.data(), bytes.size())); } diff --git a/six/modules/c++/six.sidd/six.sidd.vcxproj b/six/modules/c++/six.sidd/six.sidd.vcxproj index 5f170397e..7e8d5ab45 100644 --- a/six/modules/c++/six.sidd/six.sidd.vcxproj +++ b/six/modules/c++/six.sidd/six.sidd.vcxproj @@ -90,6 +90,7 @@ AdvancedVectorExtensions2 MultiThreadedDLL stdc11 + pch.h diff --git a/six/modules/c++/six/include/six/Utilities.h b/six/modules/c++/six/include/six/Utilities.h index ce7ab873a..70ccbcb23 100644 --- a/six/modules/c++/six/include/six/Utilities.h +++ b/six/modules/c++/six/include/six/Utilities.h @@ -317,40 +317,6 @@ void getErrors(const ErrorStatistics* errorStats, */ std::string findSchemaPath(const std::string& progname); -template -inline std::span as_bytes(std::span buffer) -{ - // coda-oss checks to be sure T is trivially_copyable. While this is - // correct (converting something else to bytes doesn't make sense), existing - // code didn't have that check. - const void* const pData = buffer.data(); - auto const pBytes = static_cast(pData); - return std::span(pBytes, buffer.size_bytes()); // TODO: use std::as_bytes -} -template -inline std::span as_bytes(const std::vector& buffer) -{ - const auto s = sys::make_span(buffer); - return six::as_bytes(s); -} - -template -inline std::span as_writable_bytes(std::span& buffer) -{ - // coda-oss checks to be sure T is trivially_copyable. While this is - // correct (converting something else to bytes doesn't make sense), existing - // code didn't have that check. - void* const pData = buffer.data(); - auto const pBytes = static_cast(pData); - return std::span(pBytes, buffer.size_bytes()); // TODO: use std::as_writable_bytes -} -template -inline std::span as_writable_bytes(std::vector& buffer) -{ - const auto s = sys::make_span(buffer); - return as_writable_bytes(s); -} - namespace testing { std::filesystem::path findRootDir(const std::filesystem::path& dir); diff --git a/six/modules/c++/six/six.vcxproj b/six/modules/c++/six/six.vcxproj index 24832f05a..efa1c1ea3 100644 --- a/six/modules/c++/six/six.vcxproj +++ b/six/modules/c++/six/six.vcxproj @@ -91,6 +91,7 @@ MultiThreadedDLL true stdc11 + pch.h diff --git a/six/modules/c++/six/source/NITFWriteControl.cpp b/six/modules/c++/six/source/NITFWriteControl.cpp index bc4a17c85..89f3fd48a 100644 --- a/six/modules/c++/six/source/NITFWriteControl.cpp +++ b/six/modules/c++/six/source/NITFWriteControl.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -200,11 +201,10 @@ inline size_t getBandSize(const NITFSegmentInfo& segmentInfo, const Data& data) return bandSize; } -inline std::span as_bytes(BufferList::value_type pImageData, +static auto asBytes(BufferList::value_type pImageData, const NITFSegmentInfo& segmentInfo, const Data& data) { const auto bandSize = getBandSize(segmentInfo, data); - const void* pImageData_ = pImageData; auto size_in_bytes = bandSize * data.getNumChannels(); // At this point, we've lost information about the ACTUAL size of the buffer. Normally, the computation above will be correct. @@ -215,7 +215,8 @@ inline std::span as_bytes(BufferList::value_type pImageData, size_in_bytes *= sizeof(float); } - return std::span(static_cast(pImageData_), size_in_bytes); + const void* const pImageData_ = pImageData; + return sys::make_span(static_cast(pImageData_), size_in_bytes); } // this bypasses the normal NITF ImageWriter and streams directly to the output @@ -232,7 +233,7 @@ inline std::shared_ptr makeWriteHandler(const NITFSegment BufferList::value_type pImageData, const Data& data, bool doByteSwap, ptrdiff_t cutoff) // for eventual use by to_AMP8I_PHS8I() { - const auto pImageData_ = as_bytes(pImageData, segmentInfo, data); + const auto pImageData_ = asBytes(pImageData, segmentInfo, data); return makeWriteHandler(segmentInfo, pImageData_, data, doByteSwap, cutoff); } @@ -326,7 +327,7 @@ static nitf::ImageSource do_make_ImageSource(std::span pImageData_, con const auto pixelSize = data.getNumBytesPerPixel() / numChannels; const auto bandSize = getBandSize(segmentInfo, data); - const auto pImageData = six::as_bytes(pImageData_); + const auto pImageData = sys::as_bytes(pImageData_); if ((pImageData.size() / numChannels) != bandSize) { throw std::invalid_argument("bandSize mis-match!"); @@ -360,7 +361,7 @@ inline nitf::ImageSource make_ImageSource_from_BufferList(std::span> imageData { do_save(imageData, outputFile, convert_paths(schemaPaths)); } -void NITFWriteControl::save_image(std::span> imageData, - nitf::IOInterface& outputFile, - const std::vector& schemaPaths) -{ - do_save(imageData, outputFile, convert_paths(schemaPaths)); -} void NITFWriteControl::save_image(std::span imageData, nitf::IOInterface& outputFile, const std::vector& schemaPaths) diff --git a/six/projects/csm/csm.vcxproj b/six/projects/csm/csm.vcxproj index 1728ae1a4..0edc26ed9 100644 --- a/six/projects/csm/csm.vcxproj +++ b/six/projects/csm/csm.vcxproj @@ -190,6 +190,7 @@ AdvancedVectorExtensions2 MultiThreadedDLL stdc11 + pch.h