Use std::variant inside CPDF_StreamContentParser
Replace struct ContentParam with std::variant.
Change-Id: If211737c59449cb525ff96c66ab129044c6273df
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/130112
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 62eea03..0525708 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -422,8 +422,10 @@
if (m_ParamStartPos == kParamBufSize) {
m_ParamStartPos = 0;
}
- if (m_ParamBuf[m_ParamStartPos].m_Type == ContentParam::Type::kObject)
- m_ParamBuf[m_ParamStartPos].m_pObject.Reset();
+ auto& param = m_ParamBuf[m_ParamStartPos];
+ if (std::holds_alternative<RetainPtr<CPDF_Object>>(param)) {
+ std::get<RetainPtr<CPDF_Object>>(param).Reset();
+ }
return m_ParamStartPos;
}
@@ -436,31 +438,27 @@
}
void CPDF_StreamContentParser::AddNameParam(ByteStringView bsName) {
- ContentParam& param = m_ParamBuf[GetNextParamPos()];
- param.m_Type = ContentParam::Type::kName;
- param.m_Name = PDF_NameDecode(bsName);
+ m_ParamBuf[GetNextParamPos()] = PDF_NameDecode(bsName);
}
void CPDF_StreamContentParser::AddNumberParam(ByteStringView str) {
- ContentParam& param = m_ParamBuf[GetNextParamPos()];
- param.m_Type = ContentParam::Type::kNumber;
- param.m_Number = FX_Number(str);
+ m_ParamBuf[GetNextParamPos()] = FX_Number(str);
}
void CPDF_StreamContentParser::AddObjectParam(RetainPtr<CPDF_Object> pObj) {
- ContentParam& param = m_ParamBuf[GetNextParamPos()];
- param.m_Type = ContentParam::Type::kObject;
- param.m_pObject = std::move(pObj);
+ m_ParamBuf[GetNextParamPos()] = std::move(pObj);
}
void CPDF_StreamContentParser::ClearAllParams() {
uint32_t index = m_ParamStartPos;
for (uint32_t i = 0; i < m_ParamCount; i++) {
- if (m_ParamBuf[index].m_Type == ContentParam::Type::kObject)
- m_ParamBuf[index].m_pObject.Reset();
+ if (std::holds_alternative<RetainPtr<CPDF_Object>>(m_ParamBuf[index])) {
+ std::get<RetainPtr<CPDF_Object>>(m_ParamBuf[index]).Reset();
+ }
index++;
- if (index == kParamBufSize)
+ if (index == kParamBufSize) {
index = 0;
+ }
}
m_ParamStartPos = 0;
m_ParamCount = 0;
@@ -475,23 +473,20 @@
real_index -= kParamBufSize;
}
ContentParam& param = m_ParamBuf[real_index];
- if (param.m_Type == ContentParam::Type::kNumber) {
- param.m_Type = ContentParam::Type::kObject;
- param.m_pObject =
- param.m_Number.IsInteger()
- ? pdfium::MakeRetain<CPDF_Number>(param.m_Number.GetSigned())
- : pdfium::MakeRetain<CPDF_Number>(param.m_Number.GetFloat());
- return param.m_pObject;
+ if (std::holds_alternative<FX_Number>(param)) {
+ const auto& number = std::get<FX_Number>(param);
+ param = number.IsInteger()
+ ? pdfium::MakeRetain<CPDF_Number>(number.GetSigned())
+ : pdfium::MakeRetain<CPDF_Number>(number.GetFloat());
+ return std::get<RetainPtr<CPDF_Object>>(param);
}
- if (param.m_Type == ContentParam::Type::kName) {
- param.m_Type = ContentParam::Type::kObject;
- param.m_pObject = m_pDocument->New<CPDF_Name>(param.m_Name);
- return param.m_pObject;
+ if (std::holds_alternative<ByteString>(param)) {
+ const auto& name = std::get<ByteString>(param);
+ param = m_pDocument->New<CPDF_Name>(name);
+ return std::get<RetainPtr<CPDF_Object>>(param);
}
- if (param.m_Type == ContentParam::Type::kObject)
- return param.m_pObject;
-
- NOTREACHED();
+ CHECK(std::holds_alternative<RetainPtr<CPDF_Object>>(param));
+ return std::get<RetainPtr<CPDF_Object>>(param);
}
ByteString CPDF_StreamContentParser::GetString(uint32_t index) const {
@@ -503,11 +498,16 @@
real_index -= kParamBufSize;
const ContentParam& param = m_ParamBuf[real_index];
- if (param.m_Type == ContentParam::Type::kName)
- return param.m_Name;
+ if (std::holds_alternative<ByteString>(param)) {
+ return std::get<ByteString>(param);
+ }
- if (param.m_Type == ContentParam::Type::kObject && param.m_pObject)
- return param.m_pObject->GetString();
+ if (std::holds_alternative<RetainPtr<CPDF_Object>>(param)) {
+ const auto& obj = std::get<RetainPtr<CPDF_Object>>(param);
+ if (obj) {
+ return obj->GetString();
+ }
+ }
return ByteString();
}
@@ -521,11 +521,16 @@
real_index -= kParamBufSize;
const ContentParam& param = m_ParamBuf[real_index];
- if (param.m_Type == ContentParam::Type::kNumber)
- return param.m_Number.GetFloat();
+ if (std::holds_alternative<FX_Number>(param)) {
+ return std::get<FX_Number>(param).GetFloat();
+ }
- if (param.m_Type == ContentParam::Type::kObject && param.m_pObject)
- return param.m_pObject->GetNumber();
+ if (std::holds_alternative<RetainPtr<CPDF_Object>>(param)) {
+ const auto& obj = std::get<RetainPtr<CPDF_Object>>(param);
+ if (obj) {
+ return obj->GetNumber();
+ }
+ }
return 0;
}
@@ -1712,7 +1717,3 @@
ByteStringView abbr) {
return FindFullName(kInlineValueAbbr, abbr);
}
-
-CPDF_StreamContentParser::ContentParam::ContentParam() = default;
-
-CPDF_StreamContentParser::ContentParam::~ContentParam() = default;
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.h b/core/fpdfapi/page/cpdf_streamcontentparser.h
index 1a9a0f3..57e908c 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.h
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.h
@@ -10,6 +10,7 @@
#include <array>
#include <memory>
#include <stack>
+#include <variant>
#include <vector>
#include "core/fpdfapi/page/cpdf_contentmarks.h"
@@ -72,17 +73,8 @@
private:
enum class RenderType : bool { kFill = false, kStroke = true };
- struct ContentParam {
- enum class Type : uint8_t { kObject = 0, kNumber, kName };
-
- ContentParam();
- ~ContentParam();
-
- Type m_Type = Type::kObject;
- FX_Number m_Number;
- ByteString m_Name;
- RetainPtr<CPDF_Object> m_pObject;
- };
+ using ContentParam =
+ std::variant<RetainPtr<CPDF_Object>, FX_Number, ByteString>;
static constexpr int kParamBufSize = 16;