⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 misc.h

📁 一个俄国人实现的数据库系统
💻 H
📖 第 1 页 / 共 2 页
字号:
inline void PutBlockLittleEndian(byte *block, T a, T b){#ifdef IS_LITTLE_ENDIAN	((T *)block)[0] = a;	((T *)block)[1] = b;#else	((T *)block)[0] = byteReverse(a);	((T *)block)[1] = byteReverse(b);#endif}// Fetch 4 words from user's buffer into "a", "b", "c", "d" in LITTLE-endian ordertemplate <class T>inline void GetBlockLittleEndian(const byte *block, T &a, T &b, T &c, T &d){#ifdef IS_LITTLE_ENDIAN	a = ((T *)block)[0];	b = ((T *)block)[1];	c = ((T *)block)[2];	d = ((T *)block)[3];#else	a = byteReverse(((T *)block)[0]);	b = byteReverse(((T *)block)[1]);	c = byteReverse(((T *)block)[2]);	d = byteReverse(((T *)block)[3]);#endif}// Put 4 words back into user's buffer in LITTLE-endian ordertemplate <class T>inline void PutBlockLittleEndian(byte *block, T a, T b, T c, T d){#ifdef IS_LITTLE_ENDIAN	((T *)block)[0] = a;	((T *)block)[1] = b;	((T *)block)[2] = c;	((T *)block)[3] = d;#else	((T *)block)[0] = byteReverse(a);	((T *)block)[1] = byteReverse(b);	((T *)block)[2] = byteReverse(c);	((T *)block)[3] = byteReverse(d);#endif}// Fetch 2 words from user's buffer into "a", "b" in BIG-endian ordertemplate <class T>inline void GetBlockBigEndian(const byte *block, T &a, T &b){#ifndef IS_LITTLE_ENDIAN	a = ((T *)block)[0];	b = ((T *)block)[1];#else	a = byteReverse(((T *)block)[0]);	b = byteReverse(((T *)block)[1]);#endif}// Put 2 words back into user's buffer in BIG-endian ordertemplate <class T>inline void PutBlockBigEndian(byte *block, T a, T b){#ifndef IS_LITTLE_ENDIAN	((T *)block)[0] = a;	((T *)block)[1] = b;#else	((T *)block)[0] = byteReverse(a);	((T *)block)[1] = byteReverse(b);#endif}// Fetch 4 words from user's buffer into "a", "b", "c", "d" in BIG-endian ordertemplate <class T>inline void GetBlockBigEndian(const byte *block, T &a, T &b, T &c, T &d){#ifndef IS_LITTLE_ENDIAN	a = ((T *)block)[0];	b = ((T *)block)[1];	c = ((T *)block)[2];	d = ((T *)block)[3];#else	a = byteReverse(((T *)block)[0]);	b = byteReverse(((T *)block)[1]);	c = byteReverse(((T *)block)[2]);	d = byteReverse(((T *)block)[3]);#endif}// Put 4 words back into user's buffer in BIG-endian ordertemplate <class T>inline void PutBlockBigEndian(byte *block, T a, T b, T c, T d){#ifndef IS_LITTLE_ENDIAN	((T *)block)[0] = a;	((T *)block)[1] = b;	((T *)block)[2] = c;	((T *)block)[3] = d;#else	((T *)block)[0] = byteReverse(a);	((T *)block)[1] = byteReverse(b);	((T *)block)[2] = byteReverse(c);	((T *)block)[3] = byteReverse(d);#endif}template <class T>std::string WordToString(T value, bool highFirst = true){	if (!CheckEndianess(highFirst))		value = byteReverse(value);	return std::string((char *)&value, sizeof(value));}template <class T>T StringToWord(const std::string &str, bool highFirst = true){	T value = 0;	memcpy(&value, str.data(), STDMIN(sizeof(value), str.size()));	return CheckEndianess(highFirst) ? value : byteReverse(value);}// ************** key length query ***************/// support query of fixed key lengthtemplate <unsigned int N>class FixedKeyLength{public:	enum {KEYLENGTH=N, MIN_KEYLENGTH=N, MAX_KEYLENGTH=N, DEFAULT_KEYLENGTH=N};	/// returns the key length	static unsigned int KeyLength(unsigned int) {return KEYLENGTH;}};/// support query of variable key length, template parameters are default, min, max, multiple (default multiple 1)template <unsigned int D, unsigned int N, unsigned int M, unsigned int Q=1>class VariableKeyLength{public:	enum {MIN_KEYLENGTH=N, MAX_KEYLENGTH=M, DEFAULT_KEYLENGTH=D, KEYLENGTH_MULTIPLE=Q};	/// returns the smallest valid key length in bytes that is >= min(n, MAX_KEYLENGTH)	static unsigned int KeyLength(unsigned int n)	{		assert(KEYLENGTH_MULTIPLE > 0 && MIN_KEYLENGTH % KEYLENGTH_MULTIPLE == 0 && MAX_KEYLENGTH % KEYLENGTH_MULTIPLE == 0);		if (n < MIN_KEYLENGTH)			return MIN_KEYLENGTH;		else if (n > MAX_KEYLENGTH)			return MAX_KEYLENGTH;		else			return RoundUpToMultipleOf(n, KEYLENGTH_MULTIPLE);	}};/// support query of key length that's the same as another classtemplate <class T>class SameKeyLengthAs{public:	enum {MIN_KEYLENGTH=T::MIN_KEYLENGTH, MAX_KEYLENGTH=T::MAX_KEYLENGTH, DEFAULT_KEYLENGTH=T::DEFAULT_KEYLENGTH};	/// returns the smallest valid key length in bytes that is >= min(n, MAX_KEYLENGTH)	static unsigned int KeyLength(unsigned int keylength)		{return T::KeyLength(keylength);}};// ************** secure memory allocation ***************#ifdef SECALLOC_DEFAULT#define SecAlloc(type, number) (new type[(number)])#define SecFree(ptr, number) (memset((ptr), 0, (number)*sizeof(*(ptr))), delete [] (ptr))#else#define SecAlloc(type, number) (new type[(number)])#define SecFree(ptr, number) (delete [] (ptr))#endif//! a block of memory allocated using SecAlloctemplate <class T> struct SecBlock{	explicit SecBlock(unsigned int size=0)		: size(size) {ptr = SecAlloc(T, size);}	SecBlock(const SecBlock<T> &t)		: size(t.size) {ptr = SecAlloc(T, size); memcpy(ptr, t.ptr, size*sizeof(T));}	SecBlock(const T *t, unsigned int len)		: size(len) {ptr = SecAlloc(T, len); memcpy(ptr, t, len*sizeof(T));}	~SecBlock()		{SecFree(ptr, size);}#if defined(__GNUC__) || defined(__BCPLUSPLUS__)	operator const void *() const		{return ptr;}	operator void *()		{return ptr;}#endif#if defined(__GNUC__)	// reduce warnings	operator const void *()		{return ptr;}#endif	operator const T *() const		{return ptr;}	operator T *()		{return ptr;}#if defined(__GNUC__)	// reduce warnings	operator const T *()		{return ptr;}#endif// CodeWarrior defines _MSC_VER#if !defined(_MSC_VER) || defined(__MWERKS__)	T *operator +(unsigned int offset)		{return ptr+offset;}	const T *operator +(unsigned int offset) const		{return ptr+offset;}	T& operator[](unsigned int index)		{assert(index<size); return ptr[index];}	const T& operator[](unsigned int index) const		{assert(index<size); return ptr[index];}#endif	const T* Begin() const		{return ptr;}	T* Begin()		{return ptr;}	const T* End() const		{return ptr+size;}	T* End()		{return ptr+size;}	unsigned int Size() const {return size;}	void Assign(const T *t, unsigned int len)	{		New(len);		memcpy(ptr, t, len*sizeof(T));	}	void Assign(const SecBlock<T> &t)	{		New(t.size);		memcpy(ptr, t.ptr, size*sizeof(T));	}	SecBlock& operator=(const SecBlock<T> &t)	{		Assign(t);		return *this;	}	bool operator==(const SecBlock<T> &t) const	{		return size == t.size && memcmp(ptr, t.ptr, size*sizeof(T)) == 0;	}	bool operator!=(const SecBlock<T> &t) const	{		return !operator==(t);	}	void New(unsigned int newSize)	{		if (newSize != size)		{			T *newPtr = SecAlloc(T, newSize);			SecFree(ptr, size);			ptr = newPtr;			size = newSize;		}	}	void CleanNew(unsigned int newSize)	{		if (newSize != size)		{			T *newPtr = SecAlloc(T, newSize);			SecFree(ptr, size);			ptr = newPtr;			size = newSize;		}		memset(ptr, 0, size*sizeof(T));	}	void Grow(unsigned int newSize)	{		if (newSize > size)		{			T *newPtr = SecAlloc(T, newSize);			memcpy(newPtr, ptr, size*sizeof(T));			SecFree(ptr, size);			ptr = newPtr;			size = newSize;		}	}	void CleanGrow(unsigned int newSize)	{		if (newSize > size)		{			T *newPtr = SecAlloc(T, newSize);			memcpy(newPtr, ptr, size*sizeof(T));			memset(newPtr+size, 0, (newSize-size)*sizeof(T));			SecFree(ptr, size);			ptr = newPtr;			size = newSize;		}	}	void Resize(unsigned int newSize)	{		if (newSize != size)		{			T *newPtr = SecAlloc(T, newSize);			memcpy(newPtr, ptr, STDMIN(newSize, size)*sizeof(T));			SecFree(ptr, size);			ptr = newPtr;			size = newSize;		}	}	void swap(SecBlock<T> &b);	unsigned int size;	T *ptr;};template <class T> void SecBlock<T>::swap(SecBlock<T> &b){	std::swap(size, b.size);	std::swap(ptr, b.ptr);}typedef SecBlock<byte> SecByteBlock;typedef SecBlock<word> SecWordBlock;NAMESPACE_ENDNAMESPACE_BEGIN(std)template <class T>inline void swap(CryptoPP::SecBlock<T> &a, CryptoPP::SecBlock<T> &b){	a.swap(b);}NAMESPACE_END#endif // MISC_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -