File indexing completed on 2024-05-12 15:58:51
0001 /* 0002 * SPDX-FileCopyrightText: 2017 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #ifndef KISOPTIMIZEDBYTEARRAY_H 0008 #define KISOPTIMIZEDBYTEARRAY_H 0009 0010 #include <utility> 0011 #include <QSharedDataPointer> 0012 #include <QSharedPointer> 0013 #include <QMutex> 0014 #include <QVector> 0015 0016 #include "kritaimage_export.h" 0017 0018 #include "KisRollingMeanAccumulatorWrapper.h" 0019 0020 0021 class KRITAIMAGE_EXPORT KisOptimizedByteArray 0022 { 0023 public: 0024 typedef std::pair<quint8*, int> MemoryChunk; 0025 0026 struct KRITAIMAGE_EXPORT MemoryAllocator { 0027 virtual ~MemoryAllocator() = default; 0028 virtual MemoryChunk alloc(int size) = 0; 0029 virtual void free(MemoryChunk chunk) = 0; 0030 }; 0031 0032 typedef QSharedPointer<MemoryAllocator> MemoryAllocatorSP; 0033 0034 struct KRITAIMAGE_EXPORT PooledMemoryAllocator : public MemoryAllocator { 0035 PooledMemoryAllocator(); 0036 ~PooledMemoryAllocator(); 0037 0038 MemoryChunk alloc(int size) override; 0039 void free(MemoryChunk chunk) override; 0040 0041 private: 0042 QMutex m_mutex; 0043 QVector<MemoryChunk> m_chunks; 0044 KisRollingMeanAccumulatorWrapper m_meanSize; 0045 }; 0046 0047 public: 0048 KisOptimizedByteArray(MemoryAllocatorSP allocator = MemoryAllocatorSP()); 0049 KisOptimizedByteArray(const KisOptimizedByteArray &rhs); 0050 KisOptimizedByteArray& operator=(const KisOptimizedByteArray &rhs); 0051 0052 ~KisOptimizedByteArray(); 0053 0054 quint8* data(); 0055 const quint8* constData() const; 0056 0057 void resize(int size); 0058 void fill(quint8 value, int size = -1); 0059 0060 int size() const; 0061 0062 bool isEmpty() const; 0063 0064 MemoryAllocatorSP customMemoryAllocator() const; 0065 0066 private: 0067 struct Private; 0068 QSharedDataPointer<Private> m_d; 0069 }; 0070 0071 #endif // KISOPTIMIZEDBYTEARRAY_H