Changeset - r14866:33478c3e40d3
[Not reviewed]
master
0 1 0
yexo - 14 years ago 2010-03-19 20:13:15
yexo@openttd.org
(svn r19472) -Codechange: reorder the static members of ByteBlob and add Zero() (skidd13)
1 file changed with 44 insertions and 37 deletions:
0 comments (0 inline, 0 general)
src/misc/blob.hpp
Show inline comments
 
@@ -86,17 +86,58 @@ public:
 
	FORCEINLINE ~ByteBlob()
 
	{
 
		Free();
 
	}
 

	
 
protected:
 
	/** initialize the empty blob by setting the header pointer to the static BlobHeader with
 
	 *  both items and capacity containing zero */
 
	/** all allocation should happen here */
 
	static FORCEINLINE BlobHeader *RawAlloc(uint num_bytes)
 
	{
 
		return (BlobHeader*)MallocT<byte>(num_bytes);
 
	}
 

	
 
	/** Return header pointer to the static BlobHeader with
 
	 * both items and capacity containing zero */
 
	static FORCEINLINE BlobHeader *Zero()
 
	{
 
		return const_cast<BlobHeader *>(&ByteBlob::hdrEmpty[1]);
 
	}
 

	
 
	/** simple allocation policy - can be optimized later */
 
	static FORCEINLINE uint AllocPolicy(uint min_alloc)
 
	{
 
		if (min_alloc < (1 << 9)) {
 
			if (min_alloc < (1 << 5)) return (1 << 5);
 
			return (min_alloc < (1 << 7)) ? (1 << 7) : (1 << 9);
 
		}
 
		if (min_alloc < (1 << 15)) {
 
			if (min_alloc < (1 << 11)) return (1 << 11);
 
			return (min_alloc < (1 << 13)) ? (1 << 13) : (1 << 15);
 
		}
 
		if (min_alloc < (1 << 20)) {
 
			if (min_alloc < (1 << 17)) return (1 << 17);
 
			return (min_alloc < (1 << 19)) ? (1 << 19) : (1 << 20);
 
		}
 
		min_alloc = (min_alloc | ((1 << 20) - 1)) + 1;
 
		return min_alloc;
 
	}
 

	
 
	/** all deallocations should happen here */
 
	static FORCEINLINE void RawFree(BlobHeader *p)
 
	{
 
		/* Just to silence an unsilencable GCC 4.4+ warning. */
 
		assert(p != ByteBlob::hdrEmpty);
 

	
 
		/* In case GCC warns about the following, see GCC's PR38509 why it is bogus. */
 
		free(p);
 
	}
 

	
 
	/** initialize the empty blob */
 
	FORCEINLINE void InitEmpty()
 
	{
 
		header = const_cast<BlobHeader *>(&ByteBlob::hdrEmpty[1]);
 
		header = Zero();
 
	}
 

	
 
	/** initialize blob by attaching it to the given header followed by data */
 
	FORCEINLINE void Init(BlobHeader *src)
 
	{
 
		header = &src[1];
 
@@ -214,46 +255,12 @@ public:
 
		BlobHeader *pOldHdr = &Hdr();
 
		Init(tmp);
 
		if (old_max_size > 0)
 
			RawFree(pOldHdr);
 
	}
 

	
 
	/** simple allocation policy - can be optimized later */
 
	FORCEINLINE static uint AllocPolicy(uint min_alloc)
 
	{
 
		if (min_alloc < (1 << 9)) {
 
			if (min_alloc < (1 << 5)) return (1 << 5);
 
			return (min_alloc < (1 << 7)) ? (1 << 7) : (1 << 9);
 
		}
 
		if (min_alloc < (1 << 15)) {
 
			if (min_alloc < (1 << 11)) return (1 << 11);
 
			return (min_alloc < (1 << 13)) ? (1 << 13) : (1 << 15);
 
		}
 
		if (min_alloc < (1 << 20)) {
 
			if (min_alloc < (1 << 17)) return (1 << 17);
 
			return (min_alloc < (1 << 19)) ? (1 << 19) : (1 << 20);
 
		}
 
		min_alloc = (min_alloc | ((1 << 20) - 1)) + 1;
 
		return min_alloc;
 
	}
 

	
 
	/** all allocation should happen here */
 
	static FORCEINLINE BlobHeader *RawAlloc(uint num_bytes)
 
	{
 
		return (BlobHeader*)MallocT<byte>(num_bytes);
 
	}
 

	
 
	/** all deallocations should happen here */
 
	static FORCEINLINE void RawFree(BlobHeader *p)
 
	{
 
		/* Just to silence an unsilencable GCC 4.4+ warning. */
 
		assert(p != ByteBlob::hdrEmpty);
 

	
 
		/* In case GCC warns about the following, see GCC's PR38509 why it is bogus. */
 
		free(p);
 
	}
 
	/** fixing the four bytes at the end of blob data - useful when blob is used to hold string */
 
	FORCEINLINE void FixTail() const
 
	{
 
		if (Capacity() > 0) {
 
			byte *p = &data[Length()];
 
			for (uint i = 0; i < tail_reserve; i++) {
0 comments (0 inline, 0 general)