diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/pugixml.cpp | 58 | 
1 files changed, 28 insertions, 30 deletions
| diff --git a/src/pugixml.cpp b/src/pugixml.cpp index 1a7acb3..568eb17 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -849,7 +849,7 @@ PUGI__NS_BEGIN  				{  					xml_memory_page* page = compact_get_page(this, header_offset); -					if (page->compact_shared_parent == 0) +					if (PUGI__UNLIKELY(page->compact_shared_parent == 0))  						page->compact_shared_parent = value;  					if (page->compact_shared_parent == value) @@ -872,17 +872,15 @@ PUGI__NS_BEGIN  		operator T*() const  		{ -			int data = _data; - -			if (data) +			if (_data)  			{ -				if (data < 65534) +				if (_data < 65534)  				{  					uintptr_t base = reinterpret_cast<uintptr_t>(this) & ~(compact_alignment - 1); -					return reinterpret_cast<T*>(base + ((data - 1 - 65533) << compact_alignment_log2)); +					return reinterpret_cast<T*>(base + ((_data - 1 - 65533) << compact_alignment_log2));  				} -				else if (data == 65534) +				else if (_data == 65534)  					return static_cast<T*>(compact_get_page(this, header_offset)->compact_shared_parent);  				else  					return compact_get_value<header_offset, T>(this); @@ -923,36 +921,36 @@ PUGI__NS_BEGIN  				ptrdiff_t offset = value - page->compact_string_base; -				if (PUGI__UNLIKELY(static_cast<uintptr_t>(offset) >= (65535 << 7))) -				{ -					compact_set_value<header_offset>(this, value); - -					_data = 255; -				} -				else +				if (static_cast<uintptr_t>(offset) < (65535 << 7))  				{  					uint16_t* base = reinterpret_cast<uint16_t*>(reinterpret_cast<char*>(this) - base_offset); -					if (PUGI__UNLIKELY(*base)) +					if (*base == 0) +					{ +						*base = static_cast<uint16_t>((offset >> 7) + 1); +						_data = static_cast<unsigned char>((offset & 127) + 1); +					} +					else  					{  						ptrdiff_t remainder = offset - ((*base - 1) << 7); -						if (PUGI__UNLIKELY(static_cast<uintptr_t>(remainder) >= 254)) +						if (static_cast<uintptr_t>(remainder) < 254)  						{ -							compact_set_value<header_offset>(this, value); - -							_data = 255; +							_data = static_cast<unsigned char>(remainder + 1);  						}  						else  						{ -							_data = static_cast<unsigned char>(remainder + 1); +							compact_set_value<header_offset>(this, value); + +							_data = 255;  						}  					} -					else -					{ -						*base = static_cast<uint16_t>((offset >> 7) + 1); -						_data = static_cast<unsigned char>((offset & 127) + 1); -					} +				} +				else +				{ +					compact_set_value<header_offset>(this, value); + +					_data = 255;  				}  			}  			else @@ -965,11 +963,7 @@ PUGI__NS_BEGIN  		{  			if (_data)  			{ -				if (PUGI__UNLIKELY(_data == 255)) -				{ -					return compact_get_value<header_offset, char_t>(this); -				} -				else +				if (_data < 255)  				{  					xml_memory_page* page = compact_get_page(this, header_offset); @@ -980,6 +974,10 @@ PUGI__NS_BEGIN  					return page->compact_string_base + offset;  				} +				else +				{ +					return compact_get_value<header_offset, char_t>(this); +				}  			}  			else  				return 0; | 
