Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cMem.h
Go to the documentation of this file.
1 //
5 //
6 
7 #ifndef _INC_cMem_H
8 #define _INC_cMem_H
9 #ifndef NO_PRAGMA_ONCE
10 #pragma once
11 #endif
12 
13 #include "Index.h"
14 #include "StrConst.h"
15 #include "cValT.h"
16 #include "cUnitTestDecl.h"
17 #include "cDebugAssert.h"
18 
19 namespace Gray
20 {
21  struct GRAYCORE_LINK cMem // static cSingleton
22  {
26 
27  static VOLATILE uintptr_t sm_bDontOptimizeOut0; // static global byte to fool the optimizer into preserving this data.
28  static VOLATILE uintptr_t sm_bDontOptimizeOutX; // static global byte to fool the optimizer into preserving this data.
29 
30 #if ! defined(UNDER_CE) && ( ! defined(_DEBUG) || ! defined(_MSC_VER))
31  static void __cdecl IsValidFailHandler(int nSig); // JMP_t
32 #endif
33 
34  static ptrdiff_t inline Diff(const void* pEnd, const void* pStart) noexcept
35  {
37  ptrdiff_t i = ((const BYTE*)pEnd - (const BYTE*)pStart); // like INT_PTR
38  // ASSERT(i > -(INT_PTR)(cHeap::k_ALLOC_MAX) && i < (INT_PTR)(cHeap::k_ALLOC_MAX)); // k_ALLOC_MAX
39  return i;
40  }
41 
42  static bool inline IsValidApp(const void* pData) noexcept
43  {
47 
48  if (((UINT_PTR)pData) < 16 * 1024) // ASSUME memory in this range is never valid? Fail quickly. This is Kernel Space ONLY. <1G
49  return false;
50 #ifdef _WIN32
51 
52 #endif
53  return true;
54  }
55 
56  static bool GRAYCALL IsValid(const void* pData, size_t nSize = 1, bool bWriteAccess = false) noexcept;
57  static inline bool IsCorrupt(const void* pData, size_t nSize = 1, bool bWriteAccess = false) noexcept
58  {
61  if (pData == nullptr) // nullptr is not corrupt.
62  return false;
63  return !IsValid(pData, nSize, bWriteAccess);
64  }
65  static inline bool IsZeros(const void* pData, size_t nSize) noexcept
66  {
68  if (!IsValidApp(pData))
69  return true;
70  for (size_t i = 0; i < nSize; i++)
71  {
72  if (((const BYTE*)pData)[i] != 0)
73  return false;
74  }
75  return true;
76  }
77 
78  static inline COMPARE_t Compare(const void* p1, const void* p2, size_t nSizeBlock) noexcept
79  {
82  return ::memcmp(p1, p2, nSizeBlock);
83  }
84 
85  static inline COMPARE_t CompareSecure(const void* p1, const void* p2, size_t nSizeBlock) noexcept
86  {
88  const BYTE* pB1 = (const BYTE*)p1;
89  const BYTE* pB2 = (const BYTE*)p2;
90  BYTE nDiff = 0;
91  for (size_t i = 0; i < nSizeBlock; i++)
92  {
93  nDiff |= pB1[i] ^ pB2[i];
94  }
95  return (COMPARE_t)nDiff;
96  }
97 
98  static size_t GRAYCALL CompareIndex(const void* p1, const void* p2, size_t nSizeBlock);
99 
100  static inline void Zero(void* pData, size_t nSizeBlock) noexcept
101  {
104 #ifdef _WIN32
105  ::ZeroMemory(pData, nSizeBlock);
106 #else
107  ::memset(pData, 0, nSizeBlock);
108 #endif
109  }
110  static inline void ZeroSecure(void* pData, size_t nSizeBlock) noexcept
111  {
114  VOLATILE BYTE* p2 = (BYTE*)pData; // 'volatile' will ensure it doesn't get optimized out.
115  while (nSizeBlock--)
116  *p2++ = 0;
117  }
118 
119  static inline void Xor(BYTE* pDst, const BYTE* pSrc, size_t nBlockSize) noexcept
120  {
121  // Xor with self.
122  for (size_t i = 0; i < nBlockSize; i++)
123  pDst[i] ^= pSrc[i];
124  }
125 
126  static inline void Xor2(BYTE* pDst, const BYTE* pSrc1, const BYTE* pSrc2, size_t nBlockSize) noexcept
127  {
128  for (size_t i = 0; i < nBlockSize; i++)
129  pDst[i] = pSrc1[i] ^ pSrc2[i];
130  }
131 
132  static inline void Copy(void* pDst, const void* pSrc, size_t nSizeBlock) noexcept
133  {
137  ::memcpy(pDst, pSrc, nSizeBlock);
138  }
139  static inline void CopyOverlap(void* pDst, const void* pSrc, size_t nSizeBlock) noexcept
140  {
144  ::memmove(pDst, pSrc, nSizeBlock);
145  }
146  static inline void ReverseBytes(void* pDst, size_t nSizeBlock) noexcept
147  {
148  register BYTE* pSrcB = (BYTE*)pDst;
149  register BYTE* pDstB = (BYTE*)pDst + nSizeBlock - 1;
150  nSizeBlock /= 2;
151  while (nSizeBlock--)
152  {
153  cValT::Swap(*pSrcB++, *pDstB--);
154  }
155  }
156  static inline void CopyReverse(void* pDst, const void* pSrc, size_t nSizeBlock) noexcept
157  {
159  if (pDst == pSrc)
160  {
161  ReverseBytes(pDst, nSizeBlock);
162  }
163  else
164  {
165  register BYTE* pDstB = (BYTE*)pDst + nSizeBlock - 1;
166  register const BYTE* pSrcB = (const BYTE*)pSrc;
167  while (nSizeBlock--)
168  {
169  *pDstB-- = *pSrcB++;
170  }
171  }
172  }
173 
174  static inline void Fill(void* pDst, size_t nSize, BYTE bVal) noexcept
175  {
177  for (size_t j = 0; j < nSize; j++)
178  {
179  ((BYTE*)pDst)[j] = bVal;
180  }
181  }
182  static inline void CopyRepeat(void* pDst, size_t nDstSize, const void* pSrc, size_t nSrcSize) noexcept
183  {
185  for (size_t i = 0; i < nDstSize;)
186  {
187  for (size_t j = 0; j < nSrcSize && i < nDstSize; j++, i++)
188  {
189  ((BYTE*)pDst)[i] = ((const BYTE*)pSrc)[j];
190  }
191  }
192  }
193 
194  static inline void CopyHtoN(BYTE* pDst, const void* pSrc, size_t nSizeBlock) noexcept
195  {
197 #ifdef USE_LITTLE_ENDIAN
198  cMem::CopyReverse(pDst, pSrc, nSizeBlock);
199 #else
200  cMem::Copy(pDst, pSrc, nSizeBlock);
201 #endif
202  }
203  static inline void CopyNtoH(void* pDst, const BYTE* pSrc, size_t nSizeBlock) noexcept
204  {
206 #ifdef USE_LITTLE_ENDIAN
207  cMem::CopyReverse(pDst, pSrc, nSizeBlock);
208 #else
209  cMem::Copy(pDst, pSrc, nSizeBlock);
210 #endif
211  }
212 
213  static inline void Swap(void* pvMem1, void* pvMem2, size_t nBlockSize) noexcept
214  {
221 
222  if (pvMem1 == pvMem2) // no change.
223  return;
224  BYTE* pMem1 = (BYTE*)pvMem1;
225  BYTE* pMem2 = (BYTE*)pvMem2;
226  for (; nBlockSize--; pMem1++, pMem2++)
227  {
228  cValT::Swap(*pMem1, *pMem2);
229  }
230  }
231 
232  // read/write a string of comma separated numbers.
233  static StrLen_t GRAYCALL ConvertToString(char* pszDst, StrLen_t iSizeDstMax, const BYTE* pSrc, size_t iLenSrc);
234  static size_t GRAYCALL ReadFromString(BYTE* pDst, size_t iLenBytesMax, const char* pszSrc);
235 
236  static inline StrLen_t GetHexDigestSize(size_t nSize) noexcept
237  {
239  return (StrLen_t)((nSize * 2) + 1);
240  }
241  static StrLen_t GRAYCALL GetHexDigest(OUT char* pszHexString, const BYTE* pData, size_t nSizeData);
242  static HRESULT GRAYCALL SetHexDigest(const char* pszHexString, OUT BYTE* pData, size_t nSizeData);
243 
245  };
246 
247  template <UINT32 _SIGVALID = 0xCA11AB1E>
249  {
254  public:
255  static const UINT32 k_VALID = _SIGVALID;
256  static const UINT32 k_INVALID = 0xDEADBEA7;
257  private:
258  UINT32 m_nSignature;
259  public:
260  cMemSignature() noexcept
261  : m_nSignature(_SIGVALID)
262  {
264  }
266  {
269  ASSERT(isValidSignature());
270  m_nSignature = k_INVALID; // Mark as invalid.
271  }
272  bool inline isValidSignature() const noexcept
273  {
274  if (!cMem::IsValidApp(this))
275  return false;
276  if (m_nSignature != _SIGVALID)
277  return false;
278  return true;
279  }
280  };
281 
282  template<size_t TYPE_SIZE>
284  {
287 
288  public:
289  static const size_t k_Size = TYPE_SIZE;
290  static const size_t k_SizeHexDigest = ((TYPE_SIZE * 2) + 1);
291 
292  BYTE m_Data[TYPE_SIZE];
293 
294  public:
295  size_t get_DataLength() const noexcept
296  {
298  return TYPE_SIZE;
299  }
300  const BYTE* get_DataBytes() const noexcept
301  {
302  return m_Data;
303  }
304  operator const BYTE* () const noexcept
305  {
306  return m_Data;
307  }
308  };
309 
311  {
315 
316  protected:
317  size_t m_nSize;
318  void* m_pData;
319 
320  public:
321  cMemBlock() noexcept
322  : m_nSize(0)
323  , m_pData(nullptr)
324  {
325  }
326  cMemBlock(const void* pData, size_t nSize) noexcept
327  : m_nSize(nSize)
328  , m_pData(const_cast<void*>(pData)) // just assume we don't modify it?
329  {
330  }
331  cMemBlock(const cMemBlock& block) noexcept
332  : m_nSize(block.m_nSize)
333  , m_pData(block.m_pData)
334  {
335  // Just shared pointers. This may be dangerous!
336  }
337  cMemBlock(const cMemBlock* pBlock) noexcept
338  : m_nSize((pBlock == nullptr) ? 0 : pBlock->m_nSize)
339  , m_pData((pBlock == nullptr) ? nullptr : pBlock->m_pData)
340  {
341  // Just shared pointers. This may be dangerous!
342  }
343 
344  inline size_t get_DataSize() const noexcept
345  {
346  return m_nSize;
347  }
348 
349  inline void* get_Data() const noexcept
350  {
352  return m_pData;
353  }
354  inline BYTE* get_DataBytes() const noexcept
355  {
357  return (BYTE*)m_pData;
358  }
359  inline char* get_DataA() const noexcept
360  {
362  return (char*)m_pData;
363  }
364 
365  operator const BYTE* () const noexcept
366  {
368  return get_DataBytes();
369  }
370 
371  inline bool isValidPtr() const noexcept
372  {
375  return m_pData != nullptr;
376  }
377  inline bool IsValidIndex(size_t i) const noexcept
378  {
380  return IS_INDEX_GOOD(i, m_nSize);
381  }
382  bool IsValidIndex2(size_t i) const noexcept
383  {
385  if (i == m_nSize) // at end ?
386  return true;
387  return IS_INDEX_GOOD(i, m_nSize);
388  }
389  bool IsValidPtr(const void* p) const noexcept
390  {
392  return IsValidIndex(cMem::Diff(p, get_Data()));
393  }
394  bool IsValidPtr2(const void* p) const noexcept
395  {
397  return IsValidIndex2(cMem::Diff(p, get_Data()));
398  }
399 
400  bool IsZeros() const noexcept
401  {
402  return cMem::IsZeros(m_pData, m_nSize);
403  }
404 
405  bool IsEqualData(const void* pData, size_t nSize) const noexcept
406  {
408  return m_nSize == nSize && !::memcmp(m_pData, pData, nSize);
409  }
410  bool IsEqualData(const cMemBlock* pData) const noexcept
411  {
413  if (pData == nullptr)
414  return false;
415  return IsEqualData(pData->m_pData, pData->m_nSize);
416  }
417  bool IsEqualData(const cMemBlock& data) const noexcept
418  {
420  return IsEqualData(data.m_pData, data.m_nSize);
421  }
422 
425 #define IsEqualLiteral(x) IsEqualData( STRLIT2(x))
426 
427  BYTE* GetOffset(size_t nOffset) const
428  {
430  ASSERT(IsValidIndex(nOffset));
431  return get_DataBytes() + nOffset;
432  }
433  const void* get_DataEnd() const noexcept
434  {
436  return get_DataBytes() + m_nSize;
437  }
438 
439  void put_DataPtr(void* pStart) noexcept
440  {
441  // Set Data pointer but leave size.
442  m_pData = pStart;
443  // ASSERT(is pStart reasonable?)
444  }
445  void put_Size(size_t nSize) noexcept
446  {
447  // Set size but leave data pointer.
448  m_nSize = nSize;
449  }
450 
451  void SetBlock(void* pData, size_t nSize) noexcept
452  {
453  m_pData = pData;
454  m_nSize = nSize; // size does not apply if nullptr.
455  }
456  void SetEmptyBlock() noexcept
457  {
458  m_pData = nullptr;
459  m_nSize = 0;
460  }
461 
462  void InitZeros() noexcept
463  {
464  cMem::ZeroSecure(m_pData, m_nSize);
465  }
466  StrLen_t ConvertToString(char* pszDst, StrLen_t iDstSizeMax) const
467  {
468  return cMem::ConvertToString(pszDst, iDstSizeMax, get_DataBytes(), m_nSize);
469  }
470 
471  static COMPARE_t GRAYCALL Compare(const void* pData1, size_t iLen1, const void* pData2, size_t iLen2);
472  };
473 
474  struct GRAYCORE_LINK cMemT : public cValT // Value of some type in memory.
475  {
479 
480  template <class TYPE>
481  static inline TYPE ReverseType(TYPE nVal) noexcept
482  {
486 
487  cMem::CopyReverse(&nVal, &nVal, sizeof(nVal));
488  return nVal;
489  }
490  template <typename TYPE>
491  static inline TYPE HtoN(TYPE nVal) noexcept
492  {
494 #ifdef USE_LITTLE_ENDIAN
496  return ReverseType(nVal);
497 #else
498  return nVal; // no change needed.
499 #endif
500  }
501  template <typename TYPE>
502  static inline TYPE NtoH(TYPE nVal) noexcept
503  {
506 #ifdef USE_LITTLE_ENDIAN
508  return ReverseType(nVal);
509 #else
510  return nVal; // no change needed.
511 #endif
512  }
513 
514  template <typename TYPE>
515  static inline TYPE HtoLE(TYPE nVal) noexcept
516  {
518 #ifdef USE_LITTLE_ENDIAN
519  return nVal; // no change needed.
520 #else
522  return ReverseType(nVal);
523 #endif
524  }
525  template <typename TYPE>
526  static inline TYPE LEtoH(TYPE nVal) noexcept
527  {
529 #ifdef USE_LITTLE_ENDIAN
530  return nVal; // no change needed.
531 #else
533  return ReverseType(nVal);
534 #endif
535  }
536 
537  template <typename TYPE>
538  static inline TYPE GetUnaligned(const void* pData) noexcept
539  {
544 #ifdef _MSC_VER
545  return *((const UNALIGNED TYPE*) pData);
546 #else
547  return *((const TYPE*)pData);
548 #endif
549  }
550  template <typename TYPE>
551  static inline void SetUnaligned(void* pData, TYPE nVal) noexcept
552  {
557 #ifdef _MSC_VER
558  * ((UNALIGNED TYPE*) pData) = nVal;
559 #else
560  * ((TYPE*)pData) = nVal;
561 #endif
562  }
563 
564  template <typename TYPE>
565  static inline TYPE GetLEtoH(const void* pData) noexcept
566  {
568  return LEtoH(GetUnaligned<TYPE>(pData));
569  }
570  template <typename TYPE>
571  static inline void SetHtoLE(void* pData, TYPE nVal) noexcept
572  {
574  return SetUnaligned(pData, HtoLE(nVal));
575  }
576  template <typename TYPE>
577  static inline TYPE GetNtoH(const void* pData) noexcept
578  {
581  return NtoH(GetUnaligned<TYPE>(pData));
582  }
583  template <typename TYPE>
584  static inline void SetHtoN(void* pData, TYPE nVal) noexcept
585  {
588  return SetUnaligned(pData, HtoN(nVal));
589  }
590 
591  static inline DWORD GetNVal3(const BYTE* p) noexcept
592  {
595  return ((DWORD)p[0]) << 16 | ((DWORD)p[1]) << 8 | p[2];
596  }
597  static inline void SetNVal3(BYTE* p, DWORD nVal) noexcept
598  {
601  p[0] = (BYTE)((nVal >> 16) & 0xFF);
602  p[1] = (BYTE)((nVal >> 8) & 0xFF); // HIBYTE
603  p[2] = (BYTE)((nVal) & 0xFF); // LOBYTE
604  }
605  };
606 
607  template <>
608  inline WORD cMemT::ReverseType<WORD>(WORD nVal) noexcept // static
609  {
612  return (WORD)((nVal >> 8) | (nVal << 8));
613  }
614  template <>
615  inline UINT32 cMemT::ReverseType<UINT32>(UINT32 nVal) noexcept // static
616  {
619  nVal = (nVal >> 16) | (nVal << 16);
620  return ((nVal & 0xff00ff00UL) >> 8) | ((nVal & 0x00ff00ffUL) << 8);
621  }
622 
623 #ifdef USE_INT64
624  template <>
625  inline UINT64 cMemT::ReverseType<UINT64>(UINT64 nVal) noexcept // static
626  {
628  nVal = (nVal >> 32) | (nVal << 32);
629  nVal = ((nVal & 0xff00ff00ff00ff00ULL) >> 8) | ((nVal & 0x00ff00ff00ff00ffULL) << 8);
630  return ((nVal & 0xffff0000ffff0000ULL) >> 16) | ((nVal & 0x0000ffff0000ffffULL) << 16);
631  }
632 #endif
633 #ifndef USE_LONG_AS_INT64
634  template <>
635  inline ULONG cMemT::ReverseType<ULONG>(ULONG nVal) noexcept // static
636  {
638  // return ReverseType<UINT64>(nVal);
639  return ReverseType<UINT32>(nVal);
640  }
641 #endif
642 
643 #if 0 // USE_LITTLE_ENDIAN
644  template <>
645  inline UINT32 cMemT::GetNtoH<UINT32>(const void* pData)
646  {
647  const BYTE* p = (const BYTE*)pData;
648  return ((UINT32)p[0] << 24)
649  | ((UINT32)p[1] << 16)
650  | ((UINT32)p[2] << 8)
651  | ((UINT32)p[3]);
652  }
653  template <>
654  inline void cMemT::SetHtoN<UINT32>(void* pData, UINT32 nVal)
655  {
656  BYTE* p = (BYTE*)pData;
657  p[0] = (BYTE)(nVal >> 24);
658  p[1] = (BYTE)(nVal >> 16);
659  p[2] = (BYTE)(nVal >> 8);
660  p[3] = (BYTE)(nVal);
661  }
662 
663  template <>
664  inline UINT64 cMemT::GetNtoH<UINT64>(const void* pData)
665  {
666  const BYTE* p = (const BYTE*)pData;
667  return ((UINT64)p[0] << 56)
668  | ((UINT64)p[1] << 48)
669  | ((UINT64)p[2] << 40)
670  | ((UINT64)p[3] << 32)
671  | ((UINT64)p[4] << 24)
672  | ((UINT64)p[5] << 16)
673  | ((UINT64)p[6] << 8)
674  | ((UINT64)p[7]);
675  }
676  template <>
677  inline void cMemT::SetHtoN<UINT64>(void* pData, UINT64 nVal)
678  {
679  BYTE* p = (BYTE*)pData;
680  p[0] = (BYTE)(nVal >> 56);
681  p[1] = (BYTE)(nVal >> 48);
682  p[2] = (BYTE)(nVal >> 40);
683  p[3] = (BYTE)(nVal >> 32);
684  p[4] = (BYTE)(nVal >> 24);
685  p[5] = (BYTE)(nVal >> 16);
686  p[6] = (BYTE)(nVal >> 8);
687  p[7] = (BYTE)(nVal);
688  }
689 #endif
690 
691 }
692 #endif
#define GRAYCORE_LINK
Definition: GrayCore.h:47
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define IS_INDEX_GOOD(i, q)
cast the (likely) int to unsigned to check for negatives.
Definition: Index.h:35
Using X files without the sources and the makefile How to use you just create a debug directory e the sample3 directory must contain Sample3 Final Sample3 exe Sample3 Final Debug Sample3 Final Gfx OpenGL bmp Sample3 Final Gfx tiny_skin bmp Sample3 Final Gfx tiny_4anim x The source files have the DevCpp project file plus the makefile The demos use standard FreeGlut functions Technical without warranty Neither Paul Coppens nor GameDev net make any or either express or with respect to the their or fitness for a specific purpose neither Paul Coppens nor GameDev net shall have any liability to you or any other person or entity with respect to any or damage caused or alleged to have been caused directly or indirectly by the programs provided by Paul Coppens and GameDev net This but is not limited interruption of loss of data
Definition: Readme.txt:39
#define TYPE
Definition: StrT.cpp:38
#define DECLSPEC_NOVTABLE
Definition: SysTypes.h:322
UINT32 uintptr_t
Definition: SysTypes.h:449
#define VOLATILE
Definition: SysTypes.h:429
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
#define UNITTEST_FRIEND(n)
Define this in the class body to be unit tested. Allow the unit test to access private/protected stuf...
Definition: cUnitTestDecl.h:17
Definition: cMem.h:311
bool IsEqualData(const cMemBlock *pData) const noexcept
Definition: cMem.h:410
BYTE * get_DataBytes() const noexcept
Definition: cMem.h:354
bool IsEqualData(const void *pData, size_t nSize) const noexcept
Definition: cMem.h:405
cMemBlock(const cMemBlock &block) noexcept
Definition: cMem.h:331
bool isValidPtr() const noexcept
Definition: cMem.h:371
bool IsValidIndex(size_t i) const noexcept
Definition: cMem.h:377
void put_Size(size_t nSize) noexcept
Definition: cMem.h:445
char * get_DataA() const noexcept
Definition: cMem.h:359
void * m_pData
Definition: cMem.h:318
bool IsZeros() const noexcept
Definition: cMem.h:400
void SetEmptyBlock() noexcept
Definition: cMem.h:456
size_t get_DataSize() const noexcept
Definition: cMem.h:344
BYTE * GetOffset(size_t nOffset) const
Definition: cMem.h:427
bool IsValidIndex2(size_t i) const noexcept
Definition: cMem.h:382
bool IsValidPtr2(const void *p) const noexcept
Definition: cMem.h:394
void * get_Data() const noexcept
Definition: cMem.h:349
StrLen_t ConvertToString(char *pszDst, StrLen_t iDstSizeMax) const
Definition: cMem.h:466
void put_DataPtr(void *pStart) noexcept
Definition: cMem.h:439
void SetBlock(void *pData, size_t nSize) noexcept
Definition: cMem.h:451
cMemBlock(const cMemBlock *pBlock) noexcept
Definition: cMem.h:337
size_t m_nSize
size_t of m_pData in bytes. May be determined at runtime.
Definition: cMem.h:317
bool IsEqualData(const cMemBlock &data) const noexcept
Definition: cMem.h:417
const void * get_DataEnd() const noexcept
Definition: cMem.h:433
void InitZeros() noexcept
Definition: cMem.h:462
bool IsValidPtr(const void *p) const noexcept
Definition: cMem.h:389
cMemBlock(const void *pData, size_t nSize) noexcept
Definition: cMem.h:326
cMemBlock() noexcept
Definition: cMem.h:321
Definition: cMem.h:249
bool isValidSignature() const noexcept
Definition: cMem.h:272
~cMemSignature()
Definition: cMem.h:265
cMemSignature() noexcept
Definition: cMem.h:260
Definition: cMem.h:284
size_t get_DataLength() const noexcept
Definition: cMem.h:295
static const size_t k_Size
All hashes of this type are this size (bytes).
Definition: cMem.h:289
BYTE m_Data[TYPE_SIZE]
All objects of this type are this size.
Definition: cMem.h:292
const BYTE * get_DataBytes() const noexcept
Definition: cMem.h:300
static const size_t k_SizeHexDigest
hold a string with the hex digest of this. (chars).
Definition: cMem.h:290
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
int COMPARE_t
result of compare. 0=same, 1=a>b, -1=a<b
Definition: cValT.h:17
int StrLen_t
the length of a string in chars (bytes for UTF8, wchar_t for UNICODE). or offset in characters....
Definition: StrConst.h:32
Definition: cMem.h:475
static TYPE GetNtoH(const void *pData) noexcept
Definition: cMem.h:577
static TYPE NtoH(TYPE nVal) noexcept
Definition: cMem.h:502
static void SetNVal3(BYTE *p, DWORD nVal) noexcept
Definition: cMem.h:597
static TYPE GetUnaligned(const void *pData) noexcept
Definition: cMem.h:538
static TYPE GetLEtoH(const void *pData) noexcept
Definition: cMem.h:565
static void SetUnaligned(void *pData, TYPE nVal) noexcept
Definition: cMem.h:551
static TYPE LEtoH(TYPE nVal) noexcept
Definition: cMem.h:526
static void SetHtoN(void *pData, TYPE nVal) noexcept
Definition: cMem.h:584
static TYPE ReverseType(TYPE nVal) noexcept
Definition: cMem.h:481
static void SetHtoLE(void *pData, TYPE nVal) noexcept
Definition: cMem.h:571
static TYPE HtoN(TYPE nVal) noexcept
Definition: cMem.h:491
static DWORD GetNVal3(const BYTE *p) noexcept
Definition: cMem.h:591
static TYPE HtoLE(TYPE nVal) noexcept
Definition: cMem.h:515
Definition: cMem.h:22
static void CopyHtoN(BYTE *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:194
static void CopyNtoH(void *pDst, const BYTE *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:203
static COMPARE_t CompareSecure(const void *p1, const void *p2, size_t nSizeBlock) noexcept
Definition: cMem.h:85
static void Copy(void *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:132
static void ReverseBytes(void *pDst, size_t nSizeBlock) noexcept
Definition: cMem.h:146
static void Zero(void *pData, size_t nSizeBlock) noexcept
Definition: cMem.h:100
static bool IsZeros(const void *pData, size_t nSize) noexcept
Definition: cMem.h:65
static StrLen_t GetHexDigestSize(size_t nSize) noexcept
Definition: cMem.h:236
static bool IsValidApp(const void *pData) noexcept
Definition: cMem.h:42
static void ZeroSecure(void *pData, size_t nSizeBlock) noexcept
Definition: cMem.h:110
static void CopyReverse(void *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:156
static void Xor(BYTE *pDst, const BYTE *pSrc, size_t nBlockSize) noexcept
Definition: cMem.h:119
static StrLen_t __stdcall ConvertToString(char *pszDst, StrLen_t iSizeDstMax, const BYTE *pSrc, size_t iLenSrc)
Definition: cMem.cpp:154
static void CopyRepeat(void *pDst, size_t nDstSize, const void *pSrc, size_t nSrcSize) noexcept
Definition: cMem.h:182
static volatile uintptr_t sm_bDontOptimizeOut0
used to trick the optimizer. Always 0.
Definition: cMem.h:27
static volatile uintptr_t sm_bDontOptimizeOutX
used to trick the optimizer. Unknown value.
Definition: cMem.h:28
static ptrdiff_t Diff(const void *pEnd, const void *pStart) noexcept
Definition: cMem.h:34
static void CopyOverlap(void *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:139
static COMPARE_t Compare(const void *p1, const void *p2, size_t nSizeBlock) noexcept
Definition: cMem.h:78
static void Xor2(BYTE *pDst, const BYTE *pSrc1, const BYTE *pSrc2, size_t nBlockSize) noexcept
Definition: cMem.h:126
static void Swap(void *pvMem1, void *pvMem2, size_t nBlockSize) noexcept
Definition: cMem.h:213
static void Fill(void *pDst, size_t nSize, BYTE bVal) noexcept
Definition: cMem.h:174
Definition: cValT.h:28
static void Swap(TYPE &a, TYPE &b) noexcept
Definition: cValT.h:34