首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-01-09 
发布一个开源的C++后端开发库Jelly的目标是成为一个小巧易用的跨平台C++后端开发库,目前支持Windows和Linu

发布一个开源的C++后端开发库
    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;
}


[解决办法]
支持开源~
[解决办法]
支持支持。
[解决办法]
额。。。容器类就不用了吧。。。不是有stl了么
[解决办法]
额。。。容器类就不用了吧。。。不是有boost了么
[解决办法]
引用:
嘿嘿,做容器类是有深刻而合理的原因的,我博客里有写,在这儿帖出来吧:

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


我是非常支持重复造轮子的人...

热点排行