// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../../include/fxcrt/fx_basic.h"
#include "third_party/base/numerics/safe_math.h"

CFX_BasicArray::CFX_BasicArray(int unit_size)
    : m_pData(NULL), m_nSize(0), m_nMaxSize(0) {
  if (unit_size < 0 || unit_size > (1 << 28)) {
    m_nUnitSize = 4;
  } else {
    m_nUnitSize = unit_size;
  }
}
CFX_BasicArray::~CFX_BasicArray() {
  FX_Free(m_pData);
}
FX_BOOL CFX_BasicArray::SetSize(int nNewSize) {
  if (nNewSize <= 0) {
    FX_Free(m_pData);
    m_pData = NULL;
    m_nSize = m_nMaxSize = 0;
    return 0 == nNewSize;
  }

  if (m_pData == NULL) {
    pdfium::base::CheckedNumeric<int> totalSize = nNewSize;
    totalSize *= m_nUnitSize;
    if (!totalSize.IsValid()) {
      m_nSize = m_nMaxSize = 0;
      return FALSE;
    }
    m_pData = FX_Alloc(uint8_t, totalSize.ValueOrDie());
    m_nSize = m_nMaxSize = nNewSize;
  } else if (nNewSize <= m_nMaxSize) {
    if (nNewSize > m_nSize) {
      FXSYS_memset(m_pData + m_nSize * m_nUnitSize, 0,
                   (nNewSize - m_nSize) * m_nUnitSize);
    }
    m_nSize = nNewSize;
  } else {
    int nNewMax = nNewSize < m_nMaxSize ? m_nMaxSize : nNewSize;
    pdfium::base::CheckedNumeric<int> totalSize = nNewMax;
    totalSize *= m_nUnitSize;
    if (!totalSize.IsValid() || nNewMax < m_nSize) {
      return FALSE;
    }
    uint8_t* pNewData = FX_Realloc(uint8_t, m_pData, totalSize.ValueOrDie());
    if (pNewData == NULL) {
      return FALSE;
    }
    FXSYS_memset(pNewData + m_nSize * m_nUnitSize, 0,
                 (nNewMax - m_nSize) * m_nUnitSize);
    m_pData = pNewData;
    m_nSize = nNewSize;
    m_nMaxSize = nNewMax;
  }
  return TRUE;
}
FX_BOOL CFX_BasicArray::Append(const CFX_BasicArray& src) {
  int nOldSize = m_nSize;
  pdfium::base::CheckedNumeric<int> newSize = m_nSize;
  newSize += src.m_nSize;
  if (m_nUnitSize != src.m_nUnitSize || !newSize.IsValid() ||
      !SetSize(newSize.ValueOrDie())) {
    return FALSE;
  }

  FXSYS_memcpy(m_pData + nOldSize * m_nUnitSize, src.m_pData,
               src.m_nSize * m_nUnitSize);
  return TRUE;
}
FX_BOOL CFX_BasicArray::Copy(const CFX_BasicArray& src) {
  if (!SetSize(src.m_nSize)) {
    return FALSE;
  }
  FXSYS_memcpy(m_pData, src.m_pData, src.m_nSize * m_nUnitSize);
  return TRUE;
}
uint8_t* CFX_BasicArray::InsertSpaceAt(int nIndex, int nCount) {
  if (nIndex < 0 || nCount <= 0) {
    return NULL;
  }
  if (nIndex >= m_nSize) {
    if (!SetSize(nIndex + nCount)) {
      return NULL;
    }
  } else {
    int nOldSize = m_nSize;
    if (!SetSize(m_nSize + nCount)) {
      return NULL;
    }
    FXSYS_memmove(m_pData + (nIndex + nCount) * m_nUnitSize,
                  m_pData + nIndex * m_nUnitSize,
                  (nOldSize - nIndex) * m_nUnitSize);
    FXSYS_memset(m_pData + nIndex * m_nUnitSize, 0, nCount * m_nUnitSize);
  }
  return m_pData + nIndex * m_nUnitSize;
}
FX_BOOL CFX_BasicArray::RemoveAt(int nIndex, int nCount) {
  if (nIndex < 0 || nCount <= 0 || m_nSize < nIndex + nCount) {
    return FALSE;
  }
  int nMoveCount = m_nSize - (nIndex + nCount);
  if (nMoveCount) {
    FXSYS_memmove(m_pData + nIndex * m_nUnitSize,
                  m_pData + (nIndex + nCount) * m_nUnitSize,
                  nMoveCount * m_nUnitSize);
  }
  m_nSize -= nCount;
  return TRUE;
}
FX_BOOL CFX_BasicArray::InsertAt(int nStartIndex,
                                 const CFX_BasicArray* pNewArray) {
  if (pNewArray == NULL) {
    return FALSE;
  }
  if (pNewArray->m_nSize == 0) {
    return TRUE;
  }
  if (!InsertSpaceAt(nStartIndex, pNewArray->m_nSize)) {
    return FALSE;
  }
  FXSYS_memcpy(m_pData + nStartIndex * m_nUnitSize, pNewArray->m_pData,
               pNewArray->m_nSize * m_nUnitSize);
  return TRUE;
}
const void* CFX_BasicArray::GetDataPtr(int index) const {
  if (index < 0 || index >= m_nSize || m_pData == NULL) {
    return NULL;
  }
  return m_pData + index * m_nUnitSize;
}
CFX_BaseSegmentedArray::CFX_BaseSegmentedArray(int unit_size,
                                               int segment_units,
                                               int index_size)
    : m_UnitSize(unit_size),
      m_SegmentSize(segment_units),
      m_IndexSize(index_size),
      m_IndexDepth(0),
      m_DataSize(0),
      m_pIndex(NULL) {}
