专题:一个自制代码生成器(嵌入式脚本语言)之对象模型

news/2024/4/29 9:52:47/文章来源:https://blog.csdn.net/2301_77171572/article/details/137006702

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


专题:一个自制代码生成器(嵌入式脚本语言)之总述-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之对象模型-CSDN博客 (本篇)

专题:一个自制代码生成器(嵌入式脚本语言)之堆栈结构和总入口-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之核心逻辑-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之辅助逻辑-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之应用实例-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之模型开发-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之代码模板详解-CSDN博客


目录

一、对象模型概述

二、主要代码

2.1 成员变量定义

2.2 读取和设置

2.3 查找对象

2.4 显示对象

三、堆栈结构和总入口


一、对象模型概述

        表达对象的东西其实都差不多,只是因为都要在里面加自己的特殊东西,所以没有标准。

        所有对象模型都是“节点-节点类型-根据类型不同使用不同的属性和方法-包含的子节点”这么几个要素,这里的对象模型的节点有四种类型:

  • 对象 包含一组通过名称区分的子对象(有点怪吗?可是已经是这样了啊)
  • 指针 指向一个对象
  • 属性 一个值
  • 数组 一个对象数组

        由于设计原因,一个对象的属性通过子对象来实现,直觉上比把属性直接实现为map<属性名,属性值>要复杂些,不过因为程序里面其实都是通过方法来使用的,内部复杂性并没有很大影响。

二、主要代码

2.1 成员变量定义

struct CCTObject
{enum TYPE { OBJECT, POINTER, PROPERTY, ARRAY };TYPE m_type;//根据type决定哪个成员有效CCTObject* m_Pointer;//指针string m_Property;//属性(值)map<string, CCTObject > m_Object;//对象vector<CCTObject >  m_Array;//数组CCTObject() :m_type(OBJECT), m_Pointer(NULL) {}......
}

        通过m_type使用另外四个成员之一。如果要省内存可以用union。

        使用时使用各种专门的读取和设置方法,这些成员原则上是不对外的,其实可以设置成private。

2.2 读取和设置

	string GetDefaultValue(){if (PROPERTY == m_type){return m_Property;}else if (OBJECT == m_type){return m_Object["name"].GetDefaultValue();}else if (POINTER == m_type){return m_Pointer->GetDefaultValue();}else if (ARRAY == m_type){return "ARRAY";}else{return "unknown type";}}string SetDefaultValue(char const* value){if (PROPERTY == m_type){return m_Property = value;}else if (OBJECT == m_type){SetObjectAddProperty("name", value);return value;}else if (POINTER == m_type){return m_Pointer->SetDefaultValue(value);}else if (ARRAY == m_type){return "ARRAY";}else{return "unknown type";}}void SetObjectAddProperty(string name, long value){char buf[64];sprintf(buf, "%ld", value);SetObjectAddProperty(name, buf);}void SetObjectAddProperty(string name, string value){CCTObject p;p.m_type = PROPERTY;p.m_Property = value;m_Object[name] = p;}void SetProperty(string value){m_type = PROPERTY;m_Property = value;}void SetProperty(int value){m_type = PROPERTY;char buf[256];sprintf(buf, "%d", value);m_Property = buf;}void SetPointer(CCTObject* value){m_type = POINTER;m_Pointer = value;}void SetArrayPushBack(CCTObject value){m_type = ARRAY;m_Array.push_back(value);}//给对象初始化一个拥有的数组void SetObjectArrayInit(string name){m_type = OBJECT;CCTObject tmp;tmp.m_type = ARRAY;m_Object[name] = tmp;}//给对象拥有的对象数组添加对象void SetObjectArrayPushBack(string name, CCTObject value){m_type = OBJECT;m_Object[name].SetArrayPushBack(value);}//给对象拥有的属性数组添加属性void SetObjectArrayPushBack(string name, string value){m_type = OBJECT;CCTObject tmp;tmp.SetProperty(value);m_Object[name].SetArrayPushBack(tmp);}void SetObjectAdd(string const& name, CCTObject const& value){m_type = OBJECT;m_Object[name] = value;}void SetObjectAddRef(string const& name, CCTObject * value){m_type = OBJECT;CCTObject tmp;tmp.SetPointer(value);m_Object[name] = tmp;}

        每个方法都很简单。

2.3 查找对象

        这是个很重要的方法,对象名是个点分字符串,也可以包含数组下标操作[]。将对象名拆解后逐级搜索对象。

	//查找对象CCTObject* FindObject(string const& objname){string str;long index = -1;StringTokenizer st(objname, ".");CCTObject* ret = this;DEBUG_LOG << objname << " st.size " << st.size() << endi;for (size_t i = 0; i < st.size(); ++i){DEBUG_LOG << st[i] << endi;while (POINTER == ret->m_type)ret = ret->m_Pointer;size_t pos = st[i].find("[");if (pos != string::npos){index = atol(st[i].substr(pos + 1).c_str());str = st[i].substr(0, pos);}else{index = -1;str = st[i];}if (PROPERTY == ret->m_type){thelog << str << " 不是对象" << ende;return NULL;}else if (OBJECT == ret->m_type){if (ret->m_Object.find(str) != ret->m_Object.end()){ret = &ret->m_Object.find(str)->second;if (index >= 0){if (ARRAY != ret->m_type){thelog << str << " 不是数组" << ende;return NULL;}ret = &ret->m_Array[index];}}else{DEBUG_LOG << str << " 不存在 " << objname << ende;return NULL;}}else{thelog << str << " 未知的类型 " << ret->m_type << ende;return NULL;}}return ret;}

