00001
00002
00003
00004
00005
00012 #ifndef HMEM_H
00013 #define HMEM_H
00014
00047 class HMemory : public HObjNoCopy
00048 {
00049 typedef HObjNoCopy base_class;
00050 static StringPtr ClassName(void) { return "HMemory"; }
00051
00052
00053
00054 protected:
00055 uint32 m_uBytes;
00056 PtrData m_pData;
00057
00058
00059
00060 public:
00061 HMemory(uint32 uSize = 0) throw() : m_uBytes(0), m_pData(NULL)
00062 {
00063 if (uSize > 0 && create(uSize) != NO_ERROR)
00064 throw HError::GetLastError();
00065 }
00066
00067 HMemory(PtrConst pData, uint32 uSize) throw() : m_uBytes(0), m_pData(NULL)
00068 {
00069 if (GOOD_PTR(pData) && uSize > 0 && create(uSize, pData) != NO_ERROR)
00070 throw HError::GetLastError();
00071 }
00072
00073 virtual
00074 ~HMemory(void)
00075 { (void) Destroy(); }
00076
00077
00078
00079 public:
00085 ErrCode
00086 Destroy(void)
00087 {
00088 ErrCode ec = HError::NoError();
00089
00090 if (GOOD_PTR(m_pData))
00091 {
00092 #if __DEBUG__
00093 m_pData -= sizeof(uint32) + sizeof(uint16);
00094
00095 ASSERT(*MAKE_PTR(uint16 *, m_pData, 0x0004) == 0xDEAD);
00096 ASSERT(*MAKE_PTR(uint32 *, m_pData, 0x0000) == m_uBytes);
00097 ASSERT(*MAKE_PTR(uint16 *, m_pData, 0x0006 + m_uBytes) == 0xDEAD);
00098
00099 DEBUG_LOG("HMemory: %8lu -\n", m_uBytes);
00100 #endif
00101 delete [] m_pData;
00102 m_pData = NULL;
00103 }
00104
00105 m_uBytes = 0;
00106
00107 return ec;
00108 }
00113 ErrCode
00114 Zero(void)
00115 {
00116 ErrCode ec = HError::NoError();
00117
00118 if (IsValid())
00119 MEM_ZERO(m_pData, m_uBytes);
00120 else
00121 ec = HError::Set(ERR_NOT_INITIALIZED, __FILE__, __LINE__);
00122
00123 return ec;
00124 }
00125 protected:
00139 ErrCode
00140 create(uint32 uBytes, PtrConst pData = NULL)
00141 {
00142 ErrCode ec = HError::NoError();
00143
00144 ASSERT( NULL_PTR(m_pData) );
00145
00146 try
00147 {
00148 if (uBytes > 0)
00149 {
00150 #if __DEBUG__
00151 m_pData = new uint8[uBytes + 8];
00152 ASSERT_PTR(m_pData);
00153
00154 *MAKE_PTR(uint32 *, m_pData, 0x0000) = uBytes;
00155 *MAKE_PTR(uint16 *, m_pData, 0x0004) = 0xDEAD;
00156 *MAKE_PTR(uint16 *, m_pData, 0x0006 + uBytes) = 0xDEAD;
00157 m_pData += sizeof(uint32) + sizeof(uint16);
00158
00159 DEBUG_LOG("HMemory: %8lu +\n", uBytes);
00160 #else
00161 m_pData = new uint8[uBytes];
00162 #endif
00163 m_uBytes = uBytes;
00164 if (validPtr(pData))
00165 (void) MEM_COPY(m_pData, pData, m_uBytes);
00166 else
00167 (void) MEM_ZERO(m_pData, m_uBytes);
00168 }
00169 else
00170 ec = HError::Set(ERR_BAD_PARAMETER, __FILE__, __LINE__);
00171 }
00172 catch (const std::exception & e)
00173 {
00174 DEBUG_LOG("HMemory::Create() => caught %s\n", e.what());
00175 if ((ec = ErrCode( HError::GetLastError() )) == NO_ERROR)
00176 ec = HError::Set(ERR_BUY_MORE_RAM, __FILE__, __LINE__);
00177
00178 m_uBytes = 0;
00179 m_pData = NULL;
00180 }
00181
00182 return ec;
00183 }
00184
00185
00186
00187 public:
00193 uint8 GetAt(uint32 udx) const
00194 { return validIndex(udx) ? m_pData[udx] : '\0'; }
00200 Ptr GetPtr(uint32 udx = 0) const
00201 { return validIndex(udx) ? &m_pData[udx] : NULL; }
00206 uint32 GetSize(void) const
00207 { return m_uBytes; }
00218 ErrCode Set(PtrConst pData, uint32 uBytes)
00219 {
00220 ErrCode ec = HError::NoError();
00221
00222 if (validPtr(pData) && uBytes > 0)
00223 {
00224 if ((ec = Destroy()) == NO_ERROR)
00225 ec = create(uBytes, pData);
00226 }
00227 else
00228 ec = HError::Set(ERR_BAD_PARAMETER, __FILE__, __LINE__);
00229
00230 return ec;
00231 }
00239 ErrCode SetAt(uint32 udx, uint8 xVal)
00240 {
00241 ErrCode ec = HError::NoError();
00242
00243 if (validIndex(udx))
00244 m_pData[udx] = xVal;
00245 else
00246 ec = HError::Set(ERR_OUT_OF_RANGE, __FILE__, __LINE__);
00247
00248 return ec;
00249 }
00258 ErrCode SetAt(uint32 udx, PtrConst pData, uint32 uBytes)
00259 {
00260 ErrCode ec = HError::NoError();
00261
00262 if (GOOD_PTR(pData) && uBytes > 0)
00263 {
00264 if (validIndex(udx))
00265 {
00266 uint32 uCount = m_uBytes - udx;
00267
00268 if (uCount > uBytes)
00269 {
00270 uCount = uBytes;
00271 ec = HError::Set(ERR_BUFFER_OVERFLOW, __FILE__, __LINE__);
00272 }
00273
00274 if (uCount > 0)
00275 (void) MEM_COPY(&m_pData[udx], pData, uCount);
00276 }
00277 else
00278 ec = HError::Set(ERR_OUT_OF_RANGE, __FILE__, __LINE__);
00279 }
00280 else
00281 ec = HError::Set(ERR_BAD_PARAMETER, __FILE__, __LINE__);
00282
00283 return ec;
00284 }
00296 ErrCode SetSize(uint32 uSize)
00297 {
00298 ErrCode ec = HError::NoError();
00299
00300 if ((ec = Destroy()) == NO_ERROR && uSize > 0)
00301 ec = create(uSize);
00302
00303 return ec;
00304 }
00305
00306
00307
00308 public:
00315 inline bool Contains(const void * p, uint32 uBytes = 1) const
00316 {
00317 return (GOOD_PTR(m_pData) && GOOD_PTR(p) && uBytes > 0) ?
00318 (p >= m_pData && MAKE_PTR(PtrData, p, uBytes) <= &m_pData[m_uBytes]) : false;
00319 }
00324 inline bool IsValid(void) const
00325 { return (GOOD_PTR(m_pData) && m_uBytes > 0); }
00326 protected:
00332 inline bool validIndex(uint32 udx) const
00333 { return (GOOD_PTR(m_pData) && udx <= m_uBytes); }
00344 inline bool validPtr(PtrConst pData) const
00345 { return (GOOD_PTR(pData) && pData != m_pData); }
00346
00347
00348
00349 public:
00350 operator Ptr (void)
00351 { return m_pData; }
00352
00353 operator PtrData (void)
00354 { return m_pData; }
00355
00356 uint8
00357 operator[](uint32 udx) const
00358 { return GetAt(udx); }
00359
00360 uint8 &
00361 operator [] (uint32 udx) throw (HError)
00362 {
00363 if (!validIndex(udx))
00364 HError::Throw(ERR_OUT_OF_RANGE, __FILE__, __LINE__);
00365
00366 return m_pData[udx];
00367 }
00368
00369 HMemory &
00370 operator = (HMemory const & rhs) throw ()
00371 {
00372 if (Destroy() != NO_ERROR)
00373 throw HError::GetLastError();
00374
00375 if (rhs.IsValid())
00376 {
00377 if (create(rhs.m_uBytes, rhs.m_pData) != NO_ERROR)
00378 throw HError::GetLastError();
00379 }
00380 else
00381 HError::Throw(ERR_BAD_PARAMETER, __FILE__, __LINE__);
00382
00383 return *this;
00384 }
00385 };
00394 template <uint32 BUFFER_SIZE>
00395 class HMem : public HObj
00396 {
00397 typedef HObj base_class;
00398 static StringPtr ClassName(void) { return "HMem"; }
00399
00400
00401
00402 protected:
00403 uint8 m_buffer[BUFFER_SIZE];
00404
00405
00406
00407 public:
00408 HMem()
00409 { (void) Zero(); }
00410
00411 HMem(PtrConst pData, uint32 uSize) throw()
00412 {
00413 if (assign(pData, uSize) != NO_ERROR)
00414 throw HError::GetLastError();
00415 }
00416
00417 virtual
00418 ~HMem()
00419 { };
00420
00421
00422
00423 public:
00428 ErrCode
00429 Zero(void)
00430 {
00431 if (BUFFER_SIZE > 0)
00432 MEM_ZERO(m_buffer, BUFFER_SIZE);
00433 return HError::NoError();
00434 }
00435
00436 protected:
00444 ErrCode
00445 assign(PtrData pData, uint32 uBytes)
00446 {
00447 ErrCode ec = HError::NoError();
00448
00449 if (validPtr(pData) && uBytes > 0)
00450 {
00451 if (uBytes > BUFFER_SIZE)
00452 {
00453 uBytes = BUFFER_SIZE;
00454 ec = HError::Set(ERR_BUFFER_OVERFLOW, __FILE__, __LINE__);
00455 }
00456
00457 (void) MEM_COPY(m_buffer, pData, uBytes);
00458 }
00459 else
00460 ec = HError::Set(ERR_BAD_PARAMETER, __FILE__, __LINE__);
00461
00462 return ec;
00463 }
00464
00465
00466
00467 public:
00473 inline uint8 GetAt(uint32 udx) const
00474 { return validIndex(udx) ? m_buffer[udx] : '\0'; }
00479 inline static uint32 GetSize(void)
00480 { return BUFFER_SIZE; }
00488 ErrCode SetAt(uint32 udx, uint8 xVal)
00489 {
00490 ErrCode ec = HError::NoError();
00491
00492 if (validIndex(udx))
00493 m_buffer[udx] = xVal;
00494 else
00495 ec = HError::Set(ERR_BAD_PARAMETER, __FILE__, __LINE__);
00496
00497 return ec;
00498 }
00507 ErrCode SetAt(uint32 udx, PtrConst pData, uint32 uBytes)
00508 {
00509 ErrCode ec = HError::NoError();
00510
00511 if (GOOD_PTR(pData) && uBytes > 0)
00512 {
00513 if (validIndex(udx))
00514 {
00515 uint32 uCount = BUFFER_SIZE - udx;
00516
00517 if (uCount > uBytes)
00518 {
00519 uCount = uBytes;
00520 ec = HError::Set(ERR_BUFFER_OVERFLOW, __FILE__, __LINE__);
00521 }
00522
00523 if (uCount > 0)
00524 (void) MEM_COPY(&m_buffer[udx], pData, uCount);
00525 }
00526 else
00527 ec = HError::Set(ERR_OUT_OF_RANGE, __FILE__, __LINE__);
00528 }
00529 else
00530 ec = HError::Set(ERR_BAD_PARAMETER, __FILE__, __LINE__);
00531
00532 return ec;
00533 }
00534
00535
00536
00537 protected:
00543 inline bool validIndex(const uint32 udx) const
00544 { return (udx >= 0 && udx < BUFFER_SIZE); }
00555 inline bool validPtr(PtrConst pData) const
00556 { return (GOOD_PTR(pData) && pData != m_buffer); }
00557
00558
00559
00560 public:
00561 operator PtrDataConst() const
00562 { return m_buffer; }
00563
00564 uint8 &
00565 operator [] (uint32 udx) throw (HError)
00566 {
00567 if (!validIndex(udx))
00568 HError::Throw(ERR_OUT_OF_RANGE, __FILE__, __LINE__);
00569
00570 return m_buffer[udx];
00571 }
00572
00573 uint8
00574 operator [] (uint32 udx) const throw (HError)
00575 { return GetAt(udx); }
00576
00577 HMem &
00578 operator = (HMem const & rhs) throw()
00579 {
00580 if (assign(rhs.m_buffer, rhs.GetSize()) != NO_ERROR)
00581 throw HError::GetLastError();
00582
00583 return *this;
00584 }
00585 };
00586 #endif // HMEM_H
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615