| // Copyright 2017 The PDFium Authors | 
 | // 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 | 
 |  | 
 | #ifndef CORE_FXCRT_SMALL_BUFFER_H_ | 
 | #define CORE_FXCRT_SMALL_BUFFER_H_ | 
 |  | 
 | #include <string.h> | 
 |  | 
 | #include <array> | 
 | #include <memory> | 
 |  | 
 | #include "core/fxcrt/fx_memory_wrappers.h" | 
 |  | 
 | namespace fxcrt { | 
 |  | 
 | template <class T, size_t FixedSize> | 
 | class SmallBuffer { | 
 |  public: | 
 |   explicit SmallBuffer(size_t actual_size) : m_pSize(actual_size) { | 
 |     if (actual_size > FixedSize) { | 
 |       m_pDynamicData.reset(FX_Alloc(T, actual_size)); | 
 |       return; | 
 |     } | 
 |     if (actual_size) | 
 |       memset(m_FixedData.data(), 0, sizeof(T) * actual_size); | 
 |   } | 
 |   size_t size() const { return m_pSize; } | 
 |   T* data() { | 
 |     return m_pDynamicData ? m_pDynamicData.get() : m_FixedData.data(); | 
 |   } | 
 |   T* begin() { return data(); } | 
 |   T* end() { return begin() + size(); } | 
 |  | 
 |   // Callers shouldn't need to know these details. | 
 |   T* fixed_for_test() { return m_FixedData.data(); } | 
 |   T* dynamic_for_test() { return m_pDynamicData.get(); } | 
 |  | 
 |  private: | 
 |   const size_t m_pSize; | 
 |   std::unique_ptr<T, FxFreeDeleter> m_pDynamicData; | 
 |   std::array<T, FixedSize> m_FixedData; | 
 | }; | 
 |  | 
 | }  // namespace fxcrt | 
 |  | 
 | #endif  // CORE_FXCRT_SMALL_BUFFER_H_ |