受CJSON库的启发,用C++实现解析Lua文件的库。

整个库大概800行代码,因为新鲜出炉,所以有些潜在问题尚未发现。

截图中包含使用例子。

以下接口清单:

     LuaNode();
     LuaNode(const char * bytes);
     LuaNode(const LuaNode & node);
     LuaNode(LuaNode && node);
     ~LuaNode();
     LuaNode &operator=(const LuaNode & node);
     LuaNode &operator=(LuaNode && node);

     template <class KeyT>
     LuaNode &at(const KeyT & key);

     template <class KeyT>
     void remove(const KeyT & key);

     void setValue(int value);
     void setValue(bool value);
     void setValue(double value);
     void setValue(size_t value);
     void setValue(const char * value);
     void setValue(const std::string & value);

     template <class ValueT, class KeyT>
     void insert(ValueT value, const KeyT & key);
     template <class KeyT>
     void insert(const std::string & value, const KeyT & key);
     template <class ValueT>
     void insert(ValueT value);
     void insert(LuaNode &&value, const std::string & key);
     void insert(LuaNode &&value, const char * const & key);
     void insert(LuaNode &&value, const llong_t & key);
     void insert(LuaNode &&value, const size_t & key = SIZET_MAX);

     std::string &asString();
     Array &asArray();
     const std::string &asString() const;
     const Array &asArray() const;
     double asDouble() const;
     float asFloat() const;
     bool asBool() const;
     int asInt() const;

     EnumLuaNodeType getType() const;
     std::string toString() const;

通过 insert 插入节点。

通过 remove 移除节点。

通过 at 访问节点。

通过 as* 系列接口,返回具体值。

通过 toString 格式化打印 Lua 源码。

可通过字符串构造 LuaNode 对象。(不支持注释)

本库也可以用于 网络传输协议。

其实现难点在于从字符串构造 LuaNode 对象。

这里涉及到一些简单的词法分析。

通过依次推进字符串指针,逐字解析含义。

存储结构用的 std::vector。

我曾考虑使用 std::map,

但考虑以下几个问题:

1,强类型语言有数字和字符串之分,如果使用 map,则需要 map<int>, map<string>。

2,Lua 的 table 如果 key 全部为连续数字,则 table 是 array,如果使用 map,顺序无法保证,并且随机访问开销大。

3,实际应用中,很少有大量的 hash 处理,相反,却有很多 array 要处理。

4,CJSON 的实现里,也是用 array 做存储。

编译环境 VS 2015,64bit。

该库没有使用任何第三方库,目测是可跨平台的。

吐个槽,C++实现起来比C复杂太多。

源码下载

LuaNode 开源库的更多相关文章

  1. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

    一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...

  2. Java下好用的开源库推荐

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文想介绍下自己在Java下做开发使用到的一些开源的优秀编程库,会不定 ...

  3. 第三方开源库和jar包的区别

    jar包和第三方开源库的根本区别在于,开源库的功能比jar包功能更强大,通过引入库项目可以访问java文件以及该开源库项目下的资源文件,例如图片,layout等文件 jar包中只能放class文件 引 ...

  4. 【转】用JitPack发布开源库时附加文档和源码

    来自:http://www.gcssloop.com/course/jitpack-sources-javadoc 用JitPack发布开源库时附加文档和源码 很早之前写过一篇用JitPack发布An ...

  5. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  6. GitHub上那些值得一试的JAVA开源库--转

    原文地址:http://www.jianshu.com/p/ad40e6dd3789 作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,S ...

  7. .NET蓝牙开源库:32feet.NET

    在用C#调用蓝牙编程一文中我留个小悬念就是:InTheHand.Net.Personal.dll是怎么来的?这篇文章来解答这个问题,InTheHand.Net.Personal.dll就是来源于今天要 ...

  8. Android Studio 简介及导入 jar 包和第三方开源库方[转]

    原文:http://blog.sina.com.cn/s/blog_693301190102v6au.html Android Studio 简介 几天前的晚上突然又想使用 Android Studi ...

  9. 快快快!27个提升效率的iOS开源库推荐

    文章来源:http://www.csdn.net/article/2015-07-21/2825264-27-ios-open-source-libraries/1 我热爱开源,更喜爱那些花费宝贵的业 ...

随机推荐

  1. JavaScript高级程序设计41.pdf

    事件对象 在触发DOM上某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息. DOM中的事件对象 兼容DOM的浏览器会将event对象传入到事件处理程序中,无论指定事件处理 ...

  2. javascrip中array使用

    一.测试数组长度是使用arr.length;(注:使用delete不会修改数组的length属性) 二.数组方法 1.join() Array.join()方法将数组所有元素都转化为字符串连接在一起, ...

  3. JAVA--对象锁

    在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制. 1.对象的锁 所有对象都自动含有单一的锁. JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数变为0.在任务(线程)第一次给对象加锁 ...

  4. php判断字符串是不是xml格式并解析

    最近遇到要要判断一个字符串是不是xml格式,网上找到一段代码,试了一下,完全可行 /**      * 解析XML格式的字符串      *      * @param string $str     ...

  5. [Python]网络爬虫(一):抓取网页的含义和URL基本构成

    一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个 ...

  6. Duff in Love - 588B(素数的判断)

    题目大意:如果一个数的所有因子都不是别的数的平方,那么这个数就是lovely数,现在给定一个数,求出这个数所有因子里面最大的lovely数 分析:很有意思的一道题,如果把这个数因子分解成最基本的苏因子 ...

  7. Java 抽象类与接口总结

    一.为什么要使用抽象类?有什么好处? 抽象类是通用接口.不同的子类可以用不同的方法表示此接口.通用接口建立起一种基本形式,以此表示所有子类的共同部分. 必须覆写父类abstract抽象的方法  含有抽 ...

  8. PHP判断变量是否为长整形的方法

    PHP判断变量是否为长整形的方法,可用于判断QQ号等,避免了int溢出的问题 <?php /** * 判断变量是否为长整数(int与整数float) * @param mixed $var * ...

  9. 部分 CM11 系统 Android 平板执行植物大战僵尸 2 黑屏的解决的方法

    原文 http://forum.xda-developers.com/showthread.php?t=2755197 部分 CM11 系统的 Android 平板(比如三星 GT-P5110 )执行 ...

  10. JavaEE SSH框架整合(三) struts2 异常、http错误状态码处理

    struts2的action可能出现訪问不到,或action报异常等情况,所以须要作一些处理,给用户一个友好的印象. 1. 异常处理  result声明在action中 <action name ...