diff options
author | Tom Sepez <tsepez@chromium.org> | 2017-04-13 13:41:24 -0700 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-04-13 22:06:11 +0000 |
commit | 3cfff70244e31f48068c32cbc4c070468f4c3e85 (patch) | |
tree | 331dc0766a512ac5854c4deba76a6174942cdc02 | |
parent | 7b7c6532310eeeabadae7b34fdf86f4a890951e8 (diff) | |
download | pdfium-3cfff70244e31f48068c32cbc4c070468f4c3e85.tar.xz |
Add ability to make StringCs from std::vector<>s.
Pre-cursor to using more std::vector<uint8_t> as byte buffers.
The widestring test case is more complicated, where we're not sure
of having any particular uint*_t type to match wchar_t.
Change-Id: Ic27980f16cdbc61fac7c11f39a85eea58d19bacb
Reviewed-on: https://pdfium-review.googlesource.com/4153
Reviewed-by: dsinclair <dsinclair@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
-rw-r--r-- | core/fxcrt/cfx_bytestring_unittest.cpp | 13 | ||||
-rw-r--r-- | core/fxcrt/cfx_string_c_template.h | 8 | ||||
-rw-r--r-- | core/fxcrt/cfx_widestring_unittest.cpp | 14 | ||||
-rw-r--r-- | xfa/fxfa/fm2js/xfa_fm2jscontext.cpp | 6 |
4 files changed, 38 insertions, 3 deletions
diff --git a/core/fxcrt/cfx_bytestring_unittest.cpp b/core/fxcrt/cfx_bytestring_unittest.cpp index 3b679a086c..9cfc773fad 100644 --- a/core/fxcrt/cfx_bytestring_unittest.cpp +++ b/core/fxcrt/cfx_bytestring_unittest.cpp @@ -4,6 +4,8 @@ #include "core/fxcrt/cfx_bytestring.h" +#include <vector> + #include "testing/fx_string_testhelpers.h" #include "testing/gtest/include/gtest/gtest.h" @@ -773,6 +775,17 @@ TEST(fxcrt, ByteStringCFromChar) { EXPECT_NE(longer_string, lower_a_string_from_char); } +TEST(fxcrt, ByteStringCFromVector) { + std::vector<uint8_t> null_vec; + CFX_ByteStringC null_string(null_vec); + EXPECT_EQ(0, null_string.GetLength()); + + std::vector<uint8_t> lower_a_vec(10, static_cast<uint8_t>('a')); + CFX_ByteStringC lower_a_string(lower_a_vec); + EXPECT_EQ(10, lower_a_string.GetLength()); + EXPECT_EQ("aaaaaaaaaa", lower_a_string); +} + TEST(fxcrt, ByteStringCGetID) { CFX_ByteStringC null_string; EXPECT_EQ(0u, null_string.GetID()); diff --git a/core/fxcrt/cfx_string_c_template.h b/core/fxcrt/cfx_string_c_template.h index b52817d790..4aba2cd4b9 100644 --- a/core/fxcrt/cfx_string_c_template.h +++ b/core/fxcrt/cfx_string_c_template.h @@ -9,8 +9,10 @@ #include <algorithm> #include <type_traits> +#include <vector> #include "core/fxcrt/fx_system.h" +#include "third_party/base/stl_util.h" // An immutable string with caller-provided storage which must outlive the // string itself. These are not necessarily nul-terminated, so that substring @@ -53,6 +55,12 @@ class CFX_StringCTemplate { m_Length = src.m_Length; } + // Any changes to |vec| invalidate the string. + explicit CFX_StringCTemplate(const std::vector<UnsignedType>& vec) { + m_Ptr = vec.data(); + m_Length = pdfium::CollectionSize<FX_STRSIZE>(vec); + } + CFX_StringCTemplate& operator=(const CharType* src) { m_Ptr = reinterpret_cast<const UnsignedType*>(src); m_Length = src ? FXSYS_len(src) : 0; diff --git a/core/fxcrt/cfx_widestring_unittest.cpp b/core/fxcrt/cfx_widestring_unittest.cpp index dd44cb70af..498b4f0b6a 100644 --- a/core/fxcrt/cfx_widestring_unittest.cpp +++ b/core/fxcrt/cfx_widestring_unittest.cpp @@ -4,6 +4,8 @@ #include "core/fxcrt/cfx_widestring.h" +#include <vector> + #include "testing/fx_string_testhelpers.h" #include "testing/gtest/include/gtest/gtest.h" @@ -689,6 +691,18 @@ TEST(fxcrt, WideStringUTF16LE_Encode) { } } +TEST(fxcrt, WideStringCFromVector) { + std::vector<CFX_WideStringC::UnsignedType> null_vec; + CFX_WideStringC null_string(null_vec); + EXPECT_EQ(0, null_string.GetLength()); + + std::vector<CFX_WideStringC::UnsignedType> lower_a_vec( + 10, static_cast<CFX_WideStringC::UnsignedType>(L'a')); + CFX_WideStringC lower_a_string(lower_a_vec); + EXPECT_EQ(10, lower_a_string.GetLength()); + EXPECT_EQ(L"aaaaaaaaaa", lower_a_string); +} + TEST(fxcrt, WideStringCOperatorSubscript) { // CFX_WideStringC includes the NUL terminator for non-empty strings. CFX_WideStringC abc(L"abc"); diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp index 56a99157d3..ead2a7dbe3 100644 --- a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp +++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp @@ -4642,9 +4642,9 @@ void CXFA_FM2JSContext::Get(CFXJSE_Value* pThis, return; int32_t size = pFile->GetSize(); - std::vector<uint8_t> pData(size); - pFile->ReadBlock(pData.data(), size); - args.GetReturnValue()->SetString(CFX_ByteStringC(pData.data(), size)); + std::vector<uint8_t> dataBuf(size); + pFile->ReadBlock(dataBuf.data(), size); + args.GetReturnValue()->SetString(CFX_ByteStringC(dataBuf)); } // static |