发布一个开源的C++后端开发库 - Jelly

FlyXxTt 2012-07-05 07:09:16
Jelly的目标是成为一个小巧易用的跨平台C++后端开发库,目前支持Windows和Linux两大平台(为什么没有Mac OS,这算跨平台?因为我没有Mac下的开发经历而且也没有条件,所以暂时不支持Mac,欢迎有兴趣的朋友来完成此部分),因为库中大量使用了如右值引用等c++0x的新语法,故Jelly不能在不支持c++0x的编译器上编译,目前支持VC10(MSVC2010)及其以上版本、GCC4.4.0及其以上版本(未来可能会支持ICC)。因为我不喜欢弄makefile等复杂的编译过程,源代码都是使用项目文件的形式发布的,要使用直接把项目包含进解决方案即可,Windows平台下提供的是MSVC项目文件,Linux平台下提供的是codeblocks的项目文件,如果你是使用的是其他开发环境,新建个项目把源代码包含进去即可。

本人能力有限,十分希望有兴趣的朋友能和我一起完善这个库,或者给我反馈bug,提交bug修改等。第一次开源代码,很多地方做的不完善,希望懂的朋友兄弟大哥大姐们多给些意见。目前Jelly还没有经过严格的测试及实际项目的检验,难免会有bug,在1.0版本发布前请不要用在实际项目中,否则你懂的。

详细内容见:http://www.ajexx.com/2012/07/jelly-open-source.html

下面是一些简单的使用例子,大家看代码应该比文字更有兴趣:


#include "jelly/include/jelly.h"