2.4 显示对象

        如何把程序里的数据正确地打印出来对很多程序员好像是个难题啊(更愿意解释为“懒惰”?)。

        输出多级结构的关键是使用正确的缩进,另外要学会如果设置终端的宽度(不然不够显示)。

        使用正确缩进的技巧不过是在递归显示函数里传递深度并用深度构造缩进前缀而已。

	//deep=-1不限深度,自身deep=0string tostring(string& ret, long level, long deep)const{string px;long n;for (long i = 0; i < level; ++i)px += "\t";stringstream ss;if (!(deep < 0 || level < deep)){return "";}if (POINTER == m_type){ss << px << "---->>>> :" << endl;string str;ss << tostring(str, level + 2, deep);}else if (PROPERTY == m_type){ss << px << "PROPERTY " << m_Property << endl;}else if (ARRAY == m_type){ss << px << "ARRAY size " << m_Array.size() << endl;n = 1;for (vector<CCTObject >::const_iterator it = m_Array.begin(); it != m_Array.end(); ++it){ss << px << "\t" << n << endl;string str;ss << it->tostring(str, level + 2, deep);++n;}}else if (OBJECT == m_type){if (0 == m_Object.size()){ss << px << "empty" << endl;}for (long i = 0; i < 3; ++i){n = 1;for (map<string, CCTObject >::const_iterator it = m_Object.begin(); it != m_Object.end(); ++it){if (0 == i && PROPERTY != it->second.m_type)continue;if (1 == i && ARRAY != it->second.m_type)continue;if (2 == i && OBJECT != it->second.m_type)continue;string str;if (PROPERTY != it->second.m_type){ss << px << n << "\t" << it->first << endl;ss << it->second.tostring(str, level + 2, deep);}else{ss << px << n << "\t" << it->first << " \t PROPERTY \t" << it->second.m_Property << endl;}++n;}}}else{ss << px << "此类型不能输出 " << m_type << endl;}return ss.str();}string& toString(string& ret)const{return ret = tostring(ret, 0, -1);}

三、堆栈结构和总入口

        待续


