50 lines
1.3 KiB
C++
50 lines
1.3 KiB
C++
// 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_
|