void CFX_BaseSegmentedArray::SetUnitSize(int unit_size,
                                         int segment_units,
                                         int index_size) {
  ASSERT(m_DataSize == 0);
  m_UnitSize = unit_size;
  m_SegmentSize = segment_units;
  m_IndexSize = index_size;
}
CFX_BaseSegmentedArray::~CFX_BaseSegmentedArray() {
  RemoveAll();
}
static void _ClearIndex(int level, int size, void** pIndex) {
  if (level == 0) {
    FX_Free(pIndex);
    return;
  }
  for (int i = 0; i < size; i++) {
    if (pIndex[i] == NULL) {
      continue;
    }
    _ClearIndex(level - 1, size, (void**)pIndex[i]);
  }
  FX_Free(pIndex);
}
void CFX_BaseSegmentedArray::RemoveAll() {
  if (m_pIndex == NULL) {
    return;
  }
  _ClearIndex(m_IndexDepth, m_IndexSize, (void**)m_pIndex);
  m_pIndex = NULL;
  m_IndexDepth = 0;
  m_DataSize = 0;
}
void* CFX_BaseSegmentedArray::Add() {
  if (m_DataSize % m_SegmentSize) {
    return GetAt(m_DataSize++);
  }
  void* pSegment = FX_Alloc2D(uint8_t, m_UnitSize, m_SegmentSize);
  if (m_pIndex == NULL) {
    m_pIndex = pSegment;
    m_DataSize++;
    return pSegment;
  }
  if (m_IndexDepth == 0) {
    void** pIndex = FX_Alloc(void*, m_IndexSize);
    pIndex[0] = m_pIndex;
    pIndex[1] = pSegment;
    m_pIndex = pIndex;
    m_DataSize++;
    m_IndexDepth++;
    return pSegment;
  }
  int seg_index = m_DataSize / m_SegmentSize;
  if (seg_index % m_IndexSize) {
    void** pIndex = GetIndex(seg_index);
    pIndex[seg_index % m_IndexSize] = pSegment;
    m_DataSize++;
    return pSegment;
  }
  int tree_size = 1;
  int i;
  for (i = 0; i < m_IndexDepth; i++) {
    tree_size *= m_IndexSize;
  }
  if (m_DataSize == tree_size * m_SegmentSize) {
    void** pIndex = FX_Alloc(void*, m_IndexSize);
    pIndex[0] = m_pIndex;
    m_pIndex = pIndex;
    m_IndexDepth++;
  } else {
    tree_size /= m_IndexSize;
  }
  void** pSpot = (void**)m_pIndex;
  for (i = 1; i < m_IndexDepth; i++) {
    if (pSpot[seg_index / tree_size] == NULL) {
      pSpot[seg_index / tree_size] = FX_Alloc(void*, m_IndexSize);
    }
    pSpot = (void**)pSpot[seg_index / tree_size];
    seg_index = seg_index % tree_size;
    tree_size /= m_IndexSize;
  }
  if (i < m_IndexDepth) {
    FX_Free(pSegment);
    RemoveAll();
    return NULL;
  }
  pSpot[seg_index % m_IndexSize] = pSegment;
  m_DataSize++;
  return pSegment;
}
void** CFX_BaseSegmentedArray::GetIndex(int seg_index) const {
  ASSERT(m_IndexDepth != 0);
  if (m_IndexDepth == 1) {
    return (void**)m_pIndex;
  }
  if (m_IndexDepth == 2) {
    return (void**)((void**)m_pIndex)[seg_index / m_IndexSize];
  }
  int tree_size = 1;
  int i;
  for (i = 1; i < m_IndexDepth; i++) {
    tree_size *= m_IndexSize;
  }
  void** pSpot = (void**)m_pIndex;
  for (i = 1; i < m_IndexDepth; i++) {
    pSpot = (void**)pSpot[seg_index / tree_size];
    seg_index = seg_index % tree_size;
    tree_size /= m_IndexSize;
  }
  return pSpot;
}
void* CFX_BaseSegmentedArray::IterateSegment(const uint8_t* pSegment,
                                             int count,
                                             FX_BOOL (*callback)(void* param,
                                                                 void* pData),
                                             void* param) const {
  for (int i = 0; i < count; i++) {
    if (!callback(param, (void*)(pSegment + i * m_UnitSize))) {
      return (void*)(pSegment + i * m_UnitSize);
    }
  }
  return NULL;
}
void* CFX_BaseSegmentedArray::IterateIndex(int level,
                                           int& start,
                                           void** pIndex,
                                           FX_BOOL (*callback)(void* param,
                                                               void* pData),
                                           void* param) const {
  if (level == 0) {
    int count = m_DataSize - start;
    if (count > m_SegmentSize) {
      count = m_SegmentSize;
    }
    start += count;
    return IterateSegment((const uint8_t*)pIndex, count, callback, param);
  }
  for (int i = 0; i < m_IndexSize; i++) {
    if (pIndex[i] == NULL) {
      continue;
    }
    void* p =
        IterateIndex(level - 1, start, (void**)pIndex[i], callback, param);
    if (p) {
      return p;
    }
  }
  return NULL;
}
void* CFX_BaseSegmentedArray::Iterate(FX_BOOL (*callback)(void* param,
                                                          void* pData),
                                      void* param) const {
  if (m_pIndex == NULL) {
    return NULL;
  }
  int start = 0;
  return IterateIndex(m_IndexDepth, start, (void**)m_pIndex, callback, param);
}
void* CFX_BaseSegmentedArray::GetAt(int index) const {
  if (index < 0 || index >= m_DataSize) {
    return NULL;
  }
  if (m_IndexDepth == 0) {
    return (uint8_t*)m_pIndex + m_UnitSize * index;
  }
  int seg_index = index / m_SegmentSize;
  return (uint8_t*)GetIndex(seg_index)[seg_index % m_IndexSize] +
         (index % m_SegmentSize) * m_UnitSize;
}
void CFX_BaseSegmentedArray::Delete(int index, int count) {
  if (index < 0 || count < 1 || index + count > m_DataSize) {
    return;
  }
  int i;
  for (i = index; i < m_DataSize - count; i++) {
    uint8_t* pSrc = (uint8_t*)GetAt(i + count);
    uint8_t* pDest = (uint8_t*)GetAt(i);
    for (int j = 0; j < m_UnitSize; j++) {
      pDest[j] = pSrc[j];
    }
  }
  int new_segs = (m_DataSize - count + m_SegmentSize - 1) / m_SegmentSize;
  int old_segs = (m_DataSize + m_SegmentSize - 1) / m_SegmentSize;
  if (new_segs < old_segs) {
    if (m_IndexDepth) {
      for (i = new_segs; i < old_segs; i++) {
        void** pIndex = GetIndex(i);
        FX_Free(pIndex[i % m_IndexSize]);
        pIndex[i % m_IndexSize] = NULL;
      }
    } else {
      FX_Free(m_pIndex);
      m_pIndex = NULL;
    }
  }
  m_DataSize -= count;
}