(这里是结束但不是整个系列的结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1027598.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

002-基于Pytorch的手写汉字数字分类

本节将介绍一种 2.1 准备 2.1.1 数据集 &#xff08;1&#xff09;MNIST 只要学习过深度学习相关理论的人&#xff0c;都一定听说过名字叫做LeNet-5模型&#xff0c;它是深度学习三巨头只有Yann Lecun在1998年提出的一个CNN模型&#xff08;很多人认为这是第一个具有实际应用…

Qlib-Server:量化库数据服务器

Qlib-Server:量化库数据服务器 介绍 Qlib-Server 是 Qlib 的配套服务器系统,它利用 Qlib 进行基本计算,并提供广泛的服务器系统和缓存机制。通过 Qlib-Server,可以以集中的方式管理 Qlib 提供的数据。 框架 Qlib 的客户端/服务器框架基于 WebSocket 构建,这是因为 WebS…

学点儿Java_Day10_集合框架(List、Set、HashMap)

1 简介 ArrayList: 有序(放进去顺序和拿出来顺序一致)&#xff0c;可重复 HashSet: 无序(放进去顺序和拿出来顺序不一定一致)&#xff0c;不可重复 Testpublic void test1() {String[] array new String[3];//List: 有序 可重复//有序: 放入顺序 与 拿出顺序一致&#xff0c;…

【NLP笔记】大模型prompt推理(提问)技巧

文章目录 prompt概述推理&#xff08;提问&#xff09;技巧基础prompt构造技巧进阶优化技巧prompt自动优化 参考链接&#xff1a; Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing预训练、提示和预测&#xff1a;NL…

【并发】第二篇 ThreadLocal详解

导航 一. ThreadLocal 简介二. ThreadLocal 源码解析1. get2. set3 .remove4. initialValue三. ThreadLocalMap 源码分析1. 构造方法2. getEntry()3. set()4. resize()5. expungeStaleEntries()6. cleanSomeSlots()7. nextIndex()8. remove()9. 总结ThreadLocalMap四. 内存泄漏…

HarmonyOS 应用开发之显式Want与隐式Want匹配规则

在启动目标应用组件时&#xff0c;会通过显式 Want 或者隐式 Want 进行目标应用组件的匹配&#xff0c;这里说的匹配规则就是调用方传入的 want 参数中设置的参数如何与目标应用组件声明的配置文件进行匹配。 显式Want匹配原理 显式 Want 匹配原理如下表所示。 名称类型匹配…

NanoMQ的安装与部署

本文使用docker进行安装&#xff0c;因此安装之前需要已经安装了docker 拉取镜像 docker pull emqx/nanomq:latest 相关配置及密码认证 创建目录/usr/local/nanomq/conf以及配置文件nanomq.conf、pwd.conf # # # # MQTT Broker # # mqtt {property_size 32max_packet_siz…

使用苹果应用商店上架工具实现应用快速审核与发布

摘要 移动应用app上架是开发者关注的重要环节&#xff0c;但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作&#xff0c;各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用&#xff0c;最终指出合理使用工具的重要性。 引言 移动应…

第4章.精通标准提示,引领ChatGPT精准输出

标准提示 标准提示&#xff0c;是引导ChatGPT输出的一个简单方法&#xff0c;它提供了一个具体的任务让模型完成。 如果你要生成一篇新闻摘要。你只要发送指示词&#xff1a;汇总这篇新闻 : …… 提示公式&#xff1a;生成[任务] 生成新闻文章的摘要&#xff1a; 任务&#x…

Stable Diffusion WebUI 生成参数:脚本(Script)——提示词矩阵、从文本框或文件载入提示词、X/Y/Z图表

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 在本篇文章中,我们将深入探讨 Stable Diffusion WebUI 的另一个引人注目的生成参数——脚本(Script)。我们将逐一细说提示词矩阵、从文本框或文件导入提示词,…

跑腿小程序|基于微信小程序的跑腿平台小程序设计与实现(源码+数据库+文档)

跑腿平台小程序目录 目录 基于微信小程序的跑腿平台小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、跑腿任务管理 3、任务类型管理 4、公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

如何安全地添加液氮到液氮罐中

液氮是一种极低温的液体&#xff0c;它在许多领域广泛应用&#xff0c;但在处理液氮时需谨慎小心。添加液氮到液氮罐中是一个常见的操作&#xff0c;需要遵循一些安全准则以确保操作人员的安全和设备的完整性。 选择合适的液氮容器 选用专业设计用于存储液氮的容器至关重要。…

SnapGene 5 for Mac 分子生物学软件

SnapGene 5 for Mac是一款专为Mac操作系统设计的分子生物学软件&#xff0c;以其强大的功能和用户友好的界面&#xff0c;为科研人员提供了高效、便捷的基因克隆和分子实验设计体验。 软件下载&#xff1a;SnapGene 5 for Mac v5.3.1中文激活版 这款软件支持DNA构建和克隆设计&…

线性代数 - 应该学啥 以及哪些可以交给计算机

AI很热&#xff0c;所以小伙伴们不免要温故知新旧时噩梦 - 线代。 &#xff08;十几年前&#xff0c;还有一个逼着大家梦回课堂的风口&#xff0c;图形学。&#xff09; 这个真的不是什么美好的回忆&#xff0c;且不说老师的口音&#xff0c;也不说教材的云山雾绕&#xff0c;单…

JVM(一)——内存结构

一. 前言 1、什么是 JVM? 1&#xff09;定义&#xff1a; Java Virtual Machine - java 程序的运行环境&#xff08;java 二进制字节码的运行环境&#xff09; 2&#xff09;好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收功能数组下标越…

React Native 应用打包上架

引言 在将React Native应用上架至App Store时&#xff0c;除了通常的上架流程外&#xff0c;还需考虑一些额外的优化策略。本文将介绍如何通过配置App Transport Security、Release Scheme和启动屏优化技巧来提升React Native应用的上架质量和用户体验。 配置 App Transport…

基于振弦采集仪的土体变形监测与分析

基于振弦采集仪的土体变形监测与分析 工程监测振弦采集仪是一种专用于工程监测中的振弦测量的仪器。它能够实时采集及记录结构物的振动信号&#xff0c;以评估结构物的健康状况、安全性能等。它通常由振弦传感器、数据采集模块和数据处理软件组成。振弦传感器负责测量结构物的…

uniApp使用XR-Frame创建3D场景(5)材质贴图的运用

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这篇我们讲解在xr-frame中如何给几何体赋予贴图材质。 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr-node><xr-assets><xr-asse…

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法 ro.vendor.config.lgsi.market_name拯救者平板 Y700 ro.vendor.config.lgsi.en.market_nameLegion Tab Y700 #ro.vendor.config.lgsi.short_market_name联想平板 ZUI T # B…

2024多云管理平台CMP排名看这里!

随着云计算技术的迅猛发展&#xff0c;多云管理平台CMP应运而生。多云管理平台CMP仅能够简化对多个云环境的统一管理&#xff0c;还能提高资源利用效率和降低成本。因此了解多云管理平台CMP品牌是必要的。2024多云管理平台CMP排名看这里&#xff01;仅供参考哈&#xff01; 20…