18 #ifndef __PACKEDVECTOR_H
19 #define __PACKEDVECTOR_H
37 uint32_t accessorFunc(std::vector<uint8_t> &base, uint32_t index),
38 void setterFunc(std::vector<uint8_t> &base, uint32_t index, uint32_t value),
39 size_t elementCount2BytesFunc(uint32_t elementCount)
44 std::vector<uint8_t> m_data;
45 size_t m_elementCount;
46 double m_growthRateMultiplier;
47 double m_growthRateAdder;
51 m_growthRateMultiplier(1.20),
52 m_growthRateAdder(128) {;}
55 inline uint32_t operator[](uint32_t i)
57 return accessorFunc(m_data, i);
59 inline void set(uint32_t i, uint32_t v)
61 setterFunc(m_data, i, v);
64 size_t getElementCount()
const
66 return m_elementCount;
69 double getUtilization() {
70 return elementCount2BytesFunc(m_elementCount) / (double) m_data.capacity();
73 void reserve(uint32_t reserveElements) {
74 m_data.reserve(elementCount2BytesFunc(reserveElements));
77 size_t size() {
return m_elementCount;}
79 void resize(uint32_t newSize) {
80 m_elementCount = newSize;
81 m_data.resize(elementCount2BytesFunc(m_elementCount));
85 void push_back(uint32_t value) {
87 if(elementCount2BytesFunc(m_elementCount) >= m_data.size()) {
89 if( (elementCount2BytesFunc(m_elementCount)) > m_data.capacity())
91 size_t newCapacity = (size_t) (m_data.capacity() * m_growthRateMultiplier);
95 if(newCapacity == m_data.capacity()) {
96 newCapacity = (size_t) (m_data.capacity() + m_growthRateAdder);
99 m_data.reserve(newCapacity);
103 m_data.resize(elementCount2BytesFunc(m_elementCount));
104 set(m_elementCount-1, value);
111 Packed1BitElementCount2Bytes
117 Packed2BitElementCount2Bytes
123 Packed4BitElementCount2Bytes