Fix infinite recursion in CPDF_Parser::ParseIndirectObjectAt().
[pdfium.git] / core / include / fxcrt / fx_basic.h
index c400a94..7ad44c6 100644 (file)
 #ifndef _FX_STREAM_H_
 #include "fx_stream.h"
 #endif
+
+// The FX_ArraySize(arr) macro returns the # of elements in an array arr.
+// The expression is a compile-time constant, and therefore can be
+// used in defining new arrays, for example.  If you use FX_ArraySize on
+// a pointer by mistake, you will get a compile-time error.
+//
+// One caveat is that FX_ArraySize() doesn't accept any array of an
+// anonymous type or a type defined inside a function.
+#define FX_ArraySize(array) (sizeof(ArraySizeHelper(array)))
+
+// This template function declaration is used in defining FX_ArraySize.
+// Note that the function doesn't need an implementation, as we only
+// use its type.
+template <typename T, size_t N>
+char (&ArraySizeHelper(T (&array)[N]))[N];
+
 class CFX_BinaryBuf : public CFX_Object
 {
 public:
@@ -224,7 +240,7 @@ class IFX_BufferArchive
 {
 public:
     IFX_BufferArchive(FX_STRSIZE size);
-
+    virtual ~IFX_BufferArchive() { }
 
     virtual void                       Clear();
 
@@ -255,7 +271,7 @@ class CFX_FileBufferArchive : public IFX_BufferArchive, public CFX_Object
 {
 public:
     CFX_FileBufferArchive(FX_STRSIZE size = 32768);
-    ~CFX_FileBufferArchive();
+    ~CFX_FileBufferArchive() override;
     virtual void                       Clear();
 
     FX_BOOL                                    AttachFile(IFX_StreamWrite *pFile, FX_BOOL bTakeover = FALSE);
@@ -350,7 +366,7 @@ protected:
 
     ~CFX_BasicArray();
 
-    FX_BOOL                    SetSize(int nNewSize, int nGrowBy);
+    FX_BOOL                    SetSize(int nNewSize);
 
     FX_BOOL                    Append(const CFX_BasicArray& src);
 
@@ -371,8 +387,6 @@ protected:
 
     int                                m_nMaxSize;
 
-    int                                m_nGrowBy;
-
     int                                m_nUnitSize;
 };
 template<class TYPE>
@@ -391,14 +405,14 @@ public:
         return m_nSize - 1;
     }
 
-    FX_BOOL            SetSize(int nNewSize, int nGrowBy = -1)
+    FX_BOOL            SetSize(int nNewSize)
     {
-        return CFX_BasicArray::SetSize(nNewSize, nGrowBy);
+        return CFX_BasicArray::SetSize(nNewSize);
     }
 
     void               RemoveAll()
     {
-        SetSize(0, -1);
+        SetSize(0);
     }
 
     const TYPE GetAt(int nIndex) const
@@ -442,7 +456,7 @@ public:
             return FALSE;
         }
         if (nIndex >= m_nSize)
-            if (!SetSize(nIndex + 1, -1)) {
+            if (!SetSize(nIndex + 1)) {
                 return FALSE;
             }
         ((TYPE*)m_pData)[nIndex] = newElement;
@@ -453,7 +467,7 @@ public:
     {
         if (m_nSize < m_nMaxSize) {
             m_nSize ++;
-        } else if (!SetSize(m_nSize + 1, -1)) {
+        } else if (!SetSize(m_nSize + 1)) {
             return FALSE;
         }
         ((TYPE*)m_pData)[m_nSize - 1] = newElement;
@@ -616,7 +630,7 @@ public:
             return 0;
         }
         RemoveAll();
-        SetSize(nCount, -1);
+        SetSize(nCount);
         ObjectClass* pStartObj = (ObjectClass*)m_pData;
         nSize = nStart + nCount;
         for (FX_INT32 i = nStart; i < nSize; i ++, pStartObj++) {
@@ -653,7 +667,7 @@ public:
         for (int i = 0; i < m_nSize; i ++) {
             ((ObjectClass*)GetDataPtr(i))->~ObjectClass();
         }
-        CFX_BasicArray::SetSize(0, -1);
+        CFX_BasicArray::SetSize(0);
     }
 };
 typedef CFX_ObjectArray<CFX_ByteString> CFX_ByteStringArray;
@@ -1363,7 +1377,7 @@ protected:
 class IFX_Pause
 {
 public:
-
+    virtual ~IFX_Pause() { }
     virtual FX_BOOL    NeedToPauseNow() = 0;
 };
 class CFX_DataFilter : public CFX_Object
@@ -1400,6 +1414,21 @@ protected:
 
     CFX_DataFilter*    m_pDestFilter;
 };
+
+template<typename T>
+class CFX_AutoRestorer {
+public:
+    explicit CFX_AutoRestorer(T* location) {
+      m_Location = location;
+      m_OldValue = *location;
+    }
+    ~CFX_AutoRestorer() { *m_Location = m_OldValue; }
+
+private:
+  T* m_Location;
+  T m_OldValue;
+};
+
 template <class T>
 class CFX_SmartPointer
 {
@@ -1580,4 +1609,50 @@ typedef enum {
 } FX_ProgressiveStatus;
 #define ProgressiveStatus      FX_ProgressiveStatus
 #define FX_NAMESPACE_DECLARE(namespace, type)       namespace::type
+
+class CFX_Vector_3by1 : public CFX_Object
+{
+public:
+
+    CFX_Vector_3by1() :
+        a(0.0f), b(0.0f), c(0.0f)
+    {}
+
+    CFX_Vector_3by1(FX_FLOAT a1, FX_FLOAT b1, FX_FLOAT c1):
+        a(a1), b(b1), c(c1)
+    {}
+
+    FX_FLOAT a;
+    FX_FLOAT b;
+    FX_FLOAT c;
+};
+class CFX_Matrix_3by3 : public CFX_Object
+{
+public:
+
+    CFX_Matrix_3by3():
+        a(0.0f), b(0.0f), c(0.0f), d(0.0f), e(0.0f), f(0.0f), g(0.0f), h(0.0f), i(0.0f)
+    {}
+
+    CFX_Matrix_3by3(FX_FLOAT a1, FX_FLOAT b1, FX_FLOAT c1, FX_FLOAT d1, FX_FLOAT e1, FX_FLOAT f1, FX_FLOAT g1, FX_FLOAT h1, FX_FLOAT i1) :
+        a(a1), b(b1), c(c1), d(d1), e(e1), f(f1), g(g1), h(h1), i(i1)
+    {}
+
+    CFX_Matrix_3by3 Inverse();
+
+    CFX_Matrix_3by3 Multiply(const CFX_Matrix_3by3 &m);
+
+    CFX_Vector_3by1 TransformVector(const CFX_Vector_3by1 &v);
+
+    FX_FLOAT a;
+    FX_FLOAT b;
+    FX_FLOAT c;
+    FX_FLOAT d;
+    FX_FLOAT e;
+    FX_FLOAT f;
+    FX_FLOAT g;
+    FX_FLOAT h;
+    FX_FLOAT i;
+};
+
 #endif