template <typename Stream> bool ConnectionPacket::Serialize( Stream & stream )
    {
        ConnectionContext * context = (ConnectionContext*) stream.GetContext();

        assert( context );
        assert( context->magic == ConnectionContextMagic );
        assert( context->messageFactory );
        assert( context->connectionConfig );

        // ack system

        bool perfect_acks = Stream::IsWriting ? ( ack_bits == 0xFFFFFFFF ) : 0;

        serialize_bool( stream, perfect_acks );

        if ( !perfect_acks )
            serialize_bits( stream, ack_bits, 32 );
        else
            ack_bits = 0xFFFFFFFF;

        serialize_bits( stream, sequence, 16 );

        serialize_ack_relative( stream, sequence, ack );

        // channel entries

        const int numChannels = context->connectionConfig->numChannels;

        serialize_int( stream, numChannelEntries, 0, context->connectionConfig->numChannels );

#if YOJIMBO_VALIDATE_PACKET_BUDGET
        assert( stream.GetBitsProcessed() <= ConservativeConnectionPacketHeaderEstimate );
#endif // #if YOJIMBO_VALIDATE_PACKET_BUDGET

        if ( numChannelEntries > 0 )
        {
            if ( Stream::IsReading )
            {
                if ( !AllocateChannelData( *context->messageFactory, numChannelEntries ) )
                    return false;
            }

            for ( int i = 0; i < numChannelEntries; ++i )
            {
                if ( !channelEntry[i].SerializeInternal( stream, *m_messageFactory, context->connectionConfig->channelConfig, numChannels ) )
                    return false;
            }
        }

        return true;
    }
示例#2
0
void serialize_8bit(bool *b, uint8_t n) {
  serialize_bits(8, b, n);
}
示例#3
0
void serialize_64bit(bool *b, uint64_t n) {
  serialize_bits(64, b, n);
}