#include <iostream>
#include <vector>
#include <cstring>
typedef char BYTE;
typedef BYTE INT8;
typedef short INT16;
typedef int INT32;
template <typename T>
class ImageData{
public:
ImageData(int);
~ImageData();
void setDataType(int); //設定資料儲存bits數
int getData(int); //讀取第n筆資料
private:
BYTE* data; //原始圖資
int bits;
int size;
};
template <typename T>
ImageData<T>::ImageData(int size){
if(size < sizeof(T))
throw std::string("Size must more than sizeof(T)");
data = new (std::nothrow) BYTE[size];
if(data == NULL)
throw std::string("Memory allocation fail");
this->size = size;
memset(data, 0, sizeof(BYTE) * this->size);
*((int*)data) = (int)sizeof(T); // 只是方便觀察(非必要)
}
template <typename T>
ImageData<T>::~ImageData(){
if(data != NULL){
delete [] data;
}
}
template <typename T>
void ImageData<T>::setDataType(int inputBits){
bits = inputBits;
}
template <typename T>
int ImageData<T>::getData(int pos){
decltype(data) endPtr = data + pos + sizeof(T);
decltype(data) bound = data + size;
// Boundary check
if(endPtr > bound)
throw std::string("Out of boundary");
return (int) *((T*)data + pos);
}
int main(){
try{
// Case1:INT8
{
ImageData<INT8>* img = new ImageData<INT8>(128);
std::cout << img->getData(0) << std::endl;
}
// Case1:INT16
{
ImageData<INT16>* img = new ImageData<INT16>(128);
std::cout << img->getData(0) << std::endl;
}
// Case1:INT32
{
ImageData<INT32>* img = new ImageData<INT32>(128);
std::cout << img->getData(0) << std::endl;
}
}
catch(std::string e){
std::cout << "Exception: " << e << std::endl;
}
catch(std::exception e){
std::cout << "Exception: " << e.what() << std::endl;
}
return 0;
}