提交 d0ac317c 编写于 作者: W wangguibao

Remove dep to bsl

Change-Id: Ib9ef98c1242e0de7ac6a1931763398e782e3cfea
上级 8ce2e7b1
......@@ -96,7 +96,6 @@ if(WITH_MKLDNN)
list(APPEND EXTERNAL_LIBS ${MKLDNN_LIB})
endif()
add_subdirectory(bsl)
add_subdirectory(ullib)
add_subdirectory(configure)
add_subdirectory(mempool)
......
此差异已折叠。
#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_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/ && cp ${CMAKE_CURRENT_LIST_DIR}/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/utils && cp ${CMAKE_CURRENT_LIST_DIR}/utils/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/utils
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/alloc && cp ${CMAKE_CURRENT_LIST_DIR}/alloc/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/alloc
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/archive && cp ${CMAKE_CURRENT_LIST_DIR}/archive/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/archive
# COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/containers && cp ${CMAKE_CURRENT_LIST_DIR}/containers/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/containers
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/check_cast && cp ${CMAKE_CURRENT_LIST_DIR}/check_cast/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/check_cast
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/ResourcePool && cp ${CMAKE_CURRENT_LIST_DIR}/ResourcePool/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/ResourcePool
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/var/ && cp ${CMAKE_CURRENT_LIST_DIR}/var/utils/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/var/
COMMAND cp ${CMAKE_CURRENT_LIST_DIR}/var/interface/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/var/
COMMAND cp ${CMAKE_CURRENT_LIST_DIR}/var/implement/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/var/
COMMAND cp ${CMAKE_CURRENT_LIST_DIR}/check_cast/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl
COMMAND cp ${CMAKE_CURRENT_LIST_DIR}/ResourcePool/*.h ${CMAKE_CURRENT_BINARY_DIR}/include/bsl/
)
add_custom_target(copy_bsl_headers
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/include/)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
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)
add_library(bsl)
add_dependencies(bsl utils alloc archive containers pool buffer exception
check_cast ResourcePool interface var_utils implement)
target_link_libraries(bsl
buffer utils archive pool exception check_cast
ResourcePool var_utils 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/
#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')
FILE(GLOB ResourcePool_srcs ${CMAKE_CURRENT_LIST_DIR}/*.cpp)
add_library(ResourcePool ${ResourcePool_srcs})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
######################################################
# 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) 2008 Baidu.com, Inc. All Rights Reserved
* $Id: ResourcePool.cpp,v 1.5 2010/04/28 12:45:33 scmpf Exp $
*
**************************************************************************/
/**
* @file ResourcePool.cpp
* @author chenxm(chenxiaoming@baidu.com)
* @date 2008/08/06 11:14:09
* @version $Revision: 1.5 $
* @brief
*
**/
#include <cstdarg>
#include "bsl/ResourcePool.h"
namespace bsl{
/**
* @brief 清理所有受托管的资源
*
* @return void
* @retval
* @see
* @author chenxm
* @date 2009/02/04 15:34:03
**/
void ResourcePool::reset(){
for (block_list_node_t<alloc_object_info_t> *p_node = _p_alloc_object_list;
NULL != p_node;
p_node = p_node->p_next ){
for( alloc_object_info_t* p_item = p_node->data + p_node->current;
p_item >= p_node->data;
--p_item ){
p_item->destructor(p_item->p_object, _mempool);
}
}
_clear_info_list(_p_alloc_object_list);
for (block_list_node_t<alloc_array_info_t> *p_node = _p_alloc_array_list;
NULL != p_node;
p_node = p_node->p_next ){
for( alloc_array_info_t* p_item = p_node->data + p_node->current;
p_item >= p_node->data;
--p_item ){
p_item->destructor(p_item->begin, p_item->end, _mempool);
}
}
_clear_info_list(_p_alloc_array_list);
for (block_list_node_t<attach_object_info_t> *p_node = _p_attach_object_list;
NULL != p_node;
p_node = p_node->p_next ){
for( attach_object_info_t* p_item = p_node->data + p_node->current;
p_item >= p_node->data;
--p_item ){
p_item->destructor(p_item->p_object);
}
}
_clear_info_list(_p_attach_object_list);
for (block_list_node_t<attach_array_info_t> *p_node = _p_attach_array_list;
NULL != p_node;
p_node = p_node->p_next ){
for( attach_array_info_t* p_item = p_node->data + p_node->current;
p_item >= p_node->data;
--p_item ){
p_item->destructor(p_item->begin, p_item->end);
}
}
_clear_info_list(_p_attach_array_list);
}
const char * ResourcePool::_vprintf(
alloc_array_info_t& info,
size_t hint_capacity,
const char *format,
va_list ap
){
//参数检查
size_t size = hint_capacity + 1;
char* str = static_cast<char*>(_mempool.malloc(size));
if ( !str ){
throw bsl::BadAllocException()<<BSL_EARG<<"_mempool["<<&_mempool<<"] size["<<size<<"]";
}
//第一次尝试
va_list aq;
va_copy(aq, ap);
int len = vsnprintf( str, size, format, aq );
va_end(aq);
try{
if ( len < 0 ){
throw bsl::BadFormatStringException()<<BSL_EARG<<"format:"<<format;
}else if ( size_t(len) < size ){
//成功了
info.begin = str;
info.end = str + size;
info.destructor = _s_deallocate;
return str;
}else{
//第一次尝试失败,回滚str的分配
_mempool.free(str, size);
}
}catch(...){
//回滚str的分配
_mempool.free(str, size);
throw;
}
//第二次尝试
//len保存了真正需要的长度
//这次一定成功
return _vprintf( info, len, format, ap );
}
const char * ResourcePool::crcprintf(const char * format, ... ){
//以60为默认值去尝试
const size_t DEFAULT_STRING_SIZE = 60;
alloc_array_info_t &info = _push_info( _p_alloc_array_list );
va_list ap;
va_start(ap, format);
try{
const char * res = _vprintf( info, DEFAULT_STRING_SIZE, format, ap ); //throw
va_end(ap);
return res;
}catch(...){
va_end(ap);
//回滚info的分配
_pop_info( _p_alloc_array_list );
throw;
}
}
const char * ResourcePool::crcprintf_hint(size_t hint_capacity, const char * format, ... ){
alloc_array_info_t &info = _push_info( _p_alloc_array_list );
va_list ap;
va_start(ap, format);
try{
const char * res = _vprintf( info, hint_capacity, format, ap ); //throw
va_end(ap);
return res;
}catch(...){
va_end(ap);
//回滚info的分配
_pop_info( _p_alloc_array_list );
throw;
}
}
const char * ResourcePool::vcrcprintf(const char * format, va_list ap) {
//以60为默认值去尝试
const size_t DEFAULT_STRING_SIZE = 60;
alloc_array_info_t &info = _push_info( _p_alloc_array_list );
va_list aq;
va_copy( aq, ap );
try {
const char * res = _vprintf( info, DEFAULT_STRING_SIZE, format, aq ); // throw
va_end(aq);
return res;
} catch (...) {
va_end( aq );
//回滚info的分配
_pop_info( _p_alloc_array_list );
throw;
}
}
const char * ResourcePool::vcrcprintf_hint(
size_t hint_capacity,
const char * format,
va_list ap
) {
alloc_array_info_t &info = _push_info( _p_alloc_array_list );
va_list aq;
va_copy( aq, ap );
try {
const char * res = _vprintf( info, hint_capacity, format, aq ); // throw
va_end( aq );
return res;
} catch (...) {
va_end( aq );
//回滚info的分配
_pop_info( _p_alloc_array_list );
throw;
}
}
} //namespace bsl
/* vim: set ts=4 sw=4 sts=4 tw=100 */
此差异已折叠。
/***************************************************************************
*
* 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 */
/***************************************************************************
*
* Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved
* $Id: ShallowCopyString.h,v 1.3 2009/06/15 06:29:04 chenxm Exp $
*
**************************************************************************/
/**
* @file ShallowCopyString.h
* @author chenxm(chenxiaoming@baidu.com)
* @date 2008/08/08 09:08:18
* @version $Revision: 1.3 $
* @brief
*
**/
#ifndef __SHALLOWCOPYSTRING_H_
#define __SHALLOWCOPYSTRING_H_
#include <cstring>
#include <iostream>
#include "bsl/exception/bsl_exception.h"
#include "bsl/containers/string/bsl_string.h"
namespace bsl{
class ShallowCopyString{
public:
typedef char value_type;
typedef size_t size_type;
typedef long difference_type;
typedef value_type & reference;
typedef const reference const_reference;
typedef value_type * pointer;
typedef const pointer const_pointer;
typedef pointer iterator;
typedef const_pointer const_iterator;
#if __GNUC__ <= 2
typedef string_char_traits<value_type> traits_type;
#else
typedef std::char_traits<value_type> traits_type;
#endif
//ctors and dtors
/**
* @brief 默认构造函数
*
* 默认构造的ShallowCopyString表示空串。
* @param [in] str : const char*
* @see
* @author chenxm
* @date 2008/08/08 11:02:09
**/
ShallowCopyString()
: _str(_S_EMPTY_CS()), _length(0){}
/**
* @brief 隐式构造函数
*
* 该函数把C风格字符串转化为ShallowCopyString。
*
* 该方法时间复杂度为O(1),长度被懒惰求值。(直到size()方法第一次被调用)
*
* @param [in] str : const char*
* @see
* @author chenxm
* @date 2009/04/10 17:57:28
**/
ShallowCopyString( const char * str )
: _str(str), _length(npos) {
if ( NULL == str ){
throw NullPointerException()<<BSL_EARG<<"str is NULL";
}
}
/**
* @brief 用C风格字符串与指定的长度构造ShallowCopyString
*
* 注意:len必须与strlen(str)相等,否则行为未定义。
*
* @param [in] str : const char*
* @param [in] len : size_t
* @see
* @author chenxm
* @date 2009/04/14 21:28:49
**/
ShallowCopyString( const char * str, size_t len )
: _str(str), _length(len){
if ( NULL == str ){
throw NullPointerException()<<BSL_EARG;
}
if ( str[len] != '\0' ){
//给出的长度值有误?
throw bsl::BadArgumentException()<<BSL_EARG<<"wrong len:"<<len;
}
}
/**
* @brief 用使用任意allocator生成的bsl::basic_string构造ShallowCopyString
*
* @param [in] bsl::basic_string<char : const
* @param [in] bsl_str : allocator_t>&
* @return template<class allocator_t>
* @retval
* @see
* @author chenxm
* @date 2009/04/14 21:44:58
**/
template<class allocator_t>
ShallowCopyString( const bsl::basic_string<char, allocator_t>& bsl_str )
: _str(bsl_str.c_str()), _length(bsl_str.length()) {};
/**
* @brief 使用AutoBuffer构造ShallowCopyString
*
* @param [in] buf : const bsl::AutoBuffer&
* @see
* @author chenxm
* @date 2009/04/14 21:46:07
**/
ShallowCopyString( const bsl::AutoBuffer& buf )
: _str(buf.c_str()), _length(buf.size()){}
/**
* @brief 复制构造函数
*
* @param [in] sstr : const ShallowCopyString&
* @see
* @author chenxm
* @date 2009/04/14 21:46:22
**/
ShallowCopyString( const ShallowCopyString& sstr )
: _str(sstr._str), _length(sstr._length) {}
/**
* @brief 析构函数
*
* @see
* @author chenxm
* @date 2009/04/14 21:46:51
**/
~ShallowCopyString() {
//do nothing
}
void clear(){
_str = _S_EMPTY_CS();
_length = 0;
}
// getters
/**
* @brief 返回C风格字符串
*
* @return const char*
* @retval
* @see
* @author chenxm
* @date 2009/04/14 21:47:17
**/
const char * c_str() const {
return _str;
}
/**
* @brief 返回字符串长度
*
* 若字符串使用ShallowCopyString(const char *)构造并且本函数从未调用过,时间复杂为度O(strlen(this->c_str())),否则为O(1)
*
* @return size_t
* @retval
* @see
* @author chenxm
* @date 2009/04/14 21:55:58
**/
size_t size() const {
if ( _length == npos ){
const_cast<size_t&>(_length) = strlen(_str);
}
return _length;
}
/**
* @brief 返回size()
*
* @return size_t
* @retval
* @see
* @author chenxm
* @date 2009/04/14 21:59:39
**/
size_t length() const {
return size();
}
/**
* @brief 返回size()
*
* @return size_t
* @retval
* @see
* @author chenxm
* @date 2009/04/14 21:59:48
**/
size_t capacity() const {
return size();
}
/**
* @brief 返回第idx个字符
*
* 注:本函数不检查idx的合法性
* @param [in] idx : size_t
* @return char[]
* @retval
* @see
* @author chenxm
* @date 2009/04/14 22:00:06
**/
char operator []( size_t idx ) const {
return _str[idx];
}
/**
* @brief 返回第idx个字符
*
* 本函数检查idx合法性,若idx>=this->size(),抛出bsl::OutOfBoundException
* @param [in] idx : size_t
* @return char
* @retval
* @see
* @author chenxm
* @date 2009/04/14 22:00:50
**/
char at( size_t idx ) const {
if ( idx < this->size() ){
return _str[idx];
}
throw bsl::OutOfBoundException()<<BSL_EARG<<"idx:"<<idx<<" size():"<<size();
}
/**
* @brief 复制赋值
*
* 浅复制,时间复杂度为O(1)
* @param [in] sstr : const ShallowCopyString&
* @return ShallowCopyString& operator
* @retval
* @see
* @author chenxm
* @date 2009/04/14 22:02:05
**/
ShallowCopyString& operator = ( const ShallowCopyString& sstr ){
_str = sstr._str;
_length = sstr._length;
return *this;
}
ShallowCopyString& operator = ( const AutoBuffer& buf ){
_str = buf.c_str();
_length = buf.size();
return *this;
}
ShallowCopyString& operator = ( const bsl::string& str ){
_str = str.c_str();
_length = str.size();
return *this;
}
ShallowCopyString& operator = ( const char *cstr ){
if ( cstr == NULL ){
throw bsl::NullPointerException()<<BSL_EARG<<"cstr is NULL";
}
if ( cstr != _str ){
_str = cstr;
_length = npos;
}
return *this;
}
/**
* @brief 字典序比较
*
* 若本字符串字典序小于、等于、大于other,则返回值<0、=0、>0
* 若两字符串首字母不相同,或字符串地址相同,该函数时间复杂度为O(1)
*
*
* @param [in] other : const ShallowCopyString&
* @return int
* @retval
* @see
* @author chenxm
* @date 2009/04/14 22:02:31
**/
int compare( const ShallowCopyString& other ) const {
if ( _str[0] != other._str[0] ){
return traits_type::lt(_str[0], other._str[0]) ? -1 : 1;
}
if ( _str == other._str ){
return 0; //对于ShallowCopyString来说这是有可能的。
}
size_t min_size = std::min( size() , other.size() );
int ret = memcmp( _str, other._str, min_size );
if ( ret == 0 ){
if (_length > other._length) {
return 1;
} else if (_length == other._length) {
return 0;
} else {
return -1;
}
}else{
return ret;
}
}
//comparers
//因为const char *转换为ShallowCopyString是O(1)的,ShallowCopyString与一个随机的C字符串比较也是平均O(1)的(预判断第一字节),所以不专门对C字符串做比较函数了。
friend inline bool operator == (const ShallowCopyString& sstr1, const ShallowCopyString& sstr2){
return sstr1.compare( sstr2 ) == 0;
}
friend inline bool operator != (const ShallowCopyString& sstr1, const ShallowCopyString& sstr2){
return sstr1.compare( sstr2 ) != 0;
}
friend inline bool operator < (const ShallowCopyString& sstr1, const ShallowCopyString& sstr2){
return sstr1.compare( sstr2 ) < 0;
}
friend inline bool operator > (const ShallowCopyString& sstr1, const ShallowCopyString& sstr2){
return sstr1.compare( sstr2 ) > 0;
}
friend inline bool operator <= (const ShallowCopyString& sstr1, const ShallowCopyString& sstr2){
return sstr1.compare( sstr2 ) <= 0;
}
friend inline bool operator >= (const ShallowCopyString& sstr1, const ShallowCopyString& sstr2){
return sstr1.compare( sstr2 ) >= 0;
}
/**
* @brief 输出到输出流
*
* @param [in] os : std::ostream&
* @param [in] sstr : const ShallowCopyString&
* @return friend inline std::ostream& operator
* @retval
* @see
* @author chenxm
* @date 2009/04/14 22:14:58
**/
friend inline std::ostream& operator << ( std::ostream& os, const ShallowCopyString& sstr ){
return os << sstr._str ;
}
static const size_t npos = static_cast<size_t>(-1);
private:
const char * _str;
size_t _length;
static const char *_S_EMPTY_CS(){
static const char ret[] = "";
return ret;
};
};
} // namespace bsl
/**
* @brief 定义bsl::ShallowCopyString追加到bsl::AutoBuffer的运算符
*
* @param [in] buf : bsl::AutoBuffer&
* @param [in] str : bsl::ShallowCopyString&
* @return bsl::AutoBuffer& operator
* @retval
* @see
* @author chenxm
* @date 2009/05/09 01:59:57
**/
inline bsl::AutoBuffer& operator <<( bsl::AutoBuffer& buf, bsl::ShallowCopyString& str ){
return buf.push(str.c_str(), str.length());
}
#if __GNUC__ >=3
namespace __gnu_cxx{
#else
namespace std{
#endif
/**
* @brief 针对__gnu_cxx::hash编写的hasher
*
* 使用与const char*相同的hash算法。
*/
template<>
struct hash<bsl::ShallowCopyString>{
size_t operator()(const bsl::ShallowCopyString& str ) const {
return __stl_hash_string(str.c_str());
}
};
} // namespace __gnu_cxx/std
namespace bsl{
/**
* @brief 针对bsl::xhash编写的hasher
*
* 使用与const char*相同的hash算法。
*/
template<>
struct xhash<bsl::ShallowCopyString>{
size_t operator()(const bsl::ShallowCopyString& str ) const {
return __bsl_hash_string(str.c_str());
}
};
} // namespace bsl
#endif //__SHALLOWCOPYSTRING_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 */
/***************************************************************************
*
* Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved
* $Id: bsl_wrappers.h,v 1.2 2009/03/09 04:56:41 xiaowei Exp $
*
**************************************************************************/
/**
* @file bsl_wrappers.h
* @author chenxm(chenxiaoming@baidu.com)
* @date 2008/08/06 00:24:12
* @version $Revision: 1.2 $
* @brief 该文件定义了大量的函数包裹器,把各种具有C++特色的函数,如构造函数、析构函数、new运算符、delete运算符、模版函数等,包装成简单的C风格函数的类型。从而可以用作函数指针,或向后兼容C风格的函数接口
*
*
* “把一切龌龊的实现都包藏起来,从此C程序员也可以很开心地玩C++了”
*
* 注:不建议对C++不熟悉者修改本文件的代码
*
**/
#ifndef __BSL_WRAPPERS_H_
#define __BSL_WRAPPERS_H_
#include <memory>
#include <iostream>
#include <cstdio>
#include "bsl/ResourcePool/bsl_wrappers_config.h"
/**
* @brief 定义这个宏可以跳过POD的初始化(清零)
*
* 定义这个宏可以模仿malloc()和placement operator new的行为,并提高分配POD数组的速度
* 不定义这个宏可以模仿calloc(), 普通operator new,STL容器的行为。
*/
//#define BSL_CONFIG_SKIP_POD_INITIALIAZION
/**
* @brief 定义这个宏可以在构造对象数组时使用默认构造函数而非复制构造函数
*
* 定义这个宏可以模仿operator new的行为
* 不定义这个宏可以模仿STL容器的行为
*/
//#define BSL_CONFIG_DO_NOT_COPY_FOR_DEFAULT_CONSTRUCTION
namespace bsl{
/**
* @brief construct(void*)函数的辅助函数,当T类型拥有平凡的构造函数时被调用
*
* 注:内部使用,用户不应直接调用该函数。
*
* @param [in] p_object : void*
* @return void
* @retval
* @see
* @author chenxm
* @date 2008/08/07 10:48:10
**/
template<typename T>
inline void __construct_aux(void * p_object, __BSL_TRUE_TYPE__){
#ifndef BSL_CONFIG_SKIP_POD_INITIALIAZION
*static_cast<T*>(p_object) = 0;
#endif
}
/**
* @brief construct(void*)函数的辅助函数,当T类型拥有非平凡的构造函数时被调用
*
* 注:内部使用,用户不应直接调用该函数。
*
* @param [in/out] p_object : void*
* @return template<typename T> inline void
* @retval
* @see
* @author chenxm
* @date 2008/08/07 10:48:30
**/
template<typename T>
inline void __construct_aux(void * p_object, __BSL_FALSE_TYPE__){
::new(p_object) T();
}
/**
* @brief T类型默认构造函数的C风格包裹函数
*
*
*/
template<typename T>
inline void construct(void * p_object){
typedef __BSL_HAS_TRIVIAL_DEFAULT_CONSTRUCTOR(T) __is_POD;
__construct_aux<T>(p_object, __is_POD() );
}
/**
* @brief T类型单参数构造函数(特别地,当T_arg = T时,为复制构造函数)的C风格包裹函数
*
*
*/
template<typename T, typename T_arg>
inline void construct(void * p_object, const void * p_arg ){
new(p_object) T(*static_cast<const T_arg*>(p_arg));
}
/**
* @brief T类型析构函数的C风格包裹函数
*
* @param [in] p_object : void*
* @return void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:29:56
**/
template<typename T>
inline void destroy(void * p_object){
static_cast<T*>(p_object)->~T();
}
/**
* @brief construct_array(void*,void*)函数的辅助函数,当T类型拥有非平凡的构造函数时被调用
*
* 注:内部使用,用户不应直接调用该函数。
* @param [in] begin : void*
* @param [in] end : void*
* @return template<typename T> inline void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:29:47
**/
template<typename T>
inline void __construct_array_aux( void * begin, void * end, __BSL_FALSE_TYPE__){
#ifndef BSL_CONFIG_DO_NOT_COPY_FOR_DEFAULT_CONSTRUCTION
std::uninitialized_fill( static_cast<T*>(begin), static_cast<T*>(end), T() );
#else
::new(begin) T[static_cast<T*>(end) - static_cast<T*>(begin)];
#endif
}
/**
* @brief construct_array(void*,void*)函数的辅助函数,当T类型拥有平凡的构造函数时被调用
*
* 注:内部使用,用户不应直接调用该函数。
* @param [in] begin : void*
* @param [in] end : void*
* @return template<typename T> inline void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:31:31
**/
template<typename T>
inline void __construct_array_aux( void * begin, void * end, __BSL_TRUE_TYPE__){
#ifndef BSL_CONFIG_SKIP_POD_INITIALIAZION
memset(begin, 0, static_cast<char*>(end) - static_cast<char*>(begin) );
#endif
}
/**
* @brief 调用T类型默认构造函数构造对象数组的C风格包裹函数
*
* @param [in] begin : void* 对象数组的首址
* @param [in] end : void* 对象数组的尾址(=首址+数组大小)
* @return template<typename T> inline void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:31:36
**/
template<typename T>
inline void construct_array(void * begin, void * end ){
typedef __BSL_HAS_TRIVIAL_DEFAULT_CONSTRUCTOR(T) __is_POD;
__construct_array_aux<T>( begin, end, __is_POD() );
}
/**
* @brief 调用T类型单参数构造函数(特别地,当T_arg = T时,为复制构造函数)构造对象数组的C风格包裹函数,
*
* @param [in] begin : void* 对象数组的首址
* @param [in] end : void* 对象数组的尾址(=首址+数组大小)
* @return template<typename T> inline void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:31:36
**/
template<typename T, typename T_arg >
inline void construct_array(void * begin, void * end, const void * src ){
std::uninitialized_fill( static_cast<T *>(begin), static_cast<T *>(end), *static_cast<const T_arg *>(src) ); // this method will be specially optimized to POD;
}
/**
* @brief destroy_array(void *, void *)的辅助函数,当当前g++版本不支持type-traits,或未在bsl_wrappers_config.h中定义的时候使用
*
* @param [in] begin : T* T类型对象数组的首址
* @param [in] end : T* T类型对象数组的尾址(=首址+数组大小)
* @return void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:38:18
**/
template<typename T>
inline void default_destroy_array(T* begin, T* end){
while( begin != end ){
(begin ++) -> ~T();
}
}
/**
* @brief 销毁T类型对象数组的C风格包裹函数
*
* @param [in] begin : void* T类型对象数组的首址
* @param [in] end : void* T类型对象数组的尾址(=首址+数组大小)
* @return void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:42:11
**/
template<typename T>
inline void destroy_array( void * begin, void * end ){
__BSL_DESTROY(static_cast<T*>(begin), static_cast<T*>(end)); // this method will be specially optimized to the type which has trivial destructor;
}
/**
* @brief 通过Alloc类型空间分配器释放内存的C风格包裹函数
* 若该段内存不可由Alloc类对象释放或( end - begin ) % sizeof(Alloc::value_type) != 0,则结果未定义
* @param [in] begin : void* 被释放的内存块的首址
* @param [in] end : void* 被释放的内存块的尾址
* @return void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:43:49
**/
template<typename Alloc >
inline void deallocate( void * begin, void * end ){
typedef typename Alloc::value_type value_t;
value_t * vt_begin = static_cast<value_t *>(begin);
value_t * vt_end = static_cast<value_t *>(end);
Alloc().deallocate( vt_begin, vt_end - vt_begin );
}
/**
* @brief destroy(void*)和deallocate(void*)的组合
*
* @param [in] p_object : void*
* @return void
* @retval
* @see destroy(void*)
* @see deallocate(void*)
* @author chenxm
* @date 2008/08/12 20:46:56
**/
template<typename T, typename Alloc>
inline void destroy_and_deallocate( void * p_object ){
static_cast<T*>(p_object)->~T();
typedef typename Alloc::template rebind<T>::other T_Alloc;
T_Alloc().deallocate(static_cast<T *>(p_object), 1);
}
/**
* @brief destroy_array(void*, void*)和deallocate(void*)的组合
*
* @param [in] begin : void*
* @param [in] end : void*
* @return void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:48:04
**/
template<typename T, typename Alloc>
inline void destroy_and_deallocate_array( void * begin, void * end ){
__BSL_DESTROY(static_cast<T*>(begin), static_cast<T*>(end)); // this method will be specially optimized to the type which has trivial destructor;
typedef typename Alloc::template rebind<T>::other T_Alloc;
T_Alloc().deallocate(static_cast<T *>(begin), static_cast<T*>(end) - static_cast<T*>(begin) );
}
/**
* @brief ::operator delete的C风格包裹函数
*
* @param [in] object : void* 对象地址
* @return void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:49:02
**/
template<typename T>
inline void bsl_delete(void * object ){
delete static_cast<T*>(object);
}
/**
* @brief ::operator delete[]的C风格包裹函数
*
* @param [in] array : void* 对象数组首址
* @return void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:50:10
**/
template<typename T>
inline void bsl_delete_array( void * array ){
delete[] static_cast<T*>(array);
}
/**
* @brief 系统函数free(void*)的C风格包裹函数,提供调试支持
*
* 在BSL中,建议使用该函数,而非系统函数free(void*)
*
* @param [in] data : void*
* @return void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:51:32
**/
inline void bsl_free( void *data){
#ifdef BSL_DEBUG_FLAG
// 输出调试信息
std::cerr<<"memory "<<data<<" freeed"<<std::endl;
#endif
free(data);
}
/**
* @brief 系统函数fclose(FILE*)的C风格包裹函数(函数签名略有不同),提供调试支持
*
* 在BSL中,建议使用该函数,而非系统函数fclose(FILE*)
* @param [in] data : void*
* @return void
* @retval
* @see
* @author chenxm
* @date 2008/08/12 20:53:17
**/
inline void bsl_fclose( void *data){
#ifdef BSL_DEBUG_FLAG
// 输出调试信息
std::cerr<<"file "<<data<<" closed"<<std::endl;
#endif
fclose(static_cast<FILE*>(data));
}
} //namespace bsl
#endif //__BSL_WRAPPERS_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 */
/***************************************************************************
*
* Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved
* $Id: bsl_wrappers_config.h,v 1.2 2009/03/09 04:56:41 xiaowei Exp $
*
**************************************************************************/
/**
* @file bsl_wrappers_config.h
* @author chenxm(chenxiaoming@baidu.com)
* @date 2008/08/11 11:32:53
* @version $Revision: 1.2 $
* @brief
*
**/
#ifndef __BSL_WRAPPERS_CONFIG_H_
#define __BSL_WRAPPERS_CONFIG_H_
#if __GNUC__ == 2 && __GNUC_MINOR__ == 96
#define __BSL_TRUE_TYPE__ __true_type
#define __BSL_FALSE_TYPE__ __false_type
#define __BSL_HAS_TRIVIAL_DEFAULT_CONSTRUCTOR(_TYPE_) typename __type_traits<_TYPE_>::has_trivial_default_constructor
#define __BSL_DESTROY std::destroy
#elif __GNUC__ == 3 && __GNUC_MINOR__ == 4
#define __BSL_TRUE_TYPE__ __true_type
#define __BSL_FALSE_TYPE__ __false_type
#define __BSL_HAS_TRIVIAL_DEFAULT_CONSTRUCTOR(_TYPE_) typename __type_traits<_TYPE_>::has_trivial_default_constructor
#define __BSL_DESTROY std::_Destroy
#elif __GNUC__ >= 4
//enjoy std::tr1!
#include <tr1/type_traits>
#define __BSL_TRUE_TYPE__ std::tr1::true_type
#define __BSL_FALSE_TYPE__ std::tr1::false_type
#define __BSL_HAS_TRIVIAL_DEFAULT_CONSTRUCTOR(_TYPE_) typename std::tr1::has_trivial_constructor<_TYPE_>
#define __BSL_DESTROY std::_Destroy
#else //ʹص
#ifndef BSL_CONFIG_NO_TYPE_TRAITS_WARNIBSL
#warning type-traits support not implemented for the current g++ version. Default implementation is used. Add related configuration to bsl_wrappers_config.h to add type-traits support. Disable this wanring by defining marco BSL_CONFIG_NO_TYPE_TRAITS_WARNIBSL.
#endif //BSL_CONFIG_NO_TYPE_TRAITS_WARNIBSL
namespace bsl{
typedef struct __bsl_true_type__{} __bsl_true_type__;
typedef struct __bsl_false_type__{} __bsl_false_type__;
}
#define __BSL_TRUE_TYPE__ __bsl_true_type__
#define __BSL_FALSE_TYPE__ __bsl_false_type__
#define __BSL_HAS_TRIVIAL_DEFAULT_CONSTRUCTOR(_TYPE_) __BSL_FALSE_TYPE__
#define __BSL_DESTROY default_destroy_array
#endif // #if __GNUC__
#endif //__BSL_WRAPPERS_CONFIG_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/liballoc.a')
#LIBS('$OUT/so/liballoc.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/alloc')
#HEADERS('*.hpp', '$INC')
#HEADERS('include/*.h', '$INC')
#HEADERS('include/*.hpp', '$INC')
#release files except headers
#OUTPUT('conf', '$OUT')
#bin
#Application('alloc', Sources(user_sources))
#UT
#UTApplication('alloc', Sources(user_sources), UTArgs(''), UTOnServer(False))
#.a
#StaticLibrary('alloc', Sources(user_sources))
#StaticLibrary('alloc', PreBuilt(True))
#.so
#SharedLibrary('alloc', Sources(user_sources))
#SharedLibrary('alloc', PreBuilt(True))
#sub directory
#Directory('demo')
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
add_custom_target(alloc)
BSL=../
OUTINC=$(BSL)/output/include/bsl/alloc
all :
rm -rf $(OUTINC)
mkdir -p $(OUTINC)
cp *.h $(OUTINC)
clean :
rm -rf $(OUTINC)
/***************************************************************************
*
* Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved
* $Id: allocator.h,v 1.2 2008/12/15 09:56:59 xiaowei Exp $
*
**************************************************************************/
/**
* @file allocator.h
* @author xiaowei(com@baidu.com)
* @date 2008/08/22 17:41:08
* @version $Revision: 1.2 $
* @brief
*
**/
#ifndef __ALLOCATOR_H_
#define __ALLOCATOR_H_
#include <bsl/alloc/bsl_alloc.h>
#include <bsl/alloc/bsl_cpsalloc.h>
#include <bsl/alloc/bsl_sample_alloc.h>
#endif //__ALLOCATOR_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */
/********************************************************************
created: 2008/06/27
created: 27:6:2008 14:05
filename: xalloc.h
2010/10/15 modified by zhujianwei
author: xiaowei
mail: xiaowei@baidu.com
purpose:
*********************************************************************/
#ifndef BSL_ALLOC_H__
#define BSL_ALLOC_H__
#include <cstdio>
#include <cstdlib>
#include <new>
#include <algorithm>
#include <cstddef>
#include <stddef.h>
namespace bsl
{
/**
* @brief An allocator that uses malloc.
*
* This is precisely the allocator defined in the C++ Standard.
* - all allocation calls malloc
* - all deallocation calls free
*/
template < typename _Tp >
class bsl_alloc
{
public:
typedef size_t size_type;
#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 4
typedef std::ptrdiff_t difference_type;
#else
typedef ptrdiff_t difference_type;
#endif
typedef _Tp *pointer;
typedef const _Tp *const_pointer;
typedef _Tp & reference;
typedef const _Tp & const_reference;
typedef _Tp value_type;
typedef bsl_alloc<_Tp> pool_type;
template < typename _Tp1 >
struct rebind {
typedef bsl_alloc < _Tp1 > other;
};
static const bool recycle_space;// = false; //在alloc析构的时候,是否释放空间
static const bool thread_safe;// = true; //空间分配器是否线程安全
bsl_alloc() {
create();
}
bsl_alloc(const bsl_alloc &) {
create();
}
template < typename _Tp1 >
bsl_alloc(const bsl_alloc < _Tp1 > &) {
create();
}
~bsl_alloc() {
destroy();
}
pointer address(reference __x) const {
return &__x;
}
const_pointer address(const_reference __x) const {
return &__x;
}
//NB:__n is permitted to be 0. The C++ standard says nothing
// about what the return value is when __n == 0.
pointer allocate(size_type __n, const void * = 0) {
pointer __ret = static_cast < _Tp * >(malloc(__n * sizeof(_Tp)));
return __ret;
}
pointer reallocate(size_type __n, void * ptr = 0) {
if (ptr == NULL) {
return allocate(__n, ptr);
}
return static_cast < _Tp * >(realloc(ptr, __n * sizeof(_Tp)));
}
//__p is not permitted to be a null pointer.
void deallocate(pointer __p, size_type) {
free(static_cast < void *>(__p));
}
size_type max_size() const {
return size_t(-1) / sizeof(_Tp);
}
//_GLIBCXX_RESOLVE_LIB_DEFECTS
//402. wrong new expression in[some_] allocator: : construct
void construct(pointer __p, const _Tp & __val) {
::new(__p) value_type(__val);
}
void destroy(pointer __p) {
__p->~ _Tp();
}
int create() {
return 0;
}
int destroy() {
return 0;
}
void swap (bsl_alloc<_Tp> &) {
}
int merge(bsl_alloc<_Tp> &){
return 0;
}
value_type * getp(pointer __p) const { return __p; }
};
template < typename _Tp >
inline bool operator == (const bsl_alloc < _Tp > &, const bsl_alloc < _Tp > &) {
return true;
}
template < typename _Tp, class _Alloc2 >
inline bool operator == (const bsl_alloc <_Tp > &, const _Alloc2 &) {
return false;
}
template < typename _Tp >
inline bool operator != (const bsl_alloc < _Tp > &, const bsl_alloc < _Tp > &) {
return false;
}
template < typename _Tp, class _Alloc2 >
inline bool operator != (const bsl_alloc <_Tp > &, const _Alloc2 &) {
return true;
}
template <typename _Tp>
const bool bsl_alloc<_Tp>::recycle_space = false;
template <typename _Tp>
const bool bsl_alloc<_Tp>::thread_safe = true;
}
#endif // xalloc_h__
/***************************************************************************
*
* Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved
* $Id: bsl_cpsalloc.h,v 1.7 2008/12/15 09:56:59 xiaowei Exp $
*
**************************************************************************/
/**
* @file bsl_cpsalloc.h
* @author xiaowei(com@baidu.com)
* @date 2008/08/21 14:36:17 / 2010/10/19 modified by zhujianwei
* @version $Revision: 1.7 $
* @brief
*
**/
#ifndef __BSL_CPSALLOC_H_
#define __BSL_CPSALLOC_H_
#include <bsl/containers/deque/bsl_deque.h>
namespace bsl
{
/**
* @brief An allocator that uses malloc.
*
* This is precisely the allocator defined in the C++ Standard.
* - all allocation calls malloc
* - all deallocation calls free
*/
template < class _Alloc >
class bsl_cpsalloc
{
static const unsigned long DATAQSIZE = 1024UL * 16UL;
public:
typedef _Alloc _Base;
typedef typename _Base::pool_type pool_type;
typedef typename _Base::size_type size_type;
typedef typename _Base::difference_type difference_type;
typedef unsigned int pointer;
typedef const unsigned int const_pointer;
typedef typename _Base::reference reference;
typedef typename _Base::const_reference const_reference;
typedef typename _Base::value_type value_type;
typedef bsl_cpsalloc<_Alloc> _Self;
template <typename _Tp1>
struct rebind {
private:
typedef typename _Base::template rebind<_Tp1>::other other_alloc;
public:
typedef bsl_cpsalloc<other_alloc> other;
};
static const bool recycle_space;// = true; //在alloc析构的时候,是否释放空间
static const bool thread_safe;// = false; //空间分配器是否线程安全
union data_t
{
data_t *next;
char data[sizeof(value_type)];
};
bsl::deque<pointer> _free;
bsl::deque<data_t, DATAQSIZE> _deque;
bsl_cpsalloc() {
create();
}
bsl_cpsalloc(const bsl_cpsalloc &) {
create();
}
template < typename _Tp1 >
bsl_cpsalloc(const bsl_cpsalloc < _Tp1 > &) {
create();
}
~bsl_cpsalloc() {
destroy();
}
#if 0
pointer address(reference __x) const {
return &__x;
}
const_pointer address(const_reference __x) const {
return &__x;
}
#endif
//NB:__n is permitted to be 0. The C++ standard says nothing
// about what the return value is when __n == 0.
pointer allocate(size_type __n, const void * = 0) {
if (__n > 1) return 0;
if (_free.size() > 0) {
pointer p = _free.front();
_free.pop_front();
return p;
}
_deque.push_back(data_t());
return _deque.size();
}
//__p is not permitted to be a null pointer.
void deallocate(pointer __p, size_type) {
_free.push_back(__p);
}
size_type max_size() const {
return size_t(-1) / sizeof(value_type);
}
//_GLIBCXX_RESOLVE_LIB_DEFECTS
//402. wrong new expression in[some_] allocator: : construct
void construct(pointer __p, const value_type & __val) {
::new(getp(__p)) value_type(__val);
}
void destroy(pointer __p) {
getp(__p)->~ value_type();
}
int create() {
return 0;
}
int destroy() {
_free.destroy();
_deque.destroy();
return 0;
}
void swap (_Self &__self) {
_free.swap(__self._free);
_deque.swap(__self._deque);
}
value_type * getp(pointer __p) const {
return (value_type *)(_deque[__p-1].data);
}
};
template < typename _Tp >
inline bool operator == (const bsl_cpsalloc < _Tp > &, const bsl_cpsalloc < _Tp > &) {
return false;
}
template < typename _Tp, class _Alloc2 >
inline bool operator == (const bsl_cpsalloc <_Tp > &, const _Alloc2 &) {
return false;
}
template < typename _Tp >
inline bool operator != (const bsl_cpsalloc < _Tp > &, const bsl_cpsalloc < _Tp > &) {
return true;
}
template < typename _Tp, class _Alloc2 >
inline bool operator != (const bsl_cpsalloc <_Tp > &, const _Alloc2 &) {
return true;
}
template <class _Alloc>
const bool bsl_cpsalloc<_Alloc>::recycle_space = true;
template <class _Alloc>
const bool bsl_cpsalloc<_Alloc>::thread_safe = false;
}
#endif //__BSL_CPSALLOC_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */
/***************************************************************************
*
* Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved
* $Id: bsl_sample_alloc.h,v 1.5 2009/04/07 06:35:53 xiaowei Exp $
*
**************************************************************************/
/**
* @file bsl_sample_alloc.h
* @author xiaowei(com@baidu.com)
* @date 2008/07/12 14:24:41 / 2010/10/18 modified by zhujianwei
* @version $Revision: 1.5 $
* @brief
*
**/
/*
*
* 用来优化分定长块
*
*/
#ifndef __BSL_SAMPLE_ALLOC_H_
#define __BSL_SAMPLE_ALLOC_H_
#include <bsl/utils/bsl_utils.h>
namespace bsl
{
/*
* 这个是容器内部,如果需要优化大块内存分配
* 可以调用这个模版重新获取内存
* 属于容器内部数据
* 链表和hash可能用得到
*
*/
/**
* 只能管理内存
*/
template <class _Alloc, size_t _Items>
class bsl_sample_alloc
{
public:
typedef _Alloc _Base;
typedef typename _Base::pool_type pool_type;
typedef typename _Base::size_type size_type;
typedef typename _Base::difference_type difference_type;
typedef typename _Base::pointer pointer;
typedef typename _Base::const_pointer const_pointer;
typedef typename _Base::reference reference;
typedef typename _Base::const_reference const_reference;
typedef typename _Base::value_type value_type;
typedef bsl_sample_alloc<_Alloc, _Items> self;
union node_type
{
char value[sizeof(value_type)];
node_type *next;
};
struct large_type
{
large_type *next;
node_type data[_Items];
};
typedef typename _Base::template rebind<large_type>::other large_alloc;
template <typename _Tp1>
struct rebind {
private:
typedef typename _Base::template rebind<_Tp1>::other other_alloc;
public:
typedef bsl_sample_alloc<other_alloc, _Items> other;
};
static const bool recycle_space;// = true;
static const bool thread_safe;// = false;
public:
bsl_sample_alloc() {
create();
}
bsl_sample_alloc(const bsl_sample_alloc<_Alloc, _Items> & ) {
create();
}
~bsl_sample_alloc() {
destroy();
}
inline pointer allocate(size_type, void * = 0) {
//if (__n < 2) {
if (_freelst) {
node_type *tmp = _freelst;
_freelst = _freelst->next;
return (pointer)tmp->value;
}
if (_blknum == 0 || _lg == 0) {
large_type *lg = _alloc.allocate(1);
if (lg == 0) return 0;
_blknum = _Items;
lg->next = _lg;
_lg = lg;
}
return (pointer)_lg->data[--_blknum].value;
//}
//return _pool.allocate(__n, ptr);
return 0;
}
inline void deallocate(pointer ptr, size_type ) {
//if (__n < 2) {
((node_type *)ptr)->next = _freelst;
_freelst = (node_type *)ptr;
//} else {
// _pool.deallocate(ptr, __n);
//}
}
private:
large_alloc _alloc;
//pool_type _pool;
large_type * _lg;
node_type *_freelst;
size_type _blknum;
public:
void swap(self & __other) {
_alloc.swap(__other._alloc);
std::swap(_lg, __other._lg);
std::swap(_freelst, __other._freelst);
std::swap(_blknum, __other._blknum);
}
void merge( self & __other){
node_type *tmp = (node_type*)&_freelst;
while(tmp->next)
tmp = tmp->next;
if(__other._lg)
{
for(size_type i = 0; i < __other._blknum; i++)
{
tmp->next = &(__other._lg->data[i]);
tmp = tmp->next;
}
large_type *lg = (large_type*)&_lg;
while(lg->next)
lg = lg->next;
lg->next = __other._lg;
}
tmp->next = __other._freelst;
__other._lg = 0;
__other._blknum = 0;
__other._freelst = 0;
}
int create() {
_lg = 0;
_freelst = 0;
_blknum = 0;
_alloc.create();
//_pool.create();
return 0;
}
int destroy() {
large_type *ptr = _lg;
while (_lg) {
_lg = _lg->next;
free (ptr);
ptr = _lg;
}
_alloc.destroy();
//_pool.destroy();
return 0;
}
value_type * getp(pointer __p) const { return __p; }
};
template <class _Alloc, size_t _Items>
inline bool operator == (const bsl_sample_alloc < _Alloc, _Items > &,
const bsl_sample_alloc < _Alloc, _Items > &) {
return false;
}
template <class _Alloc, size_t _Items, class _Alloc2>
inline bool operator == (const bsl_sample_alloc <_Alloc, _Items> &, const _Alloc2 &) {
return false;
}
template < typename _Alloc, size_t _Items >
inline bool operator != (const bsl_sample_alloc < _Alloc, _Items > &,
const bsl_sample_alloc < _Alloc, _Items > &) {
return true;
}
template <class _Alloc, size_t _Items, class _Alloc2>
inline bool operator != (const bsl_sample_alloc <_Alloc, _Items> &, const _Alloc2 &) {
return true;
}
template <class _Alloc, size_t _Items>
const bool bsl_sample_alloc<_Alloc, _Items>::recycle_space = true;
template <class _Alloc, size_t _Items>
const bool bsl_sample_alloc<_Alloc, _Items>::thread_safe = false;
}
#endif //__BSL_SAMPLE_ALLOC_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(' -fsigned-char -Wall -W -pipe -Wno-unused-parameter -g -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/libutils.a')
#LIBS('$OUT/so/libutils.so')
#link flags
#LDFLAGS('-lpthread -lcrypto -lrt')
#CONFIGS("lib2-64/ullib@base")
user_sources=GLOB("*.cpp")
#release headers
HEADERS('*.h', '$INC/bsl/archive')
#HEADERS('*.hpp', '$INC')
#HEADERS('include/*.h', '$INC')
#HEADERS('include/*.hpp', '$INC')
#release files except headers
#OUTPUT('conf', '$OUT')
#bin
#Application('utils', Sources(user_sources))
#UT
#UTApplication('utils', Sources(user_sources), UTArgs(''), UTOnServer(False))
#.a
StaticLibrary('bsl_archive', Sources(user_sources))
#StaticLibrary('utils', PreBuilt(True))
#.so
#SharedLibrary('utils', Sources(user_sources))
#SharedLibrary('utils', PreBuilt(True))
#sub directory
#Directory('demo')
FILE(GLOB archive_srcs ${CMAKE_CURRENT_LIST_DIR}/*.cpp)
add_library(archive ${archive_srcs})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
CC=/usr/bin/g++
ifeq ($(MAC),64)
LIBPATH=$(WORKROOT)lib2-64
else
LIBPATH=$(WORKROOT)lib2
endif
BSL=../
OUTINC=$(BSL)/output/include/bsl/archive
OUTLIB=$(BSL)/output/lib
INCLUDES=-I$(BSL)/../
CFLAGS = -fsigned-char -Wall -W -pipe -Wno-unused-parameter -g -fPIC
LDFLAGS= -lpthread -lm
OBJS=bsl_filestream.o
TARGET=
LIB=libbsl_archive.a
all : $(TARGET) $(LIB) output
%.o : %.cpp
$(CC) $(CFLAGS) -c $< -o $@ $(INCLUDES)
$(LIB) : $(OBJS)
rm -f $@
ar cr $@ $(OBJS)
output : $(LIB)
rm -rf $(OUTINC)
mkdir -p $(OUTINC)
mkdir -p $(OUTLIB)
cp *.h $(OUTINC)
cp $(LIB) $(OUTLIB)
tags :
ctags -R *
clean:
rm -f $(OBJS) $(TARGET) $(LIB) test.o
rm -f -r $(OUTINC);
rm -f $(OUTLIB)/$(LIB)
/***************************************************************************
*
* Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved
* $Id: bsl_binarchive.h,v 1.5 2008/12/15 09:56:59 xiaowei Exp $
*
**************************************************************************/
/**
* @file bsl_binarchive.h
* @author xiaowei(com@baidu.com)
* @date 2008/07/25 17:00:04
* @version $Revision: 1.5 $
* @brief
*
**/
#ifndef __BSL_BINARCHIVE_H_
#define __BSL_BINARCHIVE_H_
#include <bsl/utils/bsl_debug.h>
#include <stdlib.h>
#include <string.h>
#include <bsl/archive/bsl_stream.h>
namespace bsl
{
class binarchive
{
protected:
bsl::stream &_fd;
public:
binarchive(bsl::stream & fd) : _fd(fd) {}
~binarchive() {}
/**
* @brief 从bsl stream 流中读取一个实体数据
*
* @param [out] tp : _Tp* 非NULL指针
* @return int 成功返回0,其他失败
* @retval tp传NULL 会core
* @see
* @note
* @author xiaowei
* @date 2008/11/04 10:17:39
**/
template <typename _Tp>
int read(_Tp *tp) {
_fd.start_trans();
int ret = bsl::deserialization(*this, *tp);
if (ret == 0) {
_fd.comit_trans();
} else {
_fd.drop_trans(false);
}
return ret;
}
/**
* @brief 往stream里面塞数据
*
* @param [in] tp : const _Tp& 需要写入的实体数据
* @return int 成功返回0,其他失败
* @retval
* @see
* @note
* @author xiaowei
* @date 2008/11/04 10:19:50
**/
template <typename _Tp>
int write(const _Tp & tp) {
_fd.start_trans();
int ret = bsl::serialization(*this, tp);
if (ret == 0) {
ret = _fd.comit_trans();
if (ret != 0) {
_fd.drop_trans(true);
}
} else {
_fd.drop_trans(true);
}
return ret;
}
public:
/**
* @brief 往stream里面写入size大的数据
*
* @param [in/out] dat : const void*
* @param [in/out] size : size_t
* @return 0 表示成功
* @retval
* @see
* @note
* @author xiaowei
* @date 2008/11/04 10:21:07
**/
int push(const void *dat, size_t size) {
//参数检查让底层去做
return _fd.write(dat, size);
}
/**
* @brief 往stream里面读数据
*
* @param [in/out] dat : void*
* @param [in/out] size : size_t
* @return int 0表示成功,其他失败
* @retval
* @see
* @note
* @author xiaowei
* @date 2008/11/04 10:23:02
**/
int pop(void *dat, size_t size) {
return _fd.read(dat, size);
}
};
}
#endif //__BSL_BINARCHIVE_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 */
此差异已折叠。
此差异已折叠。
此差异已折叠。
/***************************************************************************
*
* Copyright (c) 2008 Baidu.com, Inc. All Rights Reserved
* $Id: bsl_stream.h,v 1.2 2008/09/25 08:06:51 xiaowei Exp $
*
**************************************************************************/
/**
* @file bsl_stream.h
* @author xiaowei(com@baidu.com)
* @date 2008/09/01 14:25:20
* @version $Revision: 1.2 $
* @brief
*
**/
#ifndef __BSL_STREAM_H_
#define __BSL_STREAM_H_
namespace bsl
{
class stream
{
public:
virtual ~stream() {};
virtual int close() = 0;
virtual int write(const void *dat, size_t size) = 0;
virtual int read(void *dat, size_t size) = 0;
virtual int start_trans() = 0;
virtual int comit_trans() = 0;
virtual int drop_trans(bool) = 0;
virtual int flush() = 0;
};
};
#endif //__BSL_STREAM_H_
/* vim: set ts=4 sw=4 sts=4 tw=100 noet: */
/* -*- c++ -*-
copy[write] by dirlt(dirtysalt1987@gmail.com) */
#ifndef _BSL_BTREE_H_
#define _BSL_BTREE_H_
#include "containers/btree/bsl_kv_btree.h"
#endif
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/asm-i386)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/asm-x86_64)
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册