fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstring>
  4.  
  5. typedef unsigned char BYTE;
  6. typedef BYTE UINT8;
  7. typedef unsigned short UINT16;
  8. typedef unsigned int UINT32;
  9.  
  10. template <typename T>
  11. class ImageData{
  12. public:
  13. ImageData(int);
  14. ~ImageData();
  15. void setDataType(int); //設定資料儲存bits數
  16. int getData(int); //讀取第n筆資料
  17.  
  18. private:
  19. BYTE* data; //原始圖資
  20. int bits;
  21. int size;
  22. };
  23.  
  24. template <typename T>
  25. ImageData<T>::ImageData(int size){
  26. if(size < sizeof(T))
  27. throw std::string("Size must more than sizeof(T)");
  28.  
  29. data = new (std::nothrow) BYTE[size];
  30. if(data == NULL)
  31. throw std::string("Memory allocation fail");
  32.  
  33. this->size = size;
  34. memset(data, 0, sizeof(BYTE) * this->size);
  35.  
  36. *((int*)data) = (int)sizeof(T); // 只是方便觀察(非必要)
  37. }
  38.  
  39. template <typename T>
  40. ImageData<T>::~ImageData(){
  41. if(data != NULL){
  42. delete [] data;
  43. }
  44. }
  45.  
  46. template <typename T>
  47. void ImageData<T>::setDataType(int inputBits){
  48. bits = inputBits;
  49. }
  50.  
  51. template <typename T>
  52. int ImageData<T>::getData(int pos){
  53. decltype(data) endPtr = data + pos + sizeof(T);
  54. decltype(data) bound = data + size;
  55.  
  56. // Boundary check
  57. if(endPtr > bound)
  58. throw std::string("Out of boundary");
  59.  
  60. return (int) *((T*)data + pos);
  61. }
  62.  
  63. int main(){
  64. try{
  65. // Case1:UINT8
  66. {
  67. ImageData<UINT8>* img = new ImageData<UINT8>(128);
  68. std::cout << img->getData(0) << std::endl;
  69. }
  70.  
  71. // Case1:UINT16
  72. {
  73. ImageData<UINT16>* img = new ImageData<UINT16>(128);
  74. std::cout << img->getData(0) << std::endl;
  75. }
  76.  
  77. // Case1:UINT32
  78. {
  79. ImageData<UINT32>* img = new ImageData<UINT32>(128);
  80. std::cout << img->getData(0) << std::endl;
  81. }
  82. }
  83. catch(std::string e){
  84. std::cout << "Exception: " << e << std::endl;
  85. }
  86. catch(std::exception e){
  87. std::cout << "Exception: " << e.what() << std::endl;
  88. }
  89. return 0;
  90. }
Success #stdin #stdout 0s 3232KB
stdin
Standard input is empty
stdout
1
2
4