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