Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Unified Diff: core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp

Issue 1576113003: Use std::map in CPDF_IndirectObjects (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Remove cbegin() and cend(). Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
index 2cb81002fb3202460a2a637290cd9aab826dd4b7..e0ce3faadfeaadfc7ad83a9141cc1564eaeae7c9 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
@@ -6,6 +6,8 @@
#include "core/include/fpdfapi/fpdf_objects.h"
+#include <algorithm>
+
#include "core/include/fpdfapi/fpdf_parser.h"
#include "core/include/fxcrt/fx_string.h"
#include "third_party/base/stl_util.h"
@@ -147,7 +149,7 @@ CPDF_Dictionary* CPDF_Object::GetDict() const {
return AsStream()->GetDict();
case PDFOBJ_REFERENCE: {
const CPDF_Reference* pRef = AsReference();
- CPDF_IndirectObjects* pIndirect = pRef->GetObjList();
+ CPDF_IndirectObjectHolder* pIndirect = pRef->GetObjList();
if (!pIndirect)
return nullptr;
CPDF_Object* pObj =
@@ -300,7 +302,7 @@ CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect,
}
return NULL;
}
-CPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjects* pDoc) const {
+CPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjectHolder* pDoc) const {
if (m_ObjNum) {
return new CPDF_Reference(pDoc, m_ObjNum);
}
@@ -513,7 +515,7 @@ void CPDF_Array::RemoveAt(FX_DWORD i, int nCount) {
}
void CPDF_Array::SetAt(FX_DWORD i,
CPDF_Object* pObj,
- CPDF_IndirectObjects* pObjs) {
+ CPDF_IndirectObjectHolder* pObjs) {
ASSERT(IsArray());
ASSERT(i < (FX_DWORD)m_Objects.GetSize());
if (i >= (FX_DWORD)m_Objects.GetSize())
@@ -528,14 +530,14 @@ void CPDF_Array::SetAt(FX_DWORD i,
}
void CPDF_Array::InsertAt(FX_DWORD index,
CPDF_Object* pObj,
- CPDF_IndirectObjects* pObjs) {
+ CPDF_IndirectObjectHolder* pObjs) {
if (pObj->GetObjNum()) {
ASSERT(pObjs);
pObj = new CPDF_Reference(pObjs, pObj->GetObjNum());
}
m_Objects.InsertAt(index, pObj);
}
-void CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs) {
+void CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjectHolder* pObjs) {
if (pObj->GetObjNum()) {
ASSERT(pObjs);
pObj = new CPDF_Reference(pObjs, pObj->GetObjNum());
@@ -560,7 +562,8 @@ void CPDF_Array::AddNumber(FX_FLOAT f) {
pNumber->SetNumber(f);
Add(pNumber);
}
-void CPDF_Array::AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum) {
+void CPDF_Array::AddReference(CPDF_IndirectObjectHolder* pDoc,
+ FX_DWORD objnum) {
ASSERT(IsArray());
Add(new CPDF_Reference(pDoc, objnum));
}
@@ -765,12 +768,12 @@ void CPDF_Dictionary::SetAtString(const CFX_ByteStringC& key,
SetAt(key, new CPDF_String(str, FALSE));
}
void CPDF_Dictionary::SetAtReference(const CFX_ByteStringC& key,
- CPDF_IndirectObjects* pDoc,
+ CPDF_IndirectObjectHolder* pDoc,
FX_DWORD objnum) {
SetAt(key, new CPDF_Reference(pDoc, objnum));
}
void CPDF_Dictionary::AddReference(const CFX_ByteStringC& key,
- CPDF_IndirectObjects* pDoc,
+ CPDF_IndirectObjectHolder* pDoc,
FX_DWORD objnum) {
SetAt(key, new CPDF_Reference(pDoc, objnum));
}
@@ -1049,111 +1052,88 @@ uint8_t* CPDF_StreamAcc::DetachData() {
FXSYS_memcpy(p, m_pData, m_dwSize);
return p;
}
-void CPDF_Reference::SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum) {
+void CPDF_Reference::SetRef(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum) {
m_pObjList = pDoc;
m_RefObjNum = objnum;
}
-CPDF_IndirectObjects::CPDF_IndirectObjects(CPDF_Parser* pParser) {
- m_pParser = pParser;
- m_IndirectObjs.InitHashTable(1013);
- if (pParser) {
+CPDF_IndirectObjectHolder::CPDF_IndirectObjectHolder(CPDF_Parser* pParser)
+ : m_pParser(pParser), m_LastObjNum(0) {
+ if (pParser)
m_LastObjNum = m_pParser->GetLastObjNum();
- } else {
- m_LastObjNum = 0;
- }
}
-CPDF_IndirectObjects::~CPDF_IndirectObjects() {
- FX_POSITION pos = m_IndirectObjs.GetStartPosition();
- while (pos) {
- void* key;
- void* value;
- m_IndirectObjs.GetNextAssoc(pos, key, value);
- static_cast<CPDF_Object*>(value)->Destroy();
+CPDF_IndirectObjectHolder::~CPDF_IndirectObjectHolder() {
+ for (const auto& pair : m_IndirectObjs) {
+ pair.second->Destroy();
}
}
-CPDF_Object* CPDF_IndirectObjects::GetIndirectObject(FX_DWORD objnum,
- PARSE_CONTEXT* pContext) {
+CPDF_Object* CPDF_IndirectObjectHolder::GetIndirectObject(
+ FX_DWORD objnum,
+ PARSE_CONTEXT* pContext) {
if (objnum == 0)
return nullptr;
- void* value;
- if (m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, value)) {
- CPDF_Object* pValue = static_cast<CPDF_Object*>(value);
- if (pValue->GetObjNum() == -1)
- return nullptr;
- return pValue;
- }
- CPDF_Object* pObj = nullptr;
- if (m_pParser)
- pObj = m_pParser->ParseIndirectObject(this, objnum, pContext);
+ auto it = m_IndirectObjs.find(objnum);
+ if (it != m_IndirectObjs.end())
+ return it->second->GetObjNum() != -1 ? it->second : nullptr;
+
+ if (!m_pParser)
+ return nullptr;
+
+ CPDF_Object* pObj = m_pParser->ParseIndirectObject(this, objnum, pContext);
if (!pObj)
return nullptr;
pObj->m_ObjNum = objnum;
- if (m_LastObjNum < objnum) {
- m_LastObjNum = objnum;
- }
- if (m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, value)) {
- if (value)
- static_cast<CPDF_Object*>(value)->Destroy();
- }
- m_IndirectObjs.SetAt((void*)(uintptr_t)objnum, pObj);
+ m_LastObjNum = std::max(m_LastObjNum, objnum);
+ if (m_IndirectObjs[objnum])
+ m_IndirectObjs[objnum]->Destroy();
+
+ m_IndirectObjs[objnum] = pObj;
return pObj;
}
-int CPDF_IndirectObjects::GetIndirectType(FX_DWORD objnum) {
- void* value;
- if (m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, value))
- return static_cast<CPDF_Object*>(value)->GetType();
-
- if (m_pParser) {
- PARSE_CONTEXT context;
- FXSYS_memset(&context, 0, sizeof(PARSE_CONTEXT));
- context.m_Flags = PDFPARSE_TYPEONLY;
- return (int)(uintptr_t)m_pParser->ParseIndirectObject(this, objnum,
- &context);
- }
- return 0;
+int CPDF_IndirectObjectHolder::GetIndirectType(FX_DWORD objnum) {
+ auto it = m_IndirectObjs.find(objnum);
+ if (it != m_IndirectObjs.end())
+ return it->second->GetType();
+
+ if (!m_pParser)
+ return 0;
+
+ PARSE_CONTEXT context;
+ FXSYS_memset(&context, 0, sizeof(PARSE_CONTEXT));
+ context.m_Flags = PDFPARSE_TYPEONLY;
+ return (int)(uintptr_t)m_pParser->ParseIndirectObject(this, objnum, &context);
}
-FX_DWORD CPDF_IndirectObjects::AddIndirectObject(CPDF_Object* pObj) {
+FX_DWORD CPDF_IndirectObjectHolder::AddIndirectObject(CPDF_Object* pObj) {
if (pObj->m_ObjNum) {
return pObj->m_ObjNum;
}
m_LastObjNum++;
- m_IndirectObjs.SetAt((void*)(uintptr_t)m_LastObjNum, pObj);
+ m_IndirectObjs[m_LastObjNum] = pObj;
pObj->m_ObjNum = m_LastObjNum;
return m_LastObjNum;
}
-void CPDF_IndirectObjects::ReleaseIndirectObject(FX_DWORD objnum) {
- void* value;
- if (!m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, value))
- return;
- CPDF_Object* pValue = static_cast<CPDF_Object*>(value);
- if (pValue->GetObjNum() == -1)
+void CPDF_IndirectObjectHolder::ReleaseIndirectObject(FX_DWORD objnum) {
+ auto it = m_IndirectObjs.find(objnum);
+ if (it == m_IndirectObjs.end() || it->second->GetObjNum() == -1)
return;
- pValue->Destroy();
- m_IndirectObjs.RemoveKey((void*)(uintptr_t)objnum);
+ it->second->Destroy();
+ m_IndirectObjs.erase(it);
}
-FX_BOOL CPDF_IndirectObjects::InsertIndirectObject(FX_DWORD objnum,
- CPDF_Object* pObj) {
+FX_BOOL CPDF_IndirectObjectHolder::InsertIndirectObject(FX_DWORD objnum,
+ CPDF_Object* pObj) {
if (!objnum || !pObj)
return FALSE;
- void* value = nullptr;
- if (m_IndirectObjs.Lookup((void*)(uintptr_t)objnum, value)) {
- if (value) {
- CPDF_Object* pExistingObj = static_cast<CPDF_Object*>(value);
- if (pObj->GetGenNum() <= pExistingObj->GetGenNum()) {
- pObj->Destroy();
- return FALSE;
- }
- pExistingObj->Destroy();
+ auto it = m_IndirectObjs.find(objnum);
+ if (it != m_IndirectObjs.end()) {
+ if (pObj->GetGenNum() <= it->second->GetGenNum()) {
+ pObj->Destroy();
+ return FALSE;
}
+ it->second->Destroy();
}
pObj->m_ObjNum = objnum;
- m_IndirectObjs.SetAt((void*)(uintptr_t)objnum, pObj);
- if (m_LastObjNum < objnum)
- m_LastObjNum = objnum;
+ m_IndirectObjs[objnum] = pObj;
+ m_LastObjNum = std::max(m_LastObjNum, objnum);
return TRUE;
}
-FX_DWORD CPDF_IndirectObjects::GetLastObjNum() const {
- return m_LastObjNum;
-}
« no previous file with comments | « core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp ('k') | core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698