00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef data_h
00026 #define data_h
00027
00028 #ifndef _REENTRANT
00029 #define _REENTRANT
00030 #endif
00031
00032 #include "config.h"
00033 #include "base.h"
00034 #include "util.h"
00035 #include <glib.h>
00036 #include <stdint.h>
00037 #include <stdexcept>
00038
00039 using std::exception;
00040 using std::bad_alloc;
00041
00042 namespace karoo {
00043
00050 class rock_exception_io : public exception
00051 {
00052 protected:
00053 mutable char buf[100];
00054 public:
00056 size_t pos;
00058 size_t size;
00060 size_t alloc_size;
00061
00068 rock_exception_io(size_t pos, size_t size, size_t alloc_size) throw()
00069 { this->pos = pos; this->size = size; this->alloc_size = alloc_size; }
00070 virtual ~rock_exception_io() throw() {}
00071
00076 virtual const char* what() const throw()
00077 {
00078 sprintf(buf, "access %u bytes at offset %u, in block of %u bytes", size, pos, alloc_size);
00079 return buf;
00080 }
00081 };
00082
00084 class rock_exception_read : public rock_exception_io
00085 {
00086 public:
00093 rock_exception_read(size_t pos, size_t size, size_t alloc_size) : rock_exception_io(pos, size, alloc_size) {}
00094 virtual ~rock_exception_read() throw () {}
00095
00100 virtual const char* what() const throw()
00101 {
00102 sprintf(buf, "read access %u bytes at offset %u, in block of %u bytes", size, pos, alloc_size);
00103 return buf;
00104 }
00105 };
00106
00115 class rock_data
00116 {
00117 private:
00118 public:
00123 rock_data() {}
00124 virtual ~rock_data() {}
00125
00132 virtual void accomodate(size_t bytes) = 0;
00133
00140 virtual void write(const void* data, size_t size) = 0;
00147 virtual void read(void* data, size_t size) = 0;
00148
00156 void writeNumber(const void* data, size_t size);
00164 void readNumber(void* data, size_t size);
00165
00171 void writeU8(const uint8_t& data) { return writeNumber(&data, sizeof(uint8_t)); }
00177 void writeU16(const uint16_t& data) { return writeNumber(&data, sizeof(uint16_t)); }
00183 void writeU32(const uint32_t& data) { return writeNumber(&data, sizeof(uint32_t)); }
00189 void writeU64(const uint64_t& data) { return writeNumber(&data, sizeof(uint64_t)); }
00195 void writeI8(const int8_t& data) { return writeNumber(&data, sizeof(int8_t)); }
00201 void writeI16(const int16_t& data) { return writeNumber(&data, sizeof(int16_t)); }
00207 void writeI32(const int32_t& data) { return writeNumber(&data, sizeof(int32_t)); }
00213 void writeI64(const int64_t& data) { return writeNumber(&data, sizeof(int64_t)); }
00214
00220 void writeF(const float& data) { return writeNumber(&data, sizeof(float)); }
00226 void writeD(const double& data) { return writeNumber(&data, sizeof(double)); }
00234 void writeLD(const long double& data);
00235
00241 void readU8(uint8_t& data) { return readNumber(&data, sizeof(uint8_t)); }
00247 void readU16(uint16_t& data) { return readNumber(&data, sizeof(uint16_t)); }
00253 void readU32(uint32_t& data) { return readNumber(&data, sizeof(uint32_t)); }
00259 void readU64(uint64_t& data) { return readNumber(&data, sizeof(uint64_t)); }
00265 void readI8(int8_t& data) { return readNumber(&data, sizeof(int8_t)); }
00271 void readI16(int16_t& data) { return readNumber(&data, sizeof(int16_t)); }
00277 void readI32(int32_t& data) { return readNumber(&data, sizeof(int32_t)); }
00283 void readI64(int64_t& data) { return readNumber(&data, sizeof(int64_t)); }
00284
00290 void readF(float& data) { return readNumber(&data, sizeof(float)); }
00296 void readD(double& data) { return readNumber(&data, sizeof(double)); }
00302 void readLD(long double& data);
00303
00309 void writeS(const text& str);
00315 void readS(text& str);
00316 };
00317 }
00318 #endif