提交 a58da88c 编写于 作者: W wangguibao

20190211

上级 958a6db9
# Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License
cmake_minimum_required(VERSION 3.0)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
set(PADDLE_SERVING_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(PADDLE_SERVING_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
include(system)
project(paddle-serving CXX C)
message(STATUS "CXX compiler: ${CMAKE_CXX_COMPILER}, version: "
"${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
message(STATUS "C compiler: ${CMAKE_C_COMPILER}, version: "
"${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION}")
find_package(Git REQUIRED)
find_package(Threads REQUIRED)
include(simd)
# CMAKE_BUILD_TYPE
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel"
FORCE)
endif()
set(THIRD_PARTY_PATH "${CMAKE_BINARY_DIR}/third_party" CACHE STRING
"A path setting third party libraries download & build directories.")
set(FLUID_INSTALL_DIR "${CMAKE_BINARY_DIR}/fluid_install_dir" CACHE STRING
"A path setting fluid shared and static libraries")
set(FLUID_INFERENCE_INSTALL_DIR "${CMAKE_BINARY_DIR}/fluid_inference_install_dir" CACHE STRING
"A path setting fluid inference shared and static libraries")
set(THIRD_PARTY_BUILD_TYPE Release)
option(WITH_AVX "Compile PaddlePaddle with AVX intrinsics" ${AVX_FOUND})
option(WITH_MKL "Compile PaddlePaddle with MKL support." ${AVX_FOUND})
set(WITH_MKLML ${WITH_MKL})
if (NOT DEFINED WITH_MKLDNN)
if (WITH_MKL AND AVX2_FOUND)
set(WITH_MKLDNN ON)
else()
message(STATUS "Do not have AVX2 intrinsics and disabled MKL-DNN")
set(WITH_MKLDNN OFF)
endif()
endif()
include(external/paddlepaddle)
include(external/brpc)
include(flags)
include(configure)
include(generic)
include_directories("${PADDLE_SERVING_SOURCE_DIR}")
set(EXTERNAL_LIBS
gflags
glog
protobuf
paddlepaddle
)
if(WITH_MKLML)
list(APPEND EXTERNAL_LIBS ${MKLML_IOMP_LIB})
endif()
if(WITH_MKLDNN)
list(APPEND EXTERNAL_LIBS ${MKLDNN_LIB})
endif()
add_subdirectory(bsl)
add_subdirectory(predictor)
K 25
svn:wc:ra_dav:version-url
V 54
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL
END
pool.h
K 25
svn:wc:ra_dav:version-url
V 61
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/pool.h
END
list.h
K 25
svn:wc:ra_dav:version-url
V 61
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/list.h
END
set.h
K 25
svn:wc:ra_dav:version-url
V 60
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/set.h
END
map.h
K 25
svn:wc:ra_dav:version-url
V 60
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/map.h
END
exception.h
K 25
svn:wc:ra_dav:version-url
V 66
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/exception.h
END
BCLOUD.lib2-64
K 25
svn:wc:ra_dav:version-url
V 69
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/BCLOUD.lib2-64
END
btree.h
K 25
svn:wc:ra_dav:version-url
V 62
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/btree.h
END
release.bcloud
K 25
svn:wc:ra_dav:version-url
V 69
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/release.bcloud
END
BCLOUD
K 25
svn:wc:ra_dav:version-url
V 61
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/BCLOUD
END
BinBuffer.h
K 25
svn:wc:ra_dav:version-url
V 66
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/BinBuffer.h
END
AutoBuffer.h
K 25
svn:wc:ra_dav:version-url
V 67
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/AutoBuffer.h
END
deque.h
K 25
svn:wc:ra_dav:version-url
V 62
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/deque.h
END
string.h
K 25
svn:wc:ra_dav:version-url
V 63
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/string.h
END
README
K 25
svn:wc:ra_dav:version-url
V 61
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/README
END
K 13
svn:mergeinfo
V 2205
/branches/bsl/libsrc_1-0-100_BRANCH:4469-4491
/branches/bsl/libsrc_1-0-103_BRANCH:5392-5393
/branches/bsl/libsrc_1-0-106_BRANCH:6096-6342
/branches/bsl/libsrc_1-0-108_BRANCH:6434-6556
/branches/bsl/libsrc_1-0-109_BRANCH:6782-6785
/branches/bsl/libsrc_1-0-110_BRANCH:7316-7352
/branches/bsl/libsrc_1-0-88_BRANCH:2098-3065
/branches/bsl/libsrc_4-0-63_BRANCH:9631-9656
/branches/bsl/libsrc_4-0-79-1_BRANCH:11639
/branches/bsl/libsrc_4-0-79_BRANCH:11413-11439
/branches/bsl/libsrc_5-0-26-1_BRANCH:14909-14923
/branches/bsl/libsrc_5-0-26-2_BRANCH:16597-16820
/branches/bsl/libsrc_5-0-26-3_BRANCH:16827-16828
/branches/bsl/libsrc_5-0-26_BRANCH:14840-14841
/branches/bsl/libsrc_5-0-44_BRANCH:16578-16581
/branches/bsl/libsrc_5-0-5_BRANCH:11733-11758
/branches/bsl/public_3-6-298_BRANCH:19711-19743
/tags/bsl/bsl_1-1-11-2_PD_BL:6557-6655
/tags/bsl/bsl_1-1-11-2_PD_BL_MAIN:6657-6781
/tags/bsl/bsl_1-1-12-0_PD_BL:6786-7221
/tags/bsl/bsl_1-1-12-0_PD_BL_MAIN:7223-7315
/tags/bsl/bsl_1-1-13-1_PD_BL:7353-7366
/tags/bsl/bsl_1-1-13-1_PD_BL_MAIN:7368-9630
/tags/bsl/bsl_1-1-14-0_PD_BL:9657-9666
/tags/bsl/bsl_1-1-14-0_PD_BL_MAIN:9668-11412
/tags/bsl/bsl_1-1-16-1_PD_BL:11440-11552
/tags/bsl/bsl_1-1-16-1_PD_BL_MAIN:11554-11638
/tags/bsl/bsl_1-1-17-0_PD_BL:11640-11642
/tags/bsl/bsl_1-1-17-0_PD_BL_MAIN:11644-11732
/tags/bsl/bsl_1-1-18-0_PD_BL:11759-11777
/tags/bsl/bsl_1-1-18-0_PD_BL_MAIN:11779-14839
/tags/bsl/bsl_1-1-19-0_PD_BL:14842-14884
/tags/bsl/bsl_1-1-19-0_PD_BL_MAIN:14886-14908
/tags/bsl/bsl_1-1-2-2_PD_BL_MAIN:2078-2097
/tags/bsl/bsl_1-1-20-1_PD_BL:14924-14928
/tags/bsl/bsl_1-1-20-1_PD_BL_MAIN:14930-16577
/tags/bsl/bsl_1-1-22-0_PD_BL:16582-16583
/tags/bsl/bsl_1-1-23-0_PD_BL:16587-16596
/tags/bsl/bsl_1-1-24-2_PD_BL:16821
/tags/bsl/bsl_1-1-24-2_PD_BL_MAIN:16823-16826
/tags/bsl/bsl_1-1-25-0_PD_BL:16829
/tags/bsl/bsl_1-1-25-0_PD_BL_MAIN:16831-19710
/tags/bsl/bsl_1-1-3-2_PD_BL:3066-3138
/tags/bsl/bsl_1-1-31-0_PD_BL:19744-19746
/tags/bsl/bsl_1-1-6-0_PD_BL_MAIN:4253-4468
/tags/bsl/bsl_1-1-7-0_PD_BL:4492-4690
/tags/bsl/bsl_1-1-7-0_PD_BL_MAIN:4692-5391
/tags/bsl/bsl_1-1-8-0_PD_BL:5394-6251
/tags/bsl/bsl_1-1-8-0_PD_BL_MAIN:5488-6095
/tags/bsl/bsl_1-1-9-3_PD_BL:6343-6431
/tags/bsl/bsl_1-1-9-3_PD_BL_MAIN:6433
END
10
dir
22176
https://svn.baidu.com/libsrc/tags/bsl/bsl_1-1-42-22055_PD_BL
https://svn.baidu.com/libsrc
2017-08-08T11:52:56.433210Z
22056
agile-ci
has-props
2ffda72e-4745-41d5-91b2-c6caaab82b42
test
dir
unittest
dir
archive
dir
ResourcePool
dir
set.h
file
2019-02-11T09:22:29.993635Z
37cd7ca70b6605eac54829a3b8717bef
2010-05-21T14:38:11.412168Z
114
svn
655
exception.h
file
2019-02-11T09:22:29.993635Z
5a7c47f789fa04a647a2043ae30f3b5d
2010-05-21T14:39:54.976906Z
142
svn
590
yperfbench
dir
BCLOUD.lib2-64
file
2019-02-11T09:22:29.994637Z
6c4e03738400b83dbd387a2ded67849c
2015-05-22T02:54:17.260835Z
21144
bcloud
596
check_cast
dir
btree.h
file
2019-02-11T09:22:29.994637Z
ae94019304cabfbb5ddc578436b6c506
2010-07-27T01:50:44.310693Z
2077
scmpf
165
release.bcloud
file
2019-02-11T09:22:29.994637Z
c62321a2fe9ad0ddaaf1af969eace55a
2015-06-05T02:38:08.325382Z
21271
bcloud
363
var
dir
BinBuffer.h
file
2019-02-11T09:22:29.994637Z
fc8882b806ca7f9570dc2091a4873a54
2011-01-20T12:15:06.825612Z
3791
scmpf
17096
AutoBuffer.h
file
2019-02-11T09:22:29.994637Z
d649afc0f57f3d48055fdf131d29ced0
2011-09-29T09:38:30.336867Z
6656
scmpf
27912
deque.h
file
2019-02-11T09:22:29.992635Z
63d7122d32d6071a453e07033ab104d1
2010-05-21T14:38:11.412168Z
114
svn
637
alloc
dir
string.h
file
2019-02-11T09:22:29.992635Z
46355160d344f73d0570cbed04c7bd66
2010-05-21T14:39:54.976906Z
142
svn
579
README
file
2019-02-11T09:22:29.992635Z
621eba6d29134529781bc6f94c8c4666
2010-05-21T14:36:29.299775Z
82
svn
189
exception
dir
pool.h
file
2019-02-11T09:22:29.993635Z
b78e73905656736fff92d22c2a671b81
2010-05-21T14:38:11.412168Z
114
svn
723
utils
dir
list.h
file
2019-02-11T09:22:29.993635Z
c17f5efdf3b9e5c87e5cb63e8b48be90
2010-05-21T14:38:11.412168Z
114
svn
628
cxxtest
dir
proctest
dir
map.h
file
2019-02-11T09:22:29.993635Z
af53c68eb17d88714cf3774486930be6
2010-05-21T14:38:11.412168Z
114
svn
662
containers
dir
BCLOUD
file
2019-02-11T09:22:29.993635Z
9c27f5bdadde5763da345fc9df173a96
2016-08-03T02:18:17.114676Z
21786
xingyongxu
1590
buffer
dir
pool
dir
此差异已折叠。
#edit-mode: -*- python -*-
#coding:gbk
#·.
WORKROOT('../../')
HEADERS('include/*', '$INC')
StaticLibrary('bsl', PreBuilt(True))
StaticLibrary('bsl_archive', PreBuilt(True))
StaticLibrary('bsl_buffer', PreBuilt(True))
StaticLibrary('bsl_check_cast', PreBuilt(True))
StaticLibrary('bsl_exception', PreBuilt(True))
StaticLibrary('bsl_pool', PreBuilt(True))
StaticLibrary('bsl_ResourcePool', PreBuilt(True))
StaticLibrary('bsl_utils', PreBuilt(True))
StaticLibrary('bsl_var', PreBuilt(True))
StaticLibrary('bsl_var_implement', PreBuilt(True))
StaticLibrary('bsl_var_utils', PreBuilt(True))
#edit-mode: -*- python -*-
#coding:gbk
WORKROOT('../../')
#platform, if not write PLATFORM('xxx') in BCLOUD file, default is 'redhat4u3'
#PLATFORM('centos4u3')
#gcc version, default 'gcc'
COMPILER('gcc482')
#Preprocessor flags.
#CPPFLAGS(r'-D_GNU_SOURCE -D__STDC_LIMIT_MACROS')
#CPPFLAGS(r'-DVERSION=\"%s\"' % SVN_LAST_CHANGED_REV())
#C flags.
#CFLAGS('-g -pipe -W -Wall -fPIC')
#C++ flags.
#CXXFLAGS(' -g -pipe -W -Wall -fPIC')
#IDL flags.
#IDLFLAGS('--compack')
#UBRPC flags.
#UBRPCFLAGS('--compack')
#-I path
#INCPATHS('. ./include $OUT/include')
#INCPATHS('../../')
#libs which need to link with
#LIBS('$OUT/lib/libbsl.a')
#LIBS('$OUT/so/libbsl.so')
#link flags
#LDFLAGS('-lpthread -lcrypto -lrt')
#CONFIGS("lib2-64/ullib@base")
#user_sources=GLOB("*.c *.cpp *.cc *.idl")
#release headers
HEADERS('*.h', '$INC/bsl')
#HEADERS('*.hpp', '$INC')
#HEADERS('include/*.h', '$INC')
#HEADERS('include/*.hpp', '$INC')
#release files except headers
OUTPUT('BCLOUD.lib2-64', '$OUT/')
#bin
#Application('bsl', Sources(user_sources))
#UT
#UTApplication('bsl', Sources(user_sources), UTArgs(''), UTOnServer(False))
#.a
#StaticLibrary('bsl', Sources(user_sources))
#StaticLibrary('bsl', PreBuilt(True))
#.so
#SharedLibrary('bsl', Sources(user_sources))
#SharedLibrary('bsl', PreBuilt(True))
#sub directory
Directory('utils')
Directory('alloc')
Directory('archive')
Directory('containers')
Directory('pool')
Directory('buffer')
Directory('exception')
Directory('check_cast')
Directory('ResourcePool')
Directory('var/interface')
Directory('var/utils')
Directory('var/implement')
/***************************************************************************
*
* Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved
* $Id: bsl_bin_buffer.h,v 1.0 2009/10/14 08:24:58 chenxm Exp $
*
**************************************************************************/
/**
* @file bsl_bin_buffer.h
* @author liaoshangbin(liaoshangbin@baidu.com)
* @date 2010/07/31 13:46:02 / 2010/10/15 modified by zhujianwei
* @version $Revision: 1.0 $
* @brief
*
**/
#ifndef __BSL_BIN_BUFFER_H_
#define __BSL_BIN_BUFFER_H_
#include <cstring>
#include <cstdarg>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include "bsl/utils/bsl_memcpy.h"
#include "bsl/pool/bsl_pool.h"
namespace bsl{
/**
* @brief 读入数据,并按二进制进行存储
*
* 该类的一大特点是不会抛出异常。在内存不足的时候,该类会截断字符串并置"被截断位"。
* BinBuffer对象通过字节对齐方式自行管理一片用于表示字符串的缓冲区,并提供方法追加各种类型对象。
* 若内存不足时,内存容量将翻倍,若申请新内存失败,将填满旧内存,
* 而且使truncated()方法返回true,ever_truncated()返回true。
*/
class BinBuffer{
public:
/**
* @brief 构造函数
*
* 可传入capacity参数指定预分配的内存空间。如capacity==0没有动态内存分配。
* 可传入pack参数指定默认字节对齐值,pack要求为2的整数幂并且<=MAX_PACK
* 否则_pack=DEFAULT_PACK
*
* 注:如内存分配失败不会抛出异常。其结果相当于以0为参数构造。
*
* @param [in] capacity : size_t
* @param [in] pack : size_t
* @see
* @author liaoshangbin
* @date 2010/7/29 12:05:10
**/
explicit BinBuffer( size_t cap = DEFAULT_CAPACITY, size_t pack = DEFAULT_PACK)
:_size(0), _capacity(cap), _pack(pack),
_truncated(false), _ever_truncated(false), _str(NULL), _mempool(NULL) {
if ( _capacity != 0 ) {
_str = static_cast<char *>(_mempool == NULL ?
malloc(_capacity) : _mempool->malloc(_capacity));
if ( _str ){
_str[0] = '\0';
}else{
_capacity = 0;
}
}
if(!(pack > 0 && pack <= DEFAULT_MAX_PACK && is_power_two(pack))){
_pack = DEFAULT_PACK;
}
}
/**
* @brief 使用allocator的构造函数
*
* 可传入capacity参数指定预分配的内存空间。如capacity==0没有动态内存分配。
* 可传入pool参数指定使用的内存池
* 可传入pack参数指定默认字节对齐值,pack要求为2的整数幂并且<=MAX_PACK
* 否则_pack=DEFAULT_PACK
*
* 注:如内存分配失败不会抛出异常。其结果相当于以0为参数构造。
*
* @param [in] pool : mempool&
* @param [in] capacity : size_t
* @param [in] pack : size_t
* @see
* @author
* @date 2010/7/29 12:06:16
**/
explicit BinBuffer(
mempool& pool,
size_t cap = DEFAULT_CAPACITY,
size_t pack = DEFAULT_PACK
)
:_size(0), _capacity(cap), _pack(pack),
_truncated(false), _ever_truncated(false), _str(NULL), _mempool(&pool) {
if ( _capacity != 0 ) {
_str = static_cast<char *>(_mempool == NULL ?
malloc(_capacity) : _mempool->malloc(_capacity));
if ( _str ){
_str[0] = '\0';
}else{
_capacity = 0;
}
}
if(!(pack > 0 && pack <= DEFAULT_MAX_PACK && is_power_two(pack))) {
_pack = DEFAULT_PACK;
}
}
/**
* @brief 把另一BinBuffer的内存转移到本BinBuffer(另一BinBuffer会被清空),O(1)复杂度
* 因为不同BinBuffer使用的内存池会有不同
* 先释放自身_str的内存,然后_str指向other._str浅复制字符串,
* 自身的_mempool指向other._mempool,这样_mempool还是处理_str这块内存
* 最后清空other._str,other成为空的BinBuffer还可以继续使用
*
* @param [in] other : BinBuffer&
* @return BinBuffer&
* @retval
* @see
* @author chenxm
* @date 2009/02/04 17:45:30
**/
BinBuffer& transfer_from ( BinBuffer& other ){
if ( &other != this ){
if ( _str ){
_mempool == NULL ? free( _str ) : _mempool->free( _str, _capacity);
}
_size = other._size;
_capacity = other._capacity;
_pack = other._pack;
_truncated = other._truncated;
_ever_truncated = other._ever_truncated;
_str = other._str;
_mempool = other._mempool;
other._size = 0;
other._capacity = 0;
other._pack = DEFAULT_PACK;
other._truncated= false;
other._ever_truncated = false;
other._str = NULL;
}
return *this;
}
/**
* @brief 交换两BinBuffer内容,O(1)复杂度
*
* @param [in] other : BinBuffer&
* @return void
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:14:15
**/
void swap( BinBuffer& other ){
std::swap( _str, other._str );
std::swap( _size, other._size );
std::swap( _capacity, other._capacity );
std::swap( _pack, other._pack );
std::swap( _truncated, other._truncated );
std::swap( _ever_truncated, other._ever_truncated );
std::swap( _mempool, other._mempool );
}
/**
* @brief 析构函数
*
* @see
* @author chenxm
* @date 2009/02/04 18:14:47
**/
~BinBuffer(){
if ( _str ){
_mempool == NULL ? free( _str ) : _mempool->free( _str, _capacity);
}
}
/**
* @brief BinBuffer长度
*
* @return size_t
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:14:56
**/
size_t size() const{
return _size;
}
/**
* @brief BinBuffer当前容量。保证容量>=长度。当容量不足时,容量会自动增长。
*
* @return size_t
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:15:23
**/
size_t capacity() const {
return _capacity;
}
/**
* @brief 返回BinBuffer是否为空
*
* @return bool
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:16:26
**/
bool empty() const {
return _size == 0;
}
/**
* @brief 返回BinBuffer是否为满
*
* @return bool
* @retval
* @see
* @author
* @date
**/
bool full() const {
return _size == _capacity;
}
/**
* @brief 返回BinBuffer最近一次操作是否发生了截断
*
* @return bool
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:16:58
**/
bool truncated() const {
return _truncated;
}
/**
* @brief 返回BinBuffer到目前为止是否发生了截断
*
* @return bool
* @retval
* @see
* @author liaoshangbin
* @date 2010/07/31 14:49:24
**/
bool ever_truncated() const {
return _ever_truncated;
}
/**
* @brief 返回BinBuffer内容的C风格字符串表示。O(1)复杂度
*
* @return const char*
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:17:26
**/
const char * data() const {
if ( _str ){
return _str;
}else{
return "";
}
}
/**
* @brief 清空内容
*
* @return void
* @retval
* @see
* @author liaoshangbin
* @date
**/
void clear() {
if ( _size ){
_str[0] = '\0';
}
_size = 0;
}
/**
* @brief 手动扩大内存容量
*
* @param [in] __capacity : size_t
* @return bool
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:18:34
**/
bool reserve( size_t cap ) {
if ( cap > _capacity ){
if ( cap < _capacity * 2 ){
cap = _capacity * 2;
}
char * _new = static_cast<char*>(_mempool == NULL ?
malloc(cap) :_mempool->malloc(cap));
if ( !_new ){
return false;
}
if ( _str ){
xmemcpy( _new, _str, _size );
_mempool == NULL ? free( _str ) : _mempool->free( _str, _capacity);
}
_str = _new;
_capacity = cap;
}
return true;
}
/**
* @brief 追加另一个BinBuffer,other按照min(other.get_pack(), this->_pack)字节对齐
*
* @param [in] other : const BinBuffer&
* @return BinBuffer& operator
* @retval
* @see
* @author chenxm
* @date 2009/09/27 16:49:30
**/
BinBuffer& operator << (const BinBuffer& other){
size_t pack = other.get_pack();
pack = pack < _pack ? pack : _pack;
_size = (_size + pack - 1) & (~(pack-1));
return push( other.data(), other.size() );
}
/**
* @brief 处理数值类型
* bool,signed char,unsigned char,short,unsigned short,int
* unsigned int,long int,unsigned long int,long long
* unsigned long lont,double,long double
*
* wchar_t:可输入任意的宽字符,包括'\0'
* char:可输入任意的字符,包括'\0'
*
* @param [in] value : _Tp
* @return BinBuffer& operator
* @retval
* @see
* @author liaoshangbin
* @data 2010/08/20 12:23:07
**/
template<typename _Tp>
BinBuffer& operator << ( _Tp value ) {
return push_bin_data( &value, sizeof(value) );
}
/**
* @brief 追加另一个BinBuffer,新的BinBuffer按照min(other.get_pack(), this->_pack)字节对齐
*
* @param [in] other : const BinBuffer&
* @return BinBuffer&
* @retval
* @see
* @author chenxm
* @date 2009/09/27 16:54:00
**/
BinBuffer& push(const BinBuffer& other){
size_t pack = other.get_pack();
pack = pack > _pack ? pack : _pack;
_size = (_size + pack - 1) & (~(pack-1));
return push( other.data(), other._size );
}
/**
* @brief 处理数值类型
* bool,signed char,unsigned char,short,unsigned short,int
* unsigned int,long int,unsigned long int,long long
* unsigned long lont,double,long double
*
* wchar_t:可输入任意的宽字符,包括'\0'
* char:可输入任意的字符,包括'\0'
*
* @param [in] value : _Tp
* @return BinBuffer& operator
* @retval
* @see
* @author liaoshangbin
* @data 2010/08/20 12:23:07
**/
template<typename _Tp>
BinBuffer& push( _Tp value ) {
return push_bin_data( &value, sizeof(value) );
}
/**
* @brief 追加多个任意字符
*
* @param [in] count : int
* @param [in] c : char
* @return BinBuffer&
* @retval
* @see
* @author chenxm / zhujianwei
* @date 2009/02/04 18:40:04 / mod. by zhjw at 2010/09/21
**/
BinBuffer& push( size_t count, char c){
if ( count > _capacity - _size ){ //full
count = (count <= size_t(-1) - _size) ? count : (size_t(-1) - _size); //limit the size
if( !reserve( _size + count ) ){
//reserve fail
count = _capacity - _size;
_truncated = true;
_ever_truncated = true;
}else{
_truncated = false;
}
}
if ( count ){
//str != NULL
memset( _str + _size, c, count );
_size += count;
}
return *this;
}
/**
* @brief 追加len长度的数据
*
* 调用者必须保证data指向的数据长度不大于len,否则行为未定义
*
* @param [in] data_ : const void*
* @param [in] len : size_t
* @return BinBuffer&
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:42:28
**/
BinBuffer& push(const void* data_, size_t len );
/**
* @brief 自定义字节对齐值
* 返回值为true表示设置成功,false表示设置失败
*
* @param [in] pack : size_t
* @return bool
* @retval
* @see
* @author liaoshangbin
* @data 2010/07/31 17:46:41
**/
bool set_pack( size_t pack ) {
if ( pack > 0 && pack <= DEFAULT_MAX_PACK && is_power_two( pack ) ) {
_pack = pack;
return true;
}
return false;
}
/**
* @brief 返回自定义字节对齐值
*
* @param
* @return size_t
* @retval
* @see
* @author liaoshangbin
* @data 2010/08/03 10:48:18
**/
size_t get_pack() const {
return _pack;
}
public:
/**
* @brief 默认容量大小
*/
static const size_t DEFAULT_CAPACITY = 64;
/**
* @brief 默认字节对齐值
*/
static const size_t DEFAULT_PACK = 4;
/**
* @brief 默认最大字节对齐值
*/
static const size_t DEFAULT_MAX_PACK = 64;
private:
/**
* @brief 复制构造函数
*/
BinBuffer( const BinBuffer& other );
/**
* @brief 复制赋值运算符
*/
BinBuffer& operator = ( const BinBuffer& );
/**
* @brief 判断一个整数是否为2的整数幂
*
* @param [in] n : int
* @return bool
* @retval
* @see
* @author liaoshangbin
* @data 2010/07/31 15:55:57
**/
inline bool is_power_two(size_t n) {
return (((n)&(n-1))==0);
}
/**
* @brief 数值型数据通过此函数插入到buffer中
*
* @param [in] data : const void*
* @param [in] len : size_t
* @return BinBuffer&
* @retval
* @see
* @author liaoshangbin
* @data 2010/07/31 17:50:09
**/
BinBuffer& push_bin_data( const void* data_, size_t len ) {
// 根据_pack计算_size的起始位置
size_t len_ = (len < _pack) ? len : _pack;
_size = (_size + len_ - 1) & (~(len_ - 1));
// push函数注意如果内存无法分配时调整_size大小
return push( data_, len );
}
/**
* @brief BinBuffer的长度
*/
size_t _size;
/**
* @brief BinBuffer的容量
*/
size_t _capacity;
/**
* @brief 自定义字节对齐值
*/
size_t _pack;
/**
* @brief 最近一次操作是否发生截断
*/
bool _truncated;
/**
* @brief 到目前为止是否发现截断
*/
bool _ever_truncated;
/**
* @brief BinBuffer的内部字符串缓冲区
*/
char * _str;
/**
* @brief 当前使用的内存池的指针
*
**/
mempool* _mempool;
};
} //namespace bsl;
#endif //__BSL_AUTO_BUFFER_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 */
32位编译比如加入如下参数: -D_XOPEN_SOURE=500 -D_GNU_SOURCE -ftemplate-depth-128
参考wiki
http://com.baidu.com/twiki/bin/view/Main/ComBSLIntroduct
demo 路径
cvspath: opencode/bsl_demo/
/* -*- c++ -*-
copy[write] by dirlt(dirtysalt1987@gmail.com) */
#ifndef _BSL_BTREE_H_
#define _BSL_BTREE_H_
#include "containers/btree/bsl_kv_btree.h"
#endif
/***************************************************************************
*
* Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved
* $Id: deque.h,v 1.2 2009/03/09 04:56:41 xiaowei Exp $
*
**************************************************************************/
/**
* @file bsldeque.h
* @author xiaowei(com@baidu.com)
* @date 2009/01/13 11:38:21
* @version $Revision: 1.2 $
* @brief
*
**/
#ifndef __BSLDEQUE_H_
#define __BSLDEQUE_H_
#include "containers/deque/bsl_deque.h"
#include "containers/deque/bsl_rwseque.h"
#endif //__BSLDEQUE_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */
/***************************************************************************
*
* Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved
* $Id: exception.h,v 1.2 2009/06/26 05:23:25 xiaowei Exp $
*
**************************************************************************/
/**
* @file exception.h
* @author chenxm(chenxiaoming@baidu.com)
* @date 2009/06/25 12:18:01
* @version $Revision: 1.2 $
* @brief
*
**/
#ifndef _BSL_EXCEPTION_H_
#define _BSL_EXCEPTION_H_
#include "exception/bsl_exception.h"
#endif //__EXCEPTION_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 */
/***************************************************************************
*
* Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved
* $Id: list.h,v 1.2 2009/03/09 04:56:41 xiaowei Exp $
*
**************************************************************************/
/**
* @file bsllist.h
* @author xiaowei(com@baidu.com)
* @date 2009/01/13 11:37:07
* @version $Revision: 1.2 $
* @brief
*
**/
#ifndef __BSLLIST_H_
#define __BSLLIST_H_
#include "containers/list/bsl_list.h"
#include "containers/slist/bsl_slist.h"
#endif //__BSLLIST_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */
/***************************************************************************
*
* Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved
* $Id: map.h,v 1.2 2009/03/09 04:56:41 xiaowei Exp $
*
**************************************************************************/
/**
* @file bslmap.h
* @author xiaowei(com@baidu.com)
* @date 2009/01/13 11:33:28
* @version $Revision: 1.2 $
* @brief
*
**/
#ifndef __BSLMAP_H_
#define __BSLMAP_H_
#include "containers/hash/bsl_hashmap.h"
#include "bsl/containers/hash/bsl_phashmap.h"
#include "bsl/containers/hash/bsl_readmap.h"
#endif //__BSLMAP_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */
/***************************************************************************
*
* Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved
* $Id: pool.h,v 1.2 2009/03/09 04:56:41 xiaowei Exp $
*
**************************************************************************/
/**
* @file bslpool.h
* @author xiaowei(com@baidu.com)
* @date 2009/01/13 11:40:37
* @version $Revision: 1.2 $
* @brief
*
**/
#ifndef __BSLPOOL_H_
#define __BSLPOOL_H_
#include "pool/bsl_pool.h"
#include "pool/bsl_poolalloc.h"
#include "pool/bsl_debugpool.h"
#include "pool/bsl_xcompool.h"
#include "pool/bsl_xmempool.h"
#include "pool/bsl_cachedpool.h"
#endif //__BSLPOOL_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */
mv BCLOUD.lib2-64 BCLOUD
find lib/ -name "libbsl_var*.a" -exec ar xo {} \;
ar cr lib/libbsl_var.a *.o
rm -f *.o
ar xo lib/libbsl_utils.a
ar xo lib/libbsl_archive.a
ar xo lib/libbsl_buffer.a
ar xo lib/libbsl_exception.a
ar xo lib/libbsl_check_cast.a
ar xo lib/libbsl_ResourcePool.a
ar xo lib/libbsl_pool.a
ar xo lib/libbsl_var.a
ar cr lib/libbsl.a *.o
rm -f *.o
/***************************************************************************
*
* Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved
* $Id: set.h,v 1.2 2009/03/09 04:56:41 xiaowei Exp $
*
**************************************************************************/
/**
* @file bslset.h
* @author xiaowei(com@baidu.com)
* @date 2009/01/13 11:35:10
* @version $Revision: 1.2 $
* @brief
*
**/
#ifndef __BSLSET_H_
#define __BSLSET_H_
#include "containers/hash/bsl_hashset.h"
#include "containers/hash/bsl_phashset.h"
#include "containers/hash/bsl_readset.h"
#endif //__BSLSET_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */
/***************************************************************************
*
* Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved
* $Id: string.h,v 1.2 2009/06/26 05:23:25 xiaowei Exp $
*
**************************************************************************/
/**
* @file string.h
* @author chenxm(chenxiaoming@baidu.com)
* @date 2009/06/25 12:20:00
* @version $Revision: 1.2 $
* @brief
*
**/
#ifndef _BSL_STRING_H_
#define _BSL_STRING_H_
#include "containers/string/bsl_string.h"
#endif //__STRING_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 */
此差异已折叠。
#edit-mode: -*- python -*-
#coding:gbk
WORKROOT('../../')
#platform, if not write PLATFORM('xxx') in BCLOUD file, default is 'redhat4u3'
#PLATFORM('centos4u3')
#gcc version, default 'gcc'
COMPILER('gcc482')
#Preprocessor flags.
#CPPFLAGS(r'-D_GNU_SOURCE -D__STDC_LIMIT_MACROS')
#CPPFLAGS(r'-DVERSION=\"%s\"' % SVN_LAST_CHANGED_REV())
#C flags.
#CFLAGS('-g -pipe -W -Wall -fPIC')
#C++ flags.
#CXXFLAGS(' -g -pipe -W -Wall -fPIC')
#IDL flags.
#IDLFLAGS('--compack')
#UBRPC flags.
#UBRPCFLAGS('--compack')
#-I path
#INCPATHS('. ./include $OUT/include')
#INCPATHS('../../')
#libs which need to link with
#LIBS('$OUT/lib/libbsl.a')
#LIBS('$OUT/so/libbsl.so')
#link flags
#LDFLAGS('-lpthread -lcrypto -lrt')
#CONFIGS("lib2-64/ullib@base")
#user_sources=GLOB("*.c *.cpp *.cc *.idl")
#release headers
HEADERS('*.h', '$INC/bsl')
#HEADERS('*.hpp', '$INC')
#HEADERS('include/*.h', '$INC')
#HEADERS('include/*.hpp', '$INC')
#release files except headers
OUTPUT('BCLOUD.lib2-64', '$OUT/')
#bin
#Application('bsl', Sources(user_sources))
#UT
#UTApplication('bsl', Sources(user_sources), UTArgs(''), UTOnServer(False))
#.a
#StaticLibrary('bsl', Sources(user_sources))
#StaticLibrary('bsl', PreBuilt(True))
#.so
#SharedLibrary('bsl', Sources(user_sources))
#SharedLibrary('bsl', PreBuilt(True))
#sub directory
Directory('utils')
Directory('alloc')
Directory('archive')
Directory('containers')
Directory('pool')
Directory('buffer')
Directory('exception')
Directory('check_cast')
Directory('ResourcePool')
Directory('var/interface')
Directory('var/utils')
Directory('var/implement')
#edit-mode: -*- python -*-
#coding:gbk
#·.
WORKROOT('../../')
HEADERS('include/*', '$INC')
StaticLibrary('bsl', PreBuilt(True))
StaticLibrary('bsl_archive', PreBuilt(True))
StaticLibrary('bsl_buffer', PreBuilt(True))
StaticLibrary('bsl_check_cast', PreBuilt(True))
StaticLibrary('bsl_exception', PreBuilt(True))
StaticLibrary('bsl_pool', PreBuilt(True))
StaticLibrary('bsl_ResourcePool', PreBuilt(True))
StaticLibrary('bsl_utils', PreBuilt(True))
StaticLibrary('bsl_var', PreBuilt(True))
StaticLibrary('bsl_var_implement', PreBuilt(True))
StaticLibrary('bsl_var_utils', PreBuilt(True))
/***************************************************************************
*
* Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved
* $Id: bsl_bin_buffer.h,v 1.0 2009/10/14 08:24:58 chenxm Exp $
*
**************************************************************************/
/**
* @file bsl_bin_buffer.h
* @author liaoshangbin(liaoshangbin@baidu.com)
* @date 2010/07/31 13:46:02 / 2010/10/15 modified by zhujianwei
* @version $Revision: 1.0 $
* @brief
*
**/
#ifndef __BSL_BIN_BUFFER_H_
#define __BSL_BIN_BUFFER_H_
#include <cstring>
#include <cstdarg>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include "bsl/utils/bsl_memcpy.h"
#include "bsl/pool/bsl_pool.h"
namespace bsl{
/**
* @brief 读入数据,并按二进制进行存储
*
* 该类的一大特点是不会抛出异常。在内存不足的时候,该类会截断字符串并置"被截断位"。
* BinBuffer对象通过字节对齐方式自行管理一片用于表示字符串的缓冲区,并提供方法追加各种类型对象。
* 若内存不足时,内存容量将翻倍,若申请新内存失败,将填满旧内存,
* 而且使truncated()方法返回true,ever_truncated()返回true。
*/
class BinBuffer{
public:
/**
* @brief 构造函数
*
* 可传入capacity参数指定预分配的内存空间。如capacity==0没有动态内存分配。
* 可传入pack参数指定默认字节对齐值,pack要求为2的整数幂并且<=MAX_PACK
* 否则_pack=DEFAULT_PACK
*
* 注:如内存分配失败不会抛出异常。其结果相当于以0为参数构造。
*
* @param [in] capacity : size_t
* @param [in] pack : size_t
* @see
* @author liaoshangbin
* @date 2010/7/29 12:05:10
**/
explicit BinBuffer( size_t cap = DEFAULT_CAPACITY, size_t pack = DEFAULT_PACK)
:_size(0), _capacity(cap), _pack(pack),
_truncated(false), _ever_truncated(false), _str(NULL), _mempool(NULL) {
if ( _capacity != 0 ) {
_str = static_cast<char *>(_mempool == NULL ?
malloc(_capacity) : _mempool->malloc(_capacity));
if ( _str ){
_str[0] = '\0';
}else{
_capacity = 0;
}
}
if(!(pack > 0 && pack <= DEFAULT_MAX_PACK && is_power_two(pack))){
_pack = DEFAULT_PACK;
}
}
/**
* @brief 使用allocator的构造函数
*
* 可传入capacity参数指定预分配的内存空间。如capacity==0没有动态内存分配。
* 可传入pool参数指定使用的内存池
* 可传入pack参数指定默认字节对齐值,pack要求为2的整数幂并且<=MAX_PACK
* 否则_pack=DEFAULT_PACK
*
* 注:如内存分配失败不会抛出异常。其结果相当于以0为参数构造。
*
* @param [in] pool : mempool&
* @param [in] capacity : size_t
* @param [in] pack : size_t
* @see
* @author
* @date 2010/7/29 12:06:16
**/
explicit BinBuffer(
mempool& pool,
size_t cap = DEFAULT_CAPACITY,
size_t pack = DEFAULT_PACK
)
:_size(0), _capacity(cap), _pack(pack),
_truncated(false), _ever_truncated(false), _str(NULL), _mempool(&pool) {
if ( _capacity != 0 ) {
_str = static_cast<char *>(_mempool == NULL ?
malloc(_capacity) : _mempool->malloc(_capacity));
if ( _str ){
_str[0] = '\0';
}else{
_capacity = 0;
}
}
if(!(pack > 0 && pack <= DEFAULT_MAX_PACK && is_power_two(pack))) {
_pack = DEFAULT_PACK;
}
}
/**
* @brief 把另一BinBuffer的内存转移到本BinBuffer(另一BinBuffer会被清空),O(1)复杂度
* 因为不同BinBuffer使用的内存池会有不同
* 先释放自身_str的内存,然后_str指向other._str浅复制字符串,
* 自身的_mempool指向other._mempool,这样_mempool还是处理_str这块内存
* 最后清空other._str,other成为空的BinBuffer还可以继续使用
*
* @param [in] other : BinBuffer&
* @return BinBuffer&
* @retval
* @see
* @author chenxm
* @date 2009/02/04 17:45:30
**/
BinBuffer& transfer_from ( BinBuffer& other ){
if ( &other != this ){
if ( _str ){
_mempool == NULL ? free( _str ) : _mempool->free( _str, _capacity);
}
_size = other._size;
_capacity = other._capacity;
_pack = other._pack;
_truncated = other._truncated;
_ever_truncated = other._ever_truncated;
_str = other._str;
_mempool = other._mempool;
other._size = 0;
other._capacity = 0;
other._pack = DEFAULT_PACK;
other._truncated= false;
other._ever_truncated = false;
other._str = NULL;
}
return *this;
}
/**
* @brief 交换两BinBuffer内容,O(1)复杂度
*
* @param [in] other : BinBuffer&
* @return void
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:14:15
**/
void swap( BinBuffer& other ){
std::swap( _str, other._str );
std::swap( _size, other._size );
std::swap( _capacity, other._capacity );
std::swap( _pack, other._pack );
std::swap( _truncated, other._truncated );
std::swap( _ever_truncated, other._ever_truncated );
std::swap( _mempool, other._mempool );
}
/**
* @brief 析构函数
*
* @see
* @author chenxm
* @date 2009/02/04 18:14:47
**/
~BinBuffer(){
if ( _str ){
_mempool == NULL ? free( _str ) : _mempool->free( _str, _capacity);
}
}
/**
* @brief BinBuffer长度
*
* @return size_t
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:14:56
**/
size_t size() const{
return _size;
}
/**
* @brief BinBuffer当前容量。保证容量>=长度。当容量不足时,容量会自动增长。
*
* @return size_t
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:15:23
**/
size_t capacity() const {
return _capacity;
}
/**
* @brief 返回BinBuffer是否为空
*
* @return bool
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:16:26
**/
bool empty() const {
return _size == 0;
}
/**
* @brief 返回BinBuffer是否为满
*
* @return bool
* @retval
* @see
* @author
* @date
**/
bool full() const {
return _size == _capacity;
}
/**
* @brief 返回BinBuffer最近一次操作是否发生了截断
*
* @return bool
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:16:58
**/
bool truncated() const {
return _truncated;
}
/**
* @brief 返回BinBuffer到目前为止是否发生了截断
*
* @return bool
* @retval
* @see
* @author liaoshangbin
* @date 2010/07/31 14:49:24
**/
bool ever_truncated() const {
return _ever_truncated;
}
/**
* @brief 返回BinBuffer内容的C风格字符串表示。O(1)复杂度
*
* @return const char*
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:17:26
**/
const char * data() const {
if ( _str ){
return _str;
}else{
return "";
}
}
/**
* @brief 清空内容
*
* @return void
* @retval
* @see
* @author liaoshangbin
* @date
**/
void clear() {
if ( _size ){
_str[0] = '\0';
}
_size = 0;
}
/**
* @brief 手动扩大内存容量
*
* @param [in] __capacity : size_t
* @return bool
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:18:34
**/
bool reserve( size_t cap ) {
if ( cap > _capacity ){
if ( cap < _capacity * 2 ){
cap = _capacity * 2;
}
char * _new = static_cast<char*>(_mempool == NULL ?
malloc(cap) :_mempool->malloc(cap));
if ( !_new ){
return false;
}
if ( _str ){
xmemcpy( _new, _str, _size );
_mempool == NULL ? free( _str ) : _mempool->free( _str, _capacity);
}
_str = _new;
_capacity = cap;
}
return true;
}
/**
* @brief 追加另一个BinBuffer,other按照min(other.get_pack(), this->_pack)字节对齐
*
* @param [in] other : const BinBuffer&
* @return BinBuffer& operator
* @retval
* @see
* @author chenxm
* @date 2009/09/27 16:49:30
**/
BinBuffer& operator << (const BinBuffer& other){
size_t pack = other.get_pack();
pack = pack < _pack ? pack : _pack;
_size = (_size + pack - 1) & (~(pack-1));
return push( other.data(), other.size() );
}
/**
* @brief 处理数值类型
* bool,signed char,unsigned char,short,unsigned short,int
* unsigned int,long int,unsigned long int,long long
* unsigned long lont,double,long double
*
* wchar_t:可输入任意的宽字符,包括'\0'
* char:可输入任意的字符,包括'\0'
*
* @param [in] value : _Tp
* @return BinBuffer& operator
* @retval
* @see
* @author liaoshangbin
* @data 2010/08/20 12:23:07
**/
template<typename _Tp>
BinBuffer& operator << ( _Tp value ) {
return push_bin_data( &value, sizeof(value) );
}
/**
* @brief 追加另一个BinBuffer,新的BinBuffer按照min(other.get_pack(), this->_pack)字节对齐
*
* @param [in] other : const BinBuffer&
* @return BinBuffer&
* @retval
* @see
* @author chenxm
* @date 2009/09/27 16:54:00
**/
BinBuffer& push(const BinBuffer& other){
size_t pack = other.get_pack();
pack = pack > _pack ? pack : _pack;
_size = (_size + pack - 1) & (~(pack-1));
return push( other.data(), other._size );
}
/**
* @brief 处理数值类型
* bool,signed char,unsigned char,short,unsigned short,int
* unsigned int,long int,unsigned long int,long long
* unsigned long lont,double,long double
*
* wchar_t:可输入任意的宽字符,包括'\0'
* char:可输入任意的字符,包括'\0'
*
* @param [in] value : _Tp
* @return BinBuffer& operator
* @retval
* @see
* @author liaoshangbin
* @data 2010/08/20 12:23:07
**/
template<typename _Tp>
BinBuffer& push( _Tp value ) {
return push_bin_data( &value, sizeof(value) );
}
/**
* @brief 追加多个任意字符
*
* @param [in] count : int
* @param [in] c : char
* @return BinBuffer&
* @retval
* @see
* @author chenxm / zhujianwei
* @date 2009/02/04 18:40:04 / mod. by zhjw at 2010/09/21
**/
BinBuffer& push( size_t count, char c){
if ( count > _capacity - _size ){ //full
count = (count <= size_t(-1) - _size) ? count : (size_t(-1) - _size); //limit the size
if( !reserve( _size + count ) ){
//reserve fail
count = _capacity - _size;
_truncated = true;
_ever_truncated = true;
}else{
_truncated = false;
}
}
if ( count ){
//str != NULL
memset( _str + _size, c, count );
_size += count;
}
return *this;
}
/**
* @brief 追加len长度的数据
*
* 调用者必须保证data指向的数据长度不大于len,否则行为未定义
*
* @param [in] data_ : const void*
* @param [in] len : size_t
* @return BinBuffer&
* @retval
* @see
* @author chenxm
* @date 2009/02/04 18:42:28
**/
BinBuffer& push(const void* data_, size_t len );
/**
* @brief 自定义字节对齐值
* 返回值为true表示设置成功,false表示设置失败
*
* @param [in] pack : size_t
* @return bool
* @retval
* @see
* @author liaoshangbin
* @data 2010/07/31 17:46:41
**/
bool set_pack( size_t pack ) {
if ( pack > 0 && pack <= DEFAULT_MAX_PACK && is_power_two( pack ) ) {
_pack = pack;
return true;
}
return false;
}
/**
* @brief 返回自定义字节对齐值
*
* @param
* @return size_t
* @retval
* @see
* @author liaoshangbin
* @data 2010/08/03 10:48:18
**/
size_t get_pack() const {
return _pack;
}
public:
/**
* @brief 默认容量大小
*/
static const size_t DEFAULT_CAPACITY = 64;
/**
* @brief 默认字节对齐值
*/
static const size_t DEFAULT_PACK = 4;
/**
* @brief 默认最大字节对齐值
*/
static const size_t DEFAULT_MAX_PACK = 64;
private:
/**
* @brief 复制构造函数
*/
BinBuffer( const BinBuffer& other );
/**
* @brief 复制赋值运算符
*/
BinBuffer& operator = ( const BinBuffer& );
/**
* @brief 判断一个整数是否为2的整数幂
*
* @param [in] n : int
* @return bool
* @retval
* @see
* @author liaoshangbin
* @data 2010/07/31 15:55:57
**/
inline bool is_power_two(size_t n) {
return (((n)&(n-1))==0);
}
/**
* @brief 数值型数据通过此函数插入到buffer中
*
* @param [in] data : const void*
* @param [in] len : size_t
* @return BinBuffer&
* @retval
* @see
* @author liaoshangbin
* @data 2010/07/31 17:50:09
**/
BinBuffer& push_bin_data( const void* data_, size_t len ) {
// 根据_pack计算_size的起始位置
size_t len_ = (len < _pack) ? len : _pack;
_size = (_size + len_ - 1) & (~(len_ - 1));
// push函数注意如果内存无法分配时调整_size大小
return push( data_, len );
}
/**
* @brief BinBuffer的长度
*/
size_t _size;
/**
* @brief BinBuffer的容量
*/
size_t _capacity;
/**
* @brief 自定义字节对齐值
*/
size_t _pack;
/**
* @brief 最近一次操作是否发生截断
*/
bool _truncated;
/**
* @brief 到目前为止是否发现截断
*/
bool _ever_truncated;
/**
* @brief BinBuffer的内部字符串缓冲区
*/
char * _str;
/**
* @brief 当前使用的内存池的指针
*
**/
mempool* _mempool;
};
} //namespace bsl;
#endif //__BSL_AUTO_BUFFER_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 */
add_subdirectory(utils)
add_subdirectory(alloc)
#add_subdirectory(archive)
#add_subdirectory(containers)
#add_subdirectory(pool)
#add_subdirectory(buffer)
#add_subdirectory(exception)
#add_subdirectory(check_cast)
#add_subdirectory(ResourcePool)
#add_subdirectory(var/interface)
#add_subdirectory(var/utils)
#add_subdirectory(var/implement)
32位编译比如加入如下参数: -D_XOPEN_SOURE=500 -D_GNU_SOURCE -ftemplate-depth-128
参考wiki
http://com.baidu.com/twiki/bin/view/Main/ComBSLIntroduct
demo 路径
cvspath: opencode/bsl_demo/
K 25
svn:wc:ra_dav:version-url
V 67
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/ResourcePool
END
ShallowCopyString.h
K 25
svn:wc:ra_dav:version-url
V 87
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/ResourcePool/ShallowCopyString.h
END
ResourcePool.cpp
K 25
svn:wc:ra_dav:version-url
V 84
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/ResourcePool/ResourcePool.cpp
END
ResourcePool.h
K 25
svn:wc:ra_dav:version-url
V 82
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/ResourcePool/ResourcePool.h
END
BCLOUD
K 25
svn:wc:ra_dav:version-url
V 74
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/ResourcePool/BCLOUD
END
bsl_wrappers.h
K 25
svn:wc:ra_dav:version-url
V 82
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/ResourcePool/bsl_wrappers.h
END
ShallowCopyString.cpp
K 25
svn:wc:ra_dav:version-url
V 89
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/ResourcePool/ShallowCopyString.cpp
END
Makefile
K 25
svn:wc:ra_dav:version-url
V 76
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/ResourcePool/Makefile
END
bsl_wrappers_config.h
K 25
svn:wc:ra_dav:version-url
V 89
/libsrc/!svn/ver/22056/tags/bsl/bsl_1-1-42-22055_PD_BL/ResourcePool/bsl_wrappers_config.h
END
10
dir
22176
https://svn.baidu.com/libsrc/tags/bsl/bsl_1-1-42-22055_PD_BL/ResourcePool
https://svn.baidu.com/libsrc
2016-06-23T03:48:38.716278Z
21755
xingyongxu
2ffda72e-4745-41d5-91b2-c6caaab82b42
ShallowCopyString.h
file
2019-02-11T09:22:28.591635Z
b886975c05691af722337a6b368bb567
2011-01-20T12:15:06.825612Z
3791
scmpf
12251
ResourcePool.cpp
file
2019-02-11T09:22:28.591635Z
570ea42f795ec54abdf21bfb98f4c632
2010-11-02T11:29:21.708254Z
3139
zhujianwei
6218
ResourcePool.h
file
2019-02-11T09:22:28.591635Z
24467439362a574e1bae4d90860aaad5
2010-11-02T11:29:21.708254Z
3139
zhujianwei
36990
BCLOUD
file
2019-02-11T09:22:28.592635Z
d7ce121466e8a66402c3788994ac865f
2016-06-23T03:48:38.716278Z
21755
xingyongxu
1530
bsl_wrappers.h
file
2019-02-11T09:22:28.592635Z
357c4caa225074cce0df9dbafff5b339
2010-05-21T14:38:11.412168Z
114
svn
10932
ShallowCopyString.cpp
file
2019-02-11T09:22:28.591635Z
cfd0913a6381fef8fe128c2f95d4553e
2011-01-20T12:15:06.825612Z
3791
scmpf
597
Makefile
file
2019-02-11T09:22:28.591635Z
05d7b524270dae8df98dacfeb53ea8b3
2010-05-21T14:39:16.051777Z
132
svn
1149
bsl_wrappers_config.h
file
2019-02-11T09:22:28.591635Z
7a67d205c65cca7556cacb148c966d11
2010-05-21T14:38:11.412168Z
114
svn
2346
#edit-mode: -*- python -*-
#coding:gbk
WORKROOT('../../../')
#platform, if not write PLATFORM('xxx') in BCLOUD file, default is 'redhat4u3'
#PLATFORM('centos4u3')
#gcc version, default 'gcc'
#COMPILER('gcc482')
#Preprocessor flags.
CPPFLAGS(r'-DVAR_DEBUG_FLAG -DBSL_VERSION=\"bsl1.1.0.0\" -DBSL_CVSTAG=\"bsl_1-1-0-0_PD_BL\" -DBSL_PROJECT_NAME=\"bsl\"')
#CPPFLAGS(r'-DVERSION=\"%s\"' % SVN_LAST_CHANGED_REV())
#C flags.
#CFLAGS('-g -pipe -W -Wall -fPIC')
#C++ flags.
CXXFLAGS(' -g -rdynamic -pipe -fPIC -finline-functions -fsigned-char -Wall -W -Wshadow -Wpointer-arith -Wcast-qual -Wwrite-strings -Wconversion -Winline -Woverloaded-virtual -Wsign-promo')
#IDL flags.
#IDLFLAGS('--compack')
#UBRPC flags.
#UBRPCFLAGS('--compack')
#-I path
INCPATHS('. ./include $OUT/include')
#INCPATHS('../../../')
#libs which need to link with
#LIBS('$OUT/lib/libexception.a')
#LIBS('$OUT/so/libexception.so')
#link flags
#LDFLAGS('-lpthread -lcrypto -lrt')
#CONFIGS("lib2-64/ullib@base")
user_sources=GLOB("*.cpp")
#release headers
HEADERS('bsl_wrappers.h bsl_wrappers_config.h', '$INC/bsl/ResourcePool')
HEADERS('*.h', '$INC/bsl/')
#HEADERS('*.hpp', '$INC')
#HEADERS('include/*.h', '$INC')
#HEADERS('include/*.hpp', '$INC')
#release files except headers
#OUTPUT('conf', '$OUT')
#bin
#Application('ResourcePool', Sources(user_sources))
#UT
#UTApplication('ResourcePool', Sources(user_sources), UTArgs(''), UTOnServer(False))
#.a
StaticLibrary('bsl_ResourcePool', Sources(user_sources))
#sub directory
#Directory('demo')
######################################################
# MAKEFILE TEMPLATE #
# AUTHOR: chenxm (chenxiaoming@baidu.com) #
# LAST UPDATE: Fri Jan 9 12:33:18 CST 2009 #
######################################################
####################################### CONFIGURATION #######################################
##### basic configuration #####
VAR_ROOT = ../var
include $(VAR_ROOT)/Makefile.env
##### build & test configuration #####
PROVIDE_ENTRANCES = ResourcePool.h ShallowCopyString.h
PROVIDE_HEADS = $(wildcard *.h)
PROVIDE_OBJECTS = ResourcePool.o ShallowCopyString.o
PROVIDE_LIB = bsl_ResourcePool
DEPEND_HEADS = $(PROVIDE_HEADS)
DEPEND_OBJECTS =
DEPEND_LIBS =
##### other #####
TAG_ROOT = $(VAR_ROOT)
##### OVERWRITE #####
OUTPUT_HEAD_PATH= $(BSL_ROOT)/output/include/bsl/ResourcePool
####################################### RULES #######################################
include $(VAR_ROOT)/Makefile.rules
####################################### SPECIAL RULES #######################################
check_cast_generated.h: check_cast.py
./$^ > $@
此差异已折叠。
/***************************************************************************
*
* Copyright (c) 2009 Baidu.com, Inc. All Rights Reserved
* $Id: ShallowCopyString.cpp,v 1.2 2009/06/15 06:29:04 chenxm Exp $
*
**************************************************************************/
/**
* @file ShallowCopyString.cpp
* @author chenxm(chenxiaoming@baidu.com)
* @date 2009/05/10 22:52:45
* @version $Revision: 1.2 $
* @brief
*
**/
#include "ShallowCopyString.h"
namespace bsl{
// const char ShallowCopyString::_S_EMPTY_CS[] = "";
}
/* vim: set ts=4 sw=4 sts=4 tw=100 */
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
BSL=../
OUTINC=$(BSL)/output/include/bsl/alloc
all :
rm -rf $(OUTINC)
mkdir -p $(OUTINC)
cp *.h $(OUTINC)
clean :
rm -rf $(OUTINC)
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
INCLUDE_DIRECTORIES(.)
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册