// // Created by jedi on 11/2/18. // #include #include namespace micromenu { enum bufferBlocks { _1bit = 1, _2bit = 2, _4bit = 4, _8bit = 8, _16bit = 16, _24bit = 24, _32bit = 32 }; template class Buffer { private: int *ptr_; int size_; constexpr static const int block_ = 8 * sizeof(int); public: Buffer(int size) : size_(size) { ptr_ = (int *) malloc(size * N / 8); } int get(int i) { if(i >= size_) return 0; return ptr_[i * N / block_] & ((1 << N) - 1) << (i * N % block_); } int getBlock(int i) { if(i >= size_) return 0; return ptr_[i * N / block_]; } void set(int i, int v) { if(i < size_) { ptr_[i * N / block_] &= ~(((1 << N) - 1) << (i * N % block_)); ptr_[i * N / block_] |= (((1 << N) - 1) & v) << (i * N % block_); } } ~Buffer() { free(ptr_); } }; template<> int Buffer<_32bit>::get(int i); template<> void Buffer<_32bit>::set(int i, int v); }