??xml version="1.0" encoding="utf-8" standalone="yes"?>
#include "rb_tree.h"
void test()
{
rb_tree<int, int> ltree;
std::cout << "the tree is empty: " << (ltree.empty() ? "true" : "false") << std::endl;
for(int i = 0; i < 15; i++) {
ltree.insert(i, i);
}
ltree.show_tree();
}
int main(int argc, char* argv[])
{
test();
return 0;
}
http://www.shnenglu.com/Files/hdqqq/rb_tree.zip
]]>
]]>
于是写了(jin)个ie的右键菜单处?直接在ie里面存到文本文g里面
把下面的javascript存成一个htm文g
然后在注册表中添加下面的?br>HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\信息攉(&Q)
讄两个键?/p>
默认 D:\rocket\Download\pagehook.htm //卛_前存的htm文g,需要绝对\?br>contexts 243
可以了(jin),以后可以在ie里面攉你要的文本了(jin).
使用的时?先用鼠标选择你需要的文字,然后右键?信息攉"菜单,可以把选择的文?br>存储到c:\collect.txt 中了(jin).
ado装
前面讲了(jin)建立一个记录的l构和对variant数据l构q行转换,在这里?对ado接口q行装.微Y的ado数据操作接口是以com的Ş式发布的,在用import指o(h)对com的动态库q行导入之后,?x)在工程的输出目录下生成tlh和tli两个文g,tlh是于c和c++用于操作com接口的头文g,在其中声明了(jin)一?com接口和com对象?IID和CLSID,q有接口的属性和Ҏ(gu),都以c/c++可以用的形式做了(jin)转换,那个tli文g其实是tlh文g中声明的一些结构的成员函数的实?被tlh文g包含.在tlh文g?通过宏_COM_SMARTPTR_TYPEDEF用模板类_com_ptr_tҎ(gu)口进行了(jin)包装,
_COM_SMARTPTR_TYPEDEF是一个很奇怪的?最l生成的是一个以Ptrl尾的类?
_COM_SMARTPTR_TYPEDEF(Field15, __uuidof(Field15));
实际上生成的cȝ名称是Field15Ptrc? cd是_com_ptr_t<Field15, __uuidof(Field15)>
在我实现的模板类?没有打算在类的整个生命周期中拥有一个ADO接口的记录集成员或者或者ADOq接,我只打算在一些成员函C,通过局部变量来使用ADO接口.所以对adoq行?jin)部分的?
同时通过成员函数GetDbValue(_variant_t& field_value), 支持从_variant_t转换w封装的cd.
现在,可以用上面的数据cd构徏记录l构?/p>
typedef data_op_record_row< TYPELIST_2(DB_INT,DB_STRING) > my_DataRow;
在上面的my_DataRowcd?有两个成员Field0, Field1,cd分别?DB_INT,DB_STRING, 支持_variant_tcd转换.
当然,用wrapperҎ(gu)据进行封装在实际的用中毕竟有些ȝ(ch), 如数据必通过 Value() 函数来取?如果直接使用?int, std::string {类型作?记录l构的成?也可以实现_variant自动转换,但是需要在上一层的记录集类中加入相关的转换操作,实现h比较ȝ(ch),所以我q里选择?jin)对数据q行装.
本文中的代码在vc6下编译通过
需要的?loki for vc6, boost
一. 构造记录结?/p>
通常来说,数据集由一条条的记录组?记录下有字段,记录是数据操作的基本单元.照c++的习(fn)?最好是一条记录一个结?字段是q个l构的成?然后用列表或者vectorl合一下就是记录集?但是一条记录的字段是有可能变动?q好,有loki ?typelist.
上面是模板实现根据指定typelist,生成拥有相应成员的结?
typedef struct_mem< TYPELIST_6(DB_STRING, DB_STRING, DB_STRING, DB_STRING, DB_STRING, DB_STRING) > CustomerRow; 可以声明一个有6个成员的l构?
上面的代码用template的特化到?5个成员的l构,全部写出来的?重复而且ȝ(ch),所以用了(jin)宏来帮助生成.
最怪的?:操作W号,居然也可以用在函C.
(c ? show_1 : show_2)(100);
其实{同?/p>
if (c)
show_1(100);
else
show_2(100);
不过l了(jin)很多.
所以自己写?jin)一个windows下的cME序,自己Z个控制台工程(需支持mfc)?把下面的代码复制一下就可以?同时,新年快到?大?
# ## ## # ## # ####
###### ### ######### # # # #######
# # # ## ## # # ######## # ##
###### ####### ########## # # # # ## ##
# ## ## ## # ## ## # # #### ############
###### # ## ############### # ########## # ###
### ### ## ## ## #### # # # # ## ## ##
#### ## ## ## # ## ## ### ## ####
# ## # ## ## # ### ## # # ## ##
# ## ## ##
8 88 8 8 8 88
8888888888 88888888888 88 8 88 88888 88
8 8 888888888 8 8 8 8 8 88888888
8888 888888 8888888 888888888 8 8 8 8888
888 88 88 88 88888 8 8 8 888
88 8 888 8888 88 88 8 8 8 8888
8888 8 8888 888 88888888888888 88 88 888 8888 88
8 88 88 8 88888888 8888 88 888 8888 88
8 888 8 8 88 88 8888 8888 888 88 8888
88 88888888 8 8
使用方式
wbanner [-c 填充字符] [-f 字体名称] [-s 字体大小] 昄文本
/////////////////
include listing.inc
INCLUDELIB LIBCD
INCLUDELIB OLDNAMES
PUBLIC _main
PUBLIC szHelloWorld
EXTERN _printf:NEAR
CONST SEGMENT
szHelloWorld DB 'Hello World!', 0aH, 00H
CONST ENDS
_TEXT SEGMENT
_argc$ = 8
_argv$ = 12
_main PROC NEAR
push OFFSET FLAT:szHelloWorld
call _printf
add esp, 4
xor eax, eax
ret 0
_main ENDP
_TEXT ENDS
END
;~译命o(h)
;ml.exe /c /coff test.asm
;link /out:test.exe /subsystem:console kernel32.lib test.obj
在这一部分?/span> , 要讨论的?/span> Boost 库中?/span> Function 的有兛_?/span> , 于前面两不同的?/span> ,Boost 库的规模相对?/span> Loki ?/span> STL 来说 , 在规模上大了(jin)很多 , q篇文章中讨论的?/span> boost 中的 functor 部分 , 写的不好之处 , Ƣ迎提出意见 . 写作本文使用的是 Boost 1_33_1 版本 , 同时参考了(jin) Boost 文档?/span> function 部分的说?/span> .
写在前面
?/span> Boost ?/span> Function 功能?/span> , 用到?/span> Boost ?/span> Preprocessor, 在这部分?/span> Boost 提供的宏预处理功能是很强大的 , 主要的宏功能?/span> 重复生成 (BOOST_PP_REPEAT_FROM_TO), 条g判断 (BOOST_PP_IF), q接 (BOOST_PP_CAT), 数值比?/span> (BOOST_PP_GREATER), 参数枚D (BOOST_PP_ENUM_PARAMS) {?/span> , 使用q些?/span> , 可以按照自己的需要用宏生成模板类或者代?/span> , 实在是一个很有效而且很创新的功能 , 可以说把预处理器的功能用C(jin)d造极的地?/span> . 不过 , 代h(hun)是要花更多的旉在编译上 , 我有一?/span> 18000 行代码的工程 , 在一个头文g中用了(jin) Preprocessor 产生一些模板代码后 , ~译旉从原先的 4 分钟一下子升到?/span> 8 分多U?/span> ( 我的机器比较?/span> ), 最后不得不写了(jin)个功?/span> Proxy c?/span> , 隔绝 cpp 文g对该头文件的依赖关系才羃短了(jin)~译旉 .
TypeTraits typetraits 的功能是在给定一个数据类型后 , 通过 c++ 的模板能?/span> , 来取得这个关于这个数据类型的相关信息 . ?/span> Loki 库中 , 也提供了(jin) TypeTrait 功能 . 常用的有 判断是否为指?/span> , 判断是否为常?/span> , 判断是否为引?/span> , 判断是否为数值等 . 在创建模板类或者函数的时?/span> , 有时候需要根据模板参数的cdҎ(gu)板进行特?/span> , q是一个很重要的辅助功?/span> ,boost 中也?/span> typetrait 功能 , ?/span> functor 生成的过E中 , 也用了(jin)一?/span> typetrait 的功?/span> .
Boost 的的 Functor 的头文g位于 <boost/function.hpp> 文g?/span> , 有一个很重要的宏
BOOST_FUNCTION_MAX_ARGS 用于 定义 boost 的预处理器展开?/span> Functor 最多的参数个数 , ~省的定义ؓ(f)
#define BOOST_FUNCTION_MAX_ARGS 10
如果有需要扩?/span> Functor 的参C?/span> , 可以在包?/span> Boost Functor 头文件之?/span> , 自己定义q个宏的数?/span> , 但是 , 最多可以到 50, 过q个数值后 , 需要手工修?/span> <boost/function/detail/maybe_include.hpp> 中的代码 , ?/span> Functor 可以使用的参数再q行扩充 .
Boost ?/span> Functor 的展开
?/span> Boost 中用了(jin)预处理元~程提供的叠代头文g的功?/span> , 反复叠代 <boost/function/function_template.hpp>, 最l生成用所需要的模板c?/span>
boost::function
<
q回?/span>
(
参数
[,
参数
]?>,
用户可以使用~译器的
/P(
微Y
c++
~译?/span>
), -save-temps(gcc
~译?/span>
)
开查看宏展开后的文g
.
有关 STL ?/span> Loki 中的 Functor 的前面两位于我的另外一?/span> blog
http://blog.csdn.net/hdqqq/archive/2006/02/07/593877.aspx
http://blog.csdn.net/hdqqq/archive/2006/01/25/588348.aspx
## list_head.sh
ARR_NUM=1
if [ $# -lt $ARR_NUM ]
then
echo "使用方式:"
echo "$0 文g?
echo "文g? C/CPP/H 文g ?通配W?*.c(*.cpp)"
else
cat $@ | grep include | grep \# | sort | uniq | awk -Finclude '{ print $2 }' | tr -d \" | tr -d \' | tr -d \< | tr -d \> | sort | uniq | awk '{ print $1 }'
fi
exit 0
写篇文章ȝ一?/span> .
我编译的环境 :
1. VC6 + sp5
2. firefox ~译需要的辅助工具 wintools.zip
3. cygwin 环境
准备工作 :
1. 下蝲 firefox E序代码Q在 mozilla 的站点上可以下蝲刎ͼ我编译的?/span> firefox 1.5.0.6 版本
2. 下蝲~译需要的 wintools.zip 工具 ,1.73MB 大小 , 其中带有 glib ?/span> libidl ?/span> , 在下载解压羃?/span> , 建立一个环境变?/span> MOZ_TOOLS 到某个目?/span> , 然后q入解压~后?/span> windows 目录 , q行 install.bat 文g , 安装相关需要的文g .
3. 安装 cygwin 环境 , 一?/span> window 下的c?/span> unix q_ , q里需要注意的?/span> , 最新的 cygwin ?/span> , 安装?/span> make 版本?/span> 3.81 ?/span> , 而编?/span> firefox 需要的?/span> 3.80 版本?/span> make, 解决的方法是?/span> cygwin 的某?/span> ftp 镜像站点上去下一?/span> 3.80 版本的文?/span> , 安装?/span> cygwin 安装目录下的 /bin 目录下就可以?/span> .
其中~译 firefox 需要的基本工具
ash -- UNIX-like command line interpreter shell (Base category)
coreutils -- GNU core utilities (includes fileutils, install, sh-utils, and textutils) (Base category)
cvs -- concurrent versions system (Devel category)
diffutils -- file comparison utility (Base category)
findutils (Base category)
gawk -- pattern matching language (Base and Interpretors categories)
grep -- text search tool (Base category)
libiconv -- character set conversion (Devel category)
make 3.80 (not 3.81!) -- dependency analyzer for software builds (Devel category)
patchutils -- a small collection of programs that operate on patch files (Devel category)
perl -- a scripting language used to control parts of the build (Interpreters category)
sed -- a search and replace language (Base category)
unzip -- zip file extraction (Archive category)
zip -- zip file creation (Archive category)
可以?/span> cygwin 命o(h)H口中输入相兛_令检是否安装了(jin)相关的程?/span> ., 其实如果下蝲?/span> firefxo 源代码的?/span> , ?/span> cvs 中的都不是必ȝ .
4. 安装 vc6 + sp5, ~译 firefox 1.5.0.6, 推荐的是 vc6 ?/span> cpp ~译?/span> . ?/span> vs6 安装?/span> , ?x)自动设|相关的 path,include ?/span> lib 环境变量 . 有一个需要注意的?/span> , vc6 ?/span> link.exe ?/span> cygwin 中的 link.exe 是相同的名字 , Z(jin)避免在编译的时?/span> , 调用错误?/span> link 执行文g , 可以?/span> cygwin/bin 中的 link.exe 改名?/span> glink.exe 避免冲突 . Vs ?/span> sp5 补丁也需要打一?/span> , 否则 , 生成?/span> xpldl.exe(firefox 用来~译 idl 文g的工?/span> ) 在编?/span> idl q程中会(x)报错 .
5. 配置文g
在环境和~译工具准备好后 , 解压~?/span> firefox 的代?/span> , 然后?/span> firefox 代码目录?/span> mozilla 目录?/span> , 建立一个名?/span> .mozconfig 的文?/span> , q在其中~辑文本
. $topsrcdir/browser/config/mozconfig
ac_add_options --enable-optimize
ac_add_options --disable-debug
ac_add_options --enable-static
ac_add_options --disable-shared
ac_add_options --disable-test
开?/strong>
上面所有工作完成之?/span> , 启动 cygwin 命o(h)H口 , q入 firefox 代码?/span> mozilla 目录
输入 make –f client.mk build 命o(h)开始编?/span> , 一切顺利的?/span> , 几十分钟?/span> , ׃(x)有一?/span> firefox 的执行文件生成到 mozilla/dist/bin 目录?/span> .
需要注意的?/span> , 在生成一?/span> test 的模块的时?/span> , ?x)报一?/span> jsint cd未定?/span> , q个无关紧要 , 因ؓ(f) firefox 已经生成?/span> , q是一个测试模?/span> , 我的解决Ҏ(gu)?/span> , 打开那个出错的cpp文g,加入
#ifdef _MSCVER
typedef int int32;
#endif
然后再编译就可以?/span> , 所谓自动动?/span> , 丰衣食 , 有的时?/span> , 实在不行的话 , 需要把 firefox 的代码自己动手改一?/span> .
/*
Zlib 是常用的压羃?在很多^C使用,是用c和部分汇~完成的,提供的是Zc接口的用函?o:p>
?span lang="EN-US">zlib 的contrib中提供了(jin)三种Ziostream的用方?
在MFC?l常使用CFileq行文g的读写操?在这U时?如果想用Zlib的话,要么使用zlib自n
提供的操作函?span lang="EN-US">,要么使用zlib contrib中iostream操作?或者自己对zlibq行装.
所以我对zlibq行?jin)封?便于使用.
Filter 功能c?o:p>
zlib_compress_filter<int 压羃U别> 实现压羃功能c?Ҏ(gu)模板参数实现不同的压~程?
zlib_uncompress_filter<int > 实现解压功能c?模板参数Mؓ(f) 1
Filterc自w带?~冲? 可以存储处理后的数据,用户可以直接通过q两个Filtercd数据q行
压羃和解压羃操作.
Pipec?o:p>
Z(jin)和MFC中的CFilec进行配?Ҏ(gu)据进行处理后,把CFile作ؓ(f)最后接受数据的容器,cM?o:p>
Boost库中的Sink,提供?jin)一个模板实现的BufferPipe模板c?
template <typename filter,typename buffer_type, typename next_pipe> class BufferPipe;
模板参数:
filter 数据处理用filter
buffer_type ~冲cd
next_pipe 后面接的pipe,可以是CFile,用于最l写入磁?
Pipe后还可以接一个Pipe,可以象一个管子连接v?q且,以后通过扩充f(xi)ilter可以实现不同的数据操作功?
提供?jin)一个测试代?span lang="EN-US">
~译后一个对话框 四个 按钮
按钮1 ?c:\a.bmp 压羃?c:\b.cr 使用filter
按钮2 ?c:\b.cr 解压~ؓ(f) c:\c.bmp 使用filter
按钮3 ?c:\a.bmp 压羃?c:\d.cr 使用pipe功能
按钮4 ?c:\a.bmp 通过压羃和解压羃道, 存储?e.bmp应该和a.bmp相同,用于试道的连接功?
代码位置:
http://www.shnenglu.com/files/hdqqq/z_file.rar
~译需要的zlib 误行到该库的网站下?
q个文章实现的和boost中的filtercM的功?可以和MFC配合使用.
不:
fiter 使用?buf_holder写得比较_糙,以后有机?x)的?改进.
*/
?/p>
char char_array[] = {'a','b','c','d'};
int i;
for (i = 0; i < sizeof(char_array)/sizeof(char); i++) {
cout << char_array[i] << endl;
}
所以写?jin)个?取得数组的大?/p>
template <typename T>
T get_size(T value[]);
#define ASIZEOF(a) sizeof(a)/sizeof(get_size(a))
然后可以这样写?
for (i = 0; i < ASIZEOF(char_array); i++) {
cout << char_array[i] << endl;
}
但是~点是不能正确的分别传入的是一个指针类?q是一个类型的数组.
代码在vc6 ?devcpp 4.9 中测试通过