/*
* Copyright (c) 2005-2010 Tony Zhengjq <zhengjq@163.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
//tlv协议
#ifndef _TLV_H_
#define _TLV_H_
#pragma warning(disable: 4018 4244)
#ifndef int64_t
#define int64_t long long
#endif
#ifndef uint64_t
#define uint64_t unsigned long long
#endif
// host long 64 to network
static uint64_t hl64ton(uint64_t host)
{
uint64_t ret = 0;
unsigned long high,low;
low = host & 0xFFFFFFFF;
high = (host >> 32) & 0xFFFFFFFF;
low = htonl(low);
high = htonl(high);
ret = low;
ret <<= 32;
ret |= high;
return ret;
}
//network to host long 64
static uint64_t ntohl64(uint64_t host)
{
uint64_t ret = 0;
unsigned long high,low;
low = host & 0xFFFFFFFF;
high = (host >> 32) & 0xFFFFFFFF;
low = ntohl(low);
high = ntohl(high);
ret = low;
ret <<= 32;
ret |= high;
return ret;
}
namespace TLV
{
//分配内存部件
template <class _L>
class alloc_block
{
public:
alloc_block(void* v, _L n) :_n(n) { _v = malloc(_n + 1); memcpy(_v, v, _n); ((char*)_v)[_n] = 0;}
~alloc_block() { free(_v); }
static bool alloc() {return true;}
void* _v; _L _n;
};
//不分配内存部件
template <class _L>
class block