| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #ifndef CORE_INCLUDE_FXCRT_FX_BASIC_H_ | 7 #ifndef CORE_INCLUDE_FXCRT_FX_BASIC_H_ |
| 8 #define CORE_INCLUDE_FXCRT_FX_BASIC_H_ | 8 #define CORE_INCLUDE_FXCRT_FX_BASIC_H_ |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| 11 #include <memory> | |
| 12 | 11 |
| 13 #include "core/include/fxcrt/fx_memory.h" | 12 #include "core/include/fxcrt/fx_memory.h" |
| 14 #include "core/include/fxcrt/fx_stream.h" | 13 #include "core/include/fxcrt/fx_stream.h" |
| 15 #include "core/include/fxcrt/fx_string.h" | 14 #include "core/include/fxcrt/fx_string.h" |
| 16 #include "core/include/fxcrt/fx_system.h" | 15 #include "core/include/fxcrt/fx_system.h" |
| 17 | 16 |
| 18 // The FX_ArraySize(arr) macro returns the # of elements in an array arr. | 17 // The FX_ArraySize(arr) macro returns the # of elements in an array arr. |
| 19 // The expression is a compile-time constant, and therefore can be | 18 // The expression is a compile-time constant, and therefore can be |
| 20 // used in defining new arrays, for example. If you use FX_ArraySize on | 19 // used in defining new arrays, for example. If you use FX_ArraySize on |
| 21 // a pointer by mistake, you will get a compile-time error. | 20 // a pointer by mistake, you will get a compile-time error. |
| 22 // | 21 // |
| 23 // One caveat is that FX_ArraySize() doesn't accept any array of an | 22 // One caveat is that FX_ArraySize() doesn't accept any array of an |
| 24 // anonymous type or a type defined inside a function. | 23 // anonymous type or a type defined inside a function. |
| 25 #define FX_ArraySize(array) (sizeof(ArraySizeHelper(array))) | 24 #define FX_ArraySize(array) (sizeof(ArraySizeHelper(array))) |
| 26 | 25 |
| 27 // This template function declaration is used in defining FX_ArraySize. | 26 // This template function declaration is used in defining FX_ArraySize. |
| 28 // Note that the function doesn't need an implementation, as we only | 27 // Note that the function doesn't need an implementation, as we only |
| 29 // use its type. | 28 // use its type. |
| 30 template <typename T, size_t N> | 29 template <typename T, size_t N> |
| 31 char(&ArraySizeHelper(T(&array)[N]))[N]; | 30 char(&ArraySizeHelper(T(&array)[N]))[N]; |
| 32 | 31 |
| 33 // Used with std::unique_ptr to FX_Free raw memory. | |
| 34 struct FxFreeDeleter { | |
| 35 inline void operator()(void* ptr) const { FX_Free(ptr); } | |
| 36 }; | |
| 37 | |
| 38 // Used with std::unique_ptr to Release() objects that can't be deleted. | |
| 39 template <class T> | |
| 40 struct ReleaseDeleter { | |
| 41 inline void operator()(T* ptr) const { ptr->Release(); } | |
| 42 }; | |
| 43 | |
| 44 class CFX_BinaryBuf { | 32 class CFX_BinaryBuf { |
| 45 public: | 33 public: |
| 46 CFX_BinaryBuf(); | 34 CFX_BinaryBuf(); |
| 47 explicit CFX_BinaryBuf(FX_STRSIZE size); | 35 CFX_BinaryBuf(FX_STRSIZE size); |
| 48 | 36 |
| 49 uint8_t* GetBuffer() const { return m_pBuffer.get(); } | 37 ~CFX_BinaryBuf(); |
| 50 FX_STRSIZE GetSize() const { return m_DataSize; } | |
| 51 | 38 |
| 52 void Clear(); | 39 void Clear(); |
| 40 |
| 53 void EstimateSize(FX_STRSIZE size, FX_STRSIZE alloc_step = 0); | 41 void EstimateSize(FX_STRSIZE size, FX_STRSIZE alloc_step = 0); |
| 42 |
| 54 void AppendBlock(const void* pBuf, FX_STRSIZE size); | 43 void AppendBlock(const void* pBuf, FX_STRSIZE size); |
| 44 |
| 45 void AppendFill(uint8_t byte, FX_STRSIZE count); |
| 46 |
| 55 void AppendString(const CFX_ByteStringC& str) { | 47 void AppendString(const CFX_ByteStringC& str) { |
| 56 AppendBlock(str.GetPtr(), str.GetLength()); | 48 AppendBlock(str.GetPtr(), str.GetLength()); |
| 57 } | 49 } |
| 58 | 50 |
| 59 void AppendByte(uint8_t byte) { | 51 inline void AppendByte(uint8_t byte) { |
| 60 ExpandBuf(1); | 52 if (m_AllocSize <= m_DataSize) { |
| 61 m_pBuffer.get()[m_DataSize++] = byte; | 53 ExpandBuf(1); |
| 54 } |
| 55 m_pBuffer[m_DataSize++] = byte; |
| 62 } | 56 } |
| 63 | 57 |
| 64 void InsertBlock(FX_STRSIZE pos, const void* pBuf, FX_STRSIZE size); | 58 void InsertBlock(FX_STRSIZE pos, const void* pBuf, FX_STRSIZE size); |
| 59 |
| 60 void AttachData(void* pBuf, FX_STRSIZE size); |
| 61 |
| 62 void CopyData(const void* pBuf, FX_STRSIZE size); |
| 63 |
| 64 void TakeOver(CFX_BinaryBuf& other); |
| 65 |
| 65 void Delete(int start_index, int count); | 66 void Delete(int start_index, int count); |
| 66 | 67 |
| 67 // Takes ownership of |pBuf|. | 68 uint8_t* GetBuffer() const { return m_pBuffer; } |
| 68 void AttachData(uint8_t* pBuf, FX_STRSIZE size); | |
| 69 | 69 |
| 70 // Releases ownership of |m_pBuffer| and returns it. | 70 FX_STRSIZE GetSize() const { return m_DataSize; } |
| 71 uint8_t* DetachBuffer(); | 71 |
| 72 CFX_ByteStringC GetByteString() const; |
| 73 |
| 74 void DetachBuffer(); |
| 72 | 75 |
| 73 protected: | 76 protected: |
| 77 FX_STRSIZE m_AllocStep; |
| 78 |
| 79 uint8_t* m_pBuffer; |
| 80 |
| 81 FX_STRSIZE m_DataSize; |
| 82 |
| 83 FX_STRSIZE m_AllocSize; |
| 84 |
| 74 void ExpandBuf(FX_STRSIZE size); | 85 void ExpandBuf(FX_STRSIZE size); |
| 75 | |
| 76 FX_STRSIZE m_AllocStep; | |
| 77 FX_STRSIZE m_AllocSize; | |
| 78 FX_STRSIZE m_DataSize; | |
| 79 std::unique_ptr<uint8_t, FxFreeDeleter> m_pBuffer; | |
| 80 }; | 86 }; |
| 81 | |
| 82 class CFX_ByteTextBuf : public CFX_BinaryBuf { | 87 class CFX_ByteTextBuf : public CFX_BinaryBuf { |
| 83 public: | 88 public: |
| 89 void operator=(const CFX_ByteStringC& str); |
| 90 |
| 84 void AppendChar(int ch) { AppendByte((uint8_t)ch); } | 91 void AppendChar(int ch) { AppendByte((uint8_t)ch); } |
| 85 FX_STRSIZE GetLength() const { return m_DataSize; } | |
| 86 CFX_ByteStringC GetByteString() const; | |
| 87 | 92 |
| 88 CFX_ByteTextBuf& operator<<(int i); | 93 CFX_ByteTextBuf& operator<<(int i); |
| 94 |
| 89 CFX_ByteTextBuf& operator<<(FX_DWORD i); | 95 CFX_ByteTextBuf& operator<<(FX_DWORD i); |
| 96 |
| 90 CFX_ByteTextBuf& operator<<(double f); | 97 CFX_ByteTextBuf& operator<<(double f); |
| 98 |
| 91 CFX_ByteTextBuf& operator<<(const CFX_ByteStringC& lpsz); | 99 CFX_ByteTextBuf& operator<<(const CFX_ByteStringC& lpsz); |
| 100 |
| 92 CFX_ByteTextBuf& operator<<(const CFX_ByteTextBuf& buf); | 101 CFX_ByteTextBuf& operator<<(const CFX_ByteTextBuf& buf); |
| 102 |
| 103 FX_STRSIZE GetLength() const { return m_DataSize; } |
| 93 }; | 104 }; |
| 94 | |
| 95 class CFX_WideTextBuf : public CFX_BinaryBuf { | 105 class CFX_WideTextBuf : public CFX_BinaryBuf { |
| 96 public: | 106 public: |
| 107 void operator=(const FX_WCHAR* lpsz); |
| 108 |
| 109 void operator=(const CFX_WideStringC& str); |
| 110 |
| 97 void AppendChar(FX_WCHAR wch); | 111 void AppendChar(FX_WCHAR wch); |
| 112 |
| 113 CFX_WideTextBuf& operator<<(int i); |
| 114 |
| 115 CFX_WideTextBuf& operator<<(double f); |
| 116 |
| 117 CFX_WideTextBuf& operator<<(const FX_WCHAR* lpsz); |
| 118 |
| 119 CFX_WideTextBuf& operator<<(const CFX_WideStringC& str); |
| 120 CFX_WideTextBuf& operator<<(const CFX_WideString& str); |
| 121 |
| 122 CFX_WideTextBuf& operator<<(const CFX_WideTextBuf& buf); |
| 123 |
| 98 FX_STRSIZE GetLength() const { return m_DataSize / sizeof(FX_WCHAR); } | 124 FX_STRSIZE GetLength() const { return m_DataSize / sizeof(FX_WCHAR); } |
| 99 FX_WCHAR* GetBuffer() const { | 125 |
| 100 return reinterpret_cast<FX_WCHAR*>(m_pBuffer.get()); | 126 FX_WCHAR* GetBuffer() const { return (FX_WCHAR*)m_pBuffer; } |
| 101 } | |
| 102 CFX_WideStringC GetWideString() const; | |
| 103 | 127 |
| 104 void Delete(int start_index, int count) { | 128 void Delete(int start_index, int count) { |
| 105 CFX_BinaryBuf::Delete(start_index * sizeof(FX_WCHAR), | 129 CFX_BinaryBuf::Delete(start_index * sizeof(FX_WCHAR), |
| 106 count * sizeof(FX_WCHAR)); | 130 count * sizeof(FX_WCHAR)); |
| 107 } | 131 } |
| 108 | 132 |
| 109 CFX_WideTextBuf& operator<<(int i); | 133 CFX_WideStringC GetWideString() const; |
| 110 CFX_WideTextBuf& operator<<(double f); | |
| 111 CFX_WideTextBuf& operator<<(const FX_WCHAR* lpsz); | |
| 112 CFX_WideTextBuf& operator<<(const CFX_WideStringC& str); | |
| 113 CFX_WideTextBuf& operator<<(const CFX_WideString& str); | |
| 114 CFX_WideTextBuf& operator<<(const CFX_WideTextBuf& buf); | |
| 115 }; | 134 }; |
| 116 | |
| 117 #ifdef PDF_ENABLE_XFA | 135 #ifdef PDF_ENABLE_XFA |
| 118 class CFX_ArchiveSaver { | 136 class CFX_ArchiveSaver { |
| 119 public: | 137 public: |
| 120 CFX_ArchiveSaver() : m_pStream(NULL) {} | 138 CFX_ArchiveSaver() : m_pStream(NULL) {} |
| 121 | 139 |
| 122 CFX_ArchiveSaver& operator<<(uint8_t i); | 140 CFX_ArchiveSaver& operator<<(uint8_t i); |
| 123 | 141 |
| 124 CFX_ArchiveSaver& operator<<(int i); | 142 CFX_ArchiveSaver& operator<<(int i); |
| 125 | 143 |
| 126 CFX_ArchiveSaver& operator<<(FX_DWORD i); | 144 CFX_ArchiveSaver& operator<<(FX_DWORD i); |
| (...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1006 public: | 1024 public: |
| 1007 explicit CFX_AutoRestorer(T* location) | 1025 explicit CFX_AutoRestorer(T* location) |
| 1008 : m_Location(location), m_OldValue(*location) {} | 1026 : m_Location(location), m_OldValue(*location) {} |
| 1009 ~CFX_AutoRestorer() { *m_Location = m_OldValue; } | 1027 ~CFX_AutoRestorer() { *m_Location = m_OldValue; } |
| 1010 | 1028 |
| 1011 private: | 1029 private: |
| 1012 T* const m_Location; | 1030 T* const m_Location; |
| 1013 const T m_OldValue; | 1031 const T m_OldValue; |
| 1014 }; | 1032 }; |
| 1015 | 1033 |
| 1034 struct FxFreeDeleter { |
| 1035 inline void operator()(void* ptr) const { FX_Free(ptr); } |
| 1036 }; |
| 1037 |
| 1038 // Used with std::unique_ptr to Release() objects that can't be deleted. |
| 1039 template <class T> |
| 1040 struct ReleaseDeleter { |
| 1041 inline void operator()(T* ptr) const { ptr->Release(); } |
| 1042 }; |
| 1043 |
| 1016 #define FX_DATALIST_LENGTH 1024 | 1044 #define FX_DATALIST_LENGTH 1024 |
| 1017 template <size_t unit> | 1045 template <size_t unit> |
| 1018 class CFX_SortListArray { | 1046 class CFX_SortListArray { |
| 1019 protected: | 1047 protected: |
| 1020 struct DataList { | 1048 struct DataList { |
| 1021 int32_t start; | 1049 int32_t start; |
| 1022 | 1050 |
| 1023 int32_t count; | 1051 int32_t count; |
| 1024 uint8_t* data; | 1052 uint8_t* data; |
| 1025 }; | 1053 }; |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1191 FX_FLOAT c; | 1219 FX_FLOAT c; |
| 1192 FX_FLOAT d; | 1220 FX_FLOAT d; |
| 1193 FX_FLOAT e; | 1221 FX_FLOAT e; |
| 1194 FX_FLOAT f; | 1222 FX_FLOAT f; |
| 1195 FX_FLOAT g; | 1223 FX_FLOAT g; |
| 1196 FX_FLOAT h; | 1224 FX_FLOAT h; |
| 1197 FX_FLOAT i; | 1225 FX_FLOAT i; |
| 1198 }; | 1226 }; |
| 1199 | 1227 |
| 1200 #endif // CORE_INCLUDE_FXCRT_FX_BASIC_H_ | 1228 #endif // CORE_INCLUDE_FXCRT_FX_BASIC_H_ |
| OLD | NEW |