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