LuaNode 开源库

受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 开源库的更多相关文章
- 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~
一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...
- Java下好用的开源库推荐
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文想介绍下自己在Java下做开发使用到的一些开源的优秀编程库,会不定 ...
- 第三方开源库和jar包的区别
jar包和第三方开源库的根本区别在于,开源库的功能比jar包功能更强大,通过引入库项目可以访问java文件以及该开源库项目下的资源文件,例如图片,layout等文件 jar包中只能放class文件 引 ...
- 【转】用JitPack发布开源库时附加文档和源码
来自:http://www.gcssloop.com/course/jitpack-sources-javadoc 用JitPack发布开源库时附加文档和源码 很早之前写过一篇用JitPack发布An ...
- libCURL开源库在VS2010环境下编译安装,配置详解
libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...
- GitHub上那些值得一试的JAVA开源库--转
原文地址:http://www.jianshu.com/p/ad40e6dd3789 作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,S ...
- .NET蓝牙开源库:32feet.NET
在用C#调用蓝牙编程一文中我留个小悬念就是:InTheHand.Net.Personal.dll是怎么来的?这篇文章来解答这个问题,InTheHand.Net.Personal.dll就是来源于今天要 ...
- Android Studio 简介及导入 jar 包和第三方开源库方[转]
原文:http://blog.sina.com.cn/s/blog_693301190102v6au.html Android Studio 简介 几天前的晚上突然又想使用 Android Studi ...
- 快快快!27个提升效率的iOS开源库推荐
文章来源:http://www.csdn.net/article/2015-07-21/2825264-27-ios-open-source-libraries/1 我热爱开源,更喜爱那些花费宝贵的业 ...
随机推荐
- [TopCoder] SRM_594_DIV2.250
好长一段时间没写博客了,实在是想不出有什么好写的.近期也有对自己的职业做了一点思考,还是整理不出个所以然来,很是烦躁 ... 研究TopCoder已经有一小段时间了,都是在做之前的题目,还没有实际参加 ...
- patch与diff的恩怨
一.概述 diff和patch是一对相辅相成的工具,在数学上来说,diff类似于对两个集合的差运算,patch类似于对两个集合的和运算.diff比较两个文件或文件集合的差异,并记录下来,生成一个dif ...
- 七个你必须重视的 Git 使用技巧
与其他技术相比,Git应该拯救了更多开发人员的饭碗.只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷糊糊犯下的错误. 尽管这么说,Git的命 ...
- JAVA 面向对象-2-继承(Inheritance)
i.继承(Inheritance) 1.继承的概念 继承:在面向对象编程的过程中,通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类. 继承是面向对象编程最重要的特征之一. 继承的优点:1 ...
- iOS9上的Universal Link实现(教程)
1.Universal Link 理解为苹果官方支持deeplink就行了 2.通过点击HTTP链接启动APP Web・iOS应用在支持Universal Link的前提下,当用户点击特点的链接时会自 ...
- Hibernate查询之SQL查询
转自: Hibernate还支持使用SQL查询,使用SQL查询可以利用某些数据库的特性,或者用于将原有的JDBC应用迁移到Hibernate应用上.使用命名的SQL查询还可以将SQL语句放在配置文件中 ...
- Android 系统名字、版本、API level的对应关系
从官网上找到的,具体地址是: http://source.android.com/source/build-numbers.html Code name Version API level Lolli ...
- 去掉搜狗拼音烦人的x+;进入搜狗搜索
- linux进程间通讯-System V IPC 信号量
进程间通信的机制--信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的很多其它内容,能够阅读我的还有一篇文章:Linux进程间通信--使用信号.以下就进入信号量的 ...
- Flume NG中的ElasticSearch Sink
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...