Remove duplicate forms of spancpy() Borrow the internal code from span.h that allows making a span<const T> from a span<T> when appropriate to do so. Then add const to tests to show that it is accepted. Change-Id: Idc1d5f07a005f57fcd95433166ab506a3b91a9c3 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/82731 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcrt/span_util.h b/core/fxcrt/span_util.h index bbf5ec5..6d23497 100644 --- a/core/fxcrt/span_util.h +++ b/core/fxcrt/span_util.h
@@ -5,6 +5,8 @@ #ifndef CORE_FXCRT_SPAN_UTIL_H_ #define CORE_FXCRT_SPAN_UTIL_H_ +#include <string.h> + #include <vector> #include "third_party/base/check_op.h" @@ -12,32 +14,20 @@ namespace fxcrt { -// NOTE: there are separate versions fot span<T> and span<const T> -// source arguments because type deduction seems to have trouble with -// automatically converting span<T> to span<const T>. - // Bounds-checked copies from spans into spans. -template <typename T> -void spancpy(pdfium::span<T> dst, pdfium::span<const T> src) { - CHECK_GE(dst.size(), src.size()); - memcpy(dst.data(), src.data(), src.size_bytes()); -} - -template <typename T> -void spancpy(pdfium::span<T> dst, pdfium::span<T> src) { +template <typename T, + typename U, + typename = pdfium::internal::EnableIfLegalSpanConversion<T, U>> +void spancpy(pdfium::span<T> dst, pdfium::span<U> src) { CHECK_GE(dst.size(), src.size()); memcpy(dst.data(), src.data(), src.size_bytes()); } // Bounds-checked moves from spans into spans. -template <typename T> -void spanmove(pdfium::span<T> dst, pdfium::span<T> src) { - CHECK_GE(dst.size(), src.size()); - memmove(dst.data(), src.data(), src.size_bytes()); -} - -template <typename T> -void spanmove(pdfium::span<T> dst, pdfium::span<const T> src) { +template <typename T, + typename U, + typename = pdfium::internal::EnableIfLegalSpanConversion<T, U>> +void spanmove(pdfium::span<T> dst, pdfium::span<U> src) { CHECK_GE(dst.size(), src.size()); memmove(dst.data(), src.data(), src.size_bytes()); }
diff --git a/core/fxcrt/span_util_unittest.cpp b/core/fxcrt/span_util_unittest.cpp index d0de999..aae4f43 100644 --- a/core/fxcrt/span_util_unittest.cpp +++ b/core/fxcrt/span_util_unittest.cpp
@@ -39,7 +39,8 @@ TEST(Spancpy, FitsWithin) { std::vector<char> src(2, 'A'); std::vector<char> dst(4, 'B'); - fxcrt::spancpy(fxcrt::Subspan(dst, 1), pdfium::make_span(src)); + // Also show that a const src argument is acceptable. + fxcrt::spancpy(fxcrt::Subspan(dst, 1), pdfium::span<const char>(src)); EXPECT_EQ(dst[0], 'B'); EXPECT_EQ(dst[1], 'A'); EXPECT_EQ(dst[2], 'A'); @@ -65,3 +66,14 @@ EXPECT_EQ(dst[2], 'B'); EXPECT_EQ(dst[3], 'B'); } + +TEST(Spanmove, FitsWithin) { + std::vector<char> src(2, 'A'); + std::vector<char> dst(4, 'B'); + // Also show that a const src argument is acceptable. + fxcrt::spanmove(fxcrt::Subspan(dst, 1), pdfium::span<const char>(src)); + EXPECT_EQ(dst[0], 'B'); + EXPECT_EQ(dst[1], 'A'); + EXPECT_EQ(dst[2], 'A'); + EXPECT_EQ(dst[3], 'B'); +}