int main(int argc, char* argv[])
{
using namespace Jelly;
// Jelly库自己定义了一套数字类型,使用这套数字类型在不同的平台及编译器下都会具有相同的表现
// 如jint在32位及64位程序中都表示32位数;jlong在32位程序中表示32位数,64位程序中表示64位数
// jlonglong在32位及64位的程序中都表示64位数
// 如果要确定位数,可以使用jint32、juint32、jint64、juint64
// jbyte是只占用一个自己的类型,等同于char

// JConsole控制台输出,暂不支持输入功能
jconsole << "test code" << "dd" << 4877 << JByteArrayRef("JByteArrayRef") << 5588 << jendl;
jconsole("printf风格: %d\n", 1);
jconsole("printf风格: %d", 55) << " test" << jendl;
// 注意,printf风格的输出必须在最前面,比如以下方式是错误的
// jconsole << "test" << jconsole("printf风格: %d", 55) << jendl;

// JSpinlock
JSpinlock splk;
if (1) {
JSpinlockHelper lock(splk);
// do something
}

// 智能指针
if (1) {
JScopedPtr<jint> sp(new jint);
*sp = 2;
JSharedPtr<jint> ssp(new jint);
*ssp = 99;
JSharedPtr<jint> sssp = ssp;
}

// 随机数
JRandom rd;
jint tt = rd.nextInt(10, 100);
JByteArray ba;
rd.nextBytes(ba, 50);

// 逻辑处理器数量
jint ncpu = JMachine::CPU::logicalNumber();
// 是否支持SSE2
jbool issse2 = JMachine::CPU::hasSSE2();

// JVector[动态数组]
JVector<jint> jvector;
jvector << 55 << 88 << 66 << 77 << 1234;
JVector<jint> jvector2 = jvector.mid(3, -1);
jconsole << jvector << jendl;
jconsole << jvector2 << jendl;

// JLinkedList[双向链表]
JLinkedList<jint> jlinkedlist;
jlinkedlist << 1 << 2 << 3 << 4;
jlinkedlist.pop_front();
jconsole << jlinkedlist << jendl;

// JList[不要被名字迷惑,它不是链表,但是通常情况下,它是比JVector以及JLinkedList更好的选择]
// JList内部会根据所存储类型的长度来选择存储方式,对于小于指针长度的数据直接存储,对于大于指针
// 长度的数据会存储其指针,它具有更好的扩容及头尾插入性能
JList<jint> jlist;
jlist << 0 << 1 << 2 << 3 << 4 << 5;
jlist[0] = 99;
jconsole << jlist << jendl;

// JMap[内部使用红黑树,查找性能稳定O(logN)]
JMap<jint, jint> jmap;
jmap.insert(11, 22);
jmap.insert(22, 33);
jmap.insert(33, 44);
jconsole << jmap << jendl;
jconsole << "jmap find 22 value is : " << jmap.value(22) << jendl;

// JHash[hash表理想复杂度为O(1),最坏情况为O(n)]
JHash<jint, jint> jhash;
jhash.insert(11, 22);
jhash.insert(22, 33);
jhash.insert(33, 44);
jconsole << jhash << jendl;
jconsole << "jhash find 22 value is : " << jhash.value(22) << jendl;

// JSet[内部有两套引擎,可以使用hash表或者红黑树,默认为hash表]
JSet<jint> jset1;
jset1 << 55 << 88 << 99 << 0;
JSet<jint> jset2;
jset2 << 77 << 88 << 99 << 44;
jconsole << "jset and :" << (jset1 & jset2) << jendl;
jconsole << "jset or :" << (jset1 | jset2) << jendl;
// JSet使用红黑树
JSet<jint, JSetEngineIsMap> jsetmap;

// JByteArray[支持所有字节数据,包括单字节字符串,它保证所有数据都是以0结尾]
// JByteArrayRef[内部只保存数据的引用,不会产生内存拷贝,如果能预知数据在对象生命期内不会被销毁,并且只需要读取,推荐使用它]
JByteArray data("abcdefghijk");
data += data;
const jbyte *pdata = data.constData();
JByteArrayRef middata = data.midRef(3, -1);
jconsole << middata << jendl;
jconsole << middata.toUpper() << jendl;
JByteArray numdata("333.987");
jdouble d = numdata.toDouble();
jconsole << d << jendl;

// 校验签名
JByteArray tdata("0123456789ABCDEF");
juint16 crc16 = JCrypto::crc16(tdata);
jconsole << "crc16 : " << crc16 << jendl;
juint32 crc32c = JCrypto::crc32c(tdata);
jconsole << "crc16c : " << crc32c << jendl;

jconsole << "md5 : " << JCrypto::md5(tdata).toHex() << jendl;
jconsole << "sha1 : " << JCrypto::sha1(tdata).toHex() << jendl;
jconsole << "sha224 : " << JCrypto::sha224(tdata).toHex() << jendl;
jconsole << "sha256 : " << JCrypto::sha256(tdata).toHex() << jendl;
jconsole << "sha384 : " << JCrypto::sha384(tdata).toHex() << jendl;
jconsole << "sha512 : " << JCrypto::sha512(tdata).toHex() << jendl;

// 容器排序
JList<jint> op;
op << 5 << 1 << 3 << 4 << 2;
jsort(op.begin(), op.end());
jconsole << op << jendl;

// foreach 遍历容器[foreach支持所有Jelly、Qt、stl的可遍历容器类,并且支持常规数组]
jint arry[5] = {1, 2, 3, 4, 5};
foreach (jint &fi, arry) {
jconsole << ++fi << " ";
}
jconsole << jendl;

JList<jint> jfr;
jfr << 1 << 2 << 3 << 4 << 5 << 6;
foreach (jint &fi, jfr) {
++fi;
}
jconsole << jfr << jendl;
return 0;
}
...全文
290 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
FlyXxTt 2012-07-06
  • 打赏
  • 举报
回复
求扩散啊
pathuang68 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

嘿嘿,做容器类是有深刻而合理的原因的,我博客里有写,在这儿帖出来吧:

为什么重复造轮子?因为手贱。内存容器是和STL的功能完全重叠,但是既然已经做了,使用它有什么好处呢?Jelly的容器内会提供比stl容器更易使用的功能,在之后的文章中会做说明,并且在Map和Hash容器的性能插入查询性能上是超过stl的,其它容器性能与gcc-stl相当。
[/Quote]

我是非常支持重复造轮子的人...
FlyXxTt 2012-07-05
  • 打赏
  • 举报
回复
嘿嘿,做容器类是有深刻而合理的原因的,我博客里有写,在这儿帖出来吧:

为什么重复造轮子?因为手贱。内存容器是和STL的功能完全重叠,但是既然已经做了,使用它有什么好处呢?Jelly的容器内会提供比stl容器更易使用的功能,在之后的文章中会做说明,并且在Map和Hash容器的性能插入查询性能上是超过stl的,其它容器性能与gcc-stl相当。
super_admi 2012-07-05
  • 打赏
  • 举报
回复
额。。。容器类就不用了吧。。。不是有boost了么
beckhanyan 2012-07-05
  • 打赏
  • 举报
回复
额。。。容器类就不用了吧。。。不是有stl了么
W170532934 2012-07-05
  • 打赏
  • 举报
回复
支持支持。
jixingzhong 2012-07-05
  • 打赏
  • 举报
回复
支持开源~

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