1d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Copyright 2017 PDFium Authors. All rights reserved.
2d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// found in the LICENSE file.
4d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
5d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#ifndef CORE_FXCRT_CFX_FIXEDBUFGROW_H_
8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#define CORE_FXCRT_CFX_FIXEDBUFGROW_H_
9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <memory>
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_memory.h"
13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanntemplate <class DataType, int FixedSize>
15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass CFX_FixedBufGrow {
16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann public:
17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  explicit CFX_FixedBufGrow(int data_size) {
18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (data_size > FixedSize) {
19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_pGrowData.reset(FX_Alloc(DataType, data_size));
20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return;
21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    memset(m_FixedData, 0, sizeof(DataType) * FixedSize);
23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  operator DataType*() { return m_pGrowData ? m_pGrowData.get() : m_FixedData; }
25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann private:
27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  DataType m_FixedData[FixedSize];
28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::unique_ptr<DataType, FxFreeDeleter> m_pGrowData;
29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann};
30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#endif  // CORE_FXCRT_CFX_FIXEDBUFGROW_H_
32