/// <summary>
			///		Push new context collection state to internal stack.
			/// </summary>
			/// <param name="header">Header of collection object.</param>
			/// <param name="count">Items count of collection object. If collection is map, this value indicates count of entries.</param>
			public void NewContextCollection( MessagePackHeader header, uint count )
			{
#if DEBUG
				Contract.Assert( ( header.Type & MessageType.IsRawBinary ) == 0, header.Type.ToString() );
#endif

				this._collectionContextStack.Push( CollectionContextState.Create( header, count ) );
			}
		private static MessagePackHeader[] InitializeHeaderArray()
		{
			MessagePackHeader[] result = new MessagePackHeader[ 0x100 ];

			for ( int i = 0; i < 0x80; i++ )
			{
				result[ i ] = new MessagePackHeader( MessageType.PositiveFixNum, i );
			}
			for ( int i = 0x80; i < 0x90; i++ )
			{
				result[ i ] = new MessagePackHeader( MessageType.FixMap, i & 0x0f );
			}
			for ( int i = 0x90; i < 0xa0; i++ )
			{
				result[ i ] = new MessagePackHeader( MessageType.FixArray, i & 0x0f );
			}
			for ( int i = 0xa0; i < 0xc0; i++ )
			{
				result[ i ] = new MessagePackHeader( MessageType.FixRaw, i & 0x1f );
			}
			result[ 0xc0 ] = MessageType.Nil;
			// 0xc1 : Undefined
			result[ 0xc2 ] = MessageType.False;
			result[ 0xc3 ] = MessageType.True;
			// 0xc4-0xc9 : Undefined
			result[ 0xca ] = MessageType.Single; // 1
			result[ 0xcb ] = MessageType.Double;
			result[ 0xcc ] = MessageType.UInt8;
			result[ 0xcd ] = MessageType.UInt16;
			result[ 0xce ] = MessageType.UInt32;
			result[ 0xcf ] = MessageType.UInt64;
			result[ 0xd0 ] = MessageType.Int8;
			result[ 0xd1 ] = MessageType.Int16;
			result[ 0xd2 ] = MessageType.Int32;
			result[ 0xd3 ] = MessageType.Int64;
			// 0xd4-0xd9 : Undefined
			result[ 0xda ] = MessageType.Raw16;
			result[ 0xdb ] = MessageType.Raw32;
			result[ 0xdc ] = MessageType.Array16;
			result[ 0xdd ] = MessageType.Array32;
			result[ 0xde ] = MessageType.Map16;
			result[ 0xdf ] = MessageType.Map32;
			for ( int i = 0xe0; i < 0x100; i++ )
			{
				result[ i ] = new MessagePackHeader( MessageType.NegativeFixNum, i & 0x1f );
			}

			return result;
		}
		/// <summary>
		///		Create <see cref="MessagePackObject"/> which wraps appropriate empty collection.
		/// </summary>
		/// <param name="header">Header which has type information.</param>
		/// <returns><see cref="MessagePackObject"/> which wraps appropriate empty collection.</returns>
		private static MessagePackObject CreateEmptyCollection( MessagePackHeader header )
		{
			Contract.Assert( header.ValueOrLength == 0, header.ToString() );

			if ( ( header.Type & MessageType.IsArray ) != 0 )
			{
				return new MessagePackObject( _emptyArray, true );
			}
			else if ( ( header.Type & MessageType.IsMap ) != 0 )
			{
				return new MessagePackObject( _emptyMap, true );
			}
			else
			{
				return _emptyBinary.Value;
			}
		}
		/// <summary>
		///		Transit current stage to unpackContextCollection stage with cleanuping states.
		/// </summary>
		private void TransitToUnpackContextCollection()
		{
			this._next = this._unpackHeader;
			this._isInCollection = true;
			this._contextValueHeader = MessagePackHeader.Null;
			this._bytesBuffer = BytesBuffer.Null;
		}
		private bool UnpackHeader( Stream source, UnpackingMode unpackingMode, out MessagePackObject? result )
		{
			var b = source.ReadByte();
			if ( b < 0 )
			{
				result = null;
				return false;
			}

			this._readByteLength++;
			this._contextValueHeader = _headerArray[ b ];
			return _headerUnpackings[ b ]( this, b, source, unpackingMode, out result );
		}
				public static CollectionContextState Create( MessagePackHeader header, uint count )
				{
					if ( ( header.Type & MessageType.IsArray ) != 0 )
					{
						return new ArrayForgettingCollectionContextState( count );
					}
					else if ( ( header.Type & MessageType.IsMap ) != 0 )
					{
						return new MapForgettingCollectionContextState( count );
					}
					else
					{
						throw new InvalidMessagePackStreamException();
					}
				}