首页 > 编程语言 >【C语言数据结构】对Lua Table源码的一次劣质学习

【C语言数据结构】对Lua Table源码的一次劣质学习

时间:2023-12-27 19:11:43浏览次数:42  
标签:pTag ptMainNode 位置 kbRet C语言 KLCMAP Lua 源码 节点

/* new_key */

KLcBool KLcmCreateMapKeyValue(KLCMAP_PTR pTag, KLCTVALUE_PTR pKv)
{
	KLcBool kbRet					= KL_FALSE;
	KLcBool kbIsKvLegal				= KL_FALSE;
	DWORD dwInsertPos				= 0;
	DWORD dwFreePos					= 0;
	DWORD dwCollisionPos			= 0;
	KLCTVALUE_PTR ptMainNode		= NULL;
	KLCTVALUE_PTR ptCollisionNode	= NULL;

	kbRet = KLcmGetIsLegalKv(pKv);
	KL_PROCESS_ERROR(kbRet && kbIsKvLegal);

	/* 获取 pkv 应该插入的位置,下述 '插入位置'. */
	kbRet = KLcmGetHashKeyPosition(pTag, pKv, &dwInsertPos);
	KL_PROCESS_ERROR(kbRet);
	/* 预期节点,主位置节点. */
	ptMainNode = pTag->parrNode[dwInsertPos];

	/* 判断插入位置是否被占用. */
	if (NULL != KLCMAP_CHECKNULL(ptMainNode))
	{
		/* 插入位置被占用. */
		/* 获取新的插入位置,下述 '新位置',这个位置一定是空的. */
		kbRet = KLcmGetHashKeyFreePosition(pTag, &dwFreePos);
		KL_PROCESS_ERROR(kbRet);

		/* 判断是否还有 map 结构空间,有则继续,无则扩容. */
		if (KLCMAP_LACKOFSPACE != dwFreePos)
		{
			/* 还有空间,不需要扩容 Map 结构. */
			/* 获取被占用的预期节点的原属地位置. */
			kbRet = KLcmGetHashKeyPosition(pTag, ptMainNode, &dwCollisionPos);
			KL_PROCESS_ERROR(kbRet);
			/* 预期节点(原属地). */
			ptCollisionNode = pTag->parrNode[dwCollisionPos];

			/* 判断冲突节点是否真正属于这个目前所占用的位置 */
			/* 即判断是否为主位置节点. */
			if (dwInsertPos != dwCollisionPos)
			{
				/* 冲突节点现在所占的这个位置不属于它,也是通过碰撞被临时放在这的. */
				/* 移动占据这里的kv结构,将占据这里的kv结构放在第一个空闲位置,需要存储的结构放在这. */
				while (KLCMAP_GETNEXT(ptCollisionNode) != ptMainNode)
				{
					/* 获取预期位置的上一个节点. */
					ptCollisionNode = KLCMAP_GETNEXT(ptCollisionNode);
				}
				/*
				* 1. 把这个冲突节点移动到新找的空位.
				* 2. 把 预期节点(冲突节点)前一个节点的指针重新指向新的位置.
				* 3. 把 pkv 插入到现在这个节点成为主位置节点.
				*/
				ptCollisionNode->uKey.pNext = pTag->parrNode[dwFreePos];
				*(pTag->parrNode[dwFreePos]) = *ptMainNode;
				ptMainNode->uKey.pNext = NULL;
				kbRet = KLcmSetNullKV(ptMainNode);
				KL_PROCESS_ERROR(kbRet);
			}
			else
			{
				/* 冲突节点现在所占的位置属于它,本次插入发生碰撞. */
				/* 把 pkv 插入到新节点里去,然后预期节点链接此. */
				KLCMAP_GETNEXT(pTag->parrNode[dwFreePos]) = KLCMAP_GETNEXT(ptMainNode);
				KLCMAP_GETNEXT(ptMainNode) = pTag->parrNode[dwFreePos];
				/* 这里只是交换了指针,方便下面的插入,不是交换指针内的数据. */
				ptMainNode = pTag->parrNode[dwFreePos];
			}
		}
		else
		{
			/* 需要开辟新空间. */
		}
	} 

	/* 上面的操作只是进行了数据结构内的位置交换,没有数据的插入逻辑. */
	/* 以下才是数据插入的逻辑. */
	ptMainNode->uKey.sVk.uValue = pKv->ktValue.uValue;
	ptMainNode->uKey.sVk.emType = pKv->ktValue.emType;

	kbRet = KL_TRUE;
Exit0:
	return kbRet;
}

标签:pTag,ptMainNode,位置,kbRet,C语言,KLCMAP,Lua,源码,节点
From: https://www.cnblogs.com/hatsuzuki/p/17931246.html

相关文章

  • lua读写文件
    读写文件的模式r-读取模式w-写入模式(覆盖现有内容)a-附加模式(附加在现有内容之后)b-二进制模式r+-读取更新模式(现有数据保留)w+-写入更新模式(现有数据擦除)a+-附加更新模式(现有数据保留,只在文件末尾附加)do --readdatafromfile functionre......
  • Java线程池ThreadPoolExecutor源码解析
    Java线程池ThreadPoolExecutor源码解析1.ThreadPoolExecutor的构造实现以jdk8为准,常说线程池有七大参数,通常而言,有四个参数是比较重要的publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,lon......
  • 模拟实现strstr函数的代码——《初学C语言第40天》
    //////模拟实现strstr////(字符中的元素是连续存放的,所以不会存在跳动存放的情况,例如a1="ababcd",a2="ac"此结果就是NULL)////情况1.arr1="abcd"arr2="abc"(一次匹配就找到了)////情况2.arr1="ababcd"arr2="abc"(多次匹配才能找到)//#include<stdio.h>//#in......
  • AbstractQueuedSynchronizer源码阅读
    AbstractQueuedSynchronizer源码阅读目录AbstractQueuedSynchronizer源码阅读例子Overview-CLH锁Overview的剩余内容代码分析cleanQueueacquireacquire总结acquire共享模式补充release内部类ConditionObject参考链接本人的源码阅读主要聚焦于类的使用场景,一般只在java层面进行分......
  • Unity3D 项目中怎样正确的使用 Lua详解
    在Unity3D游戏开发中,Lua作为一种轻量级的脚本语言,被广泛应用于游戏逻辑的编写和扩展。本文将详细介绍如何正确地在Unity3D项目中使用Lua,并给出相应的技术详解和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬......
  • ThreadLocal底层源码解析
    ThreadLocal底层源码解析ThreadLocal:顾名思义的意思是本地线程或者局部线程的意思,其真正含义是希望多个线程之间拥有自己的局部变量,多个线程间拥有自己的私人变量,在多线程间不被共享,被线程单独享用,这就是ThreadLocal设计之初的原衷因此,无论是操作系统级别还是编程语言......
  • openjdk源码-java是如何执行shell命令的
    一般我们在java中调用shell脚本的方式如下publicintexecuteLinuxCmd(Stringcmd){LOGGER.info("cmd:{}",cmd);Runtimerun=Runtime.getRuntime();try{Processprocess=run.exec(cmd);InputStreamin=proce......
  • APP开发详解:数字药店系统源码
    数字药店系统的兴起,不仅为消费者提供了更加便捷的购药体验,也为药店管理和药品销售带来了全新的机遇。一、明确系统的基本功能:1.用户注册与登录2.药品浏览与搜索3.购物车与结算。4.在线支付与订单管理二、开发环境与技术栈选择前端开发环境通常使用React、Vue或Angular等流行的前端......
  • 大语言模型生成模型的源码结构复习
    modeling_gpt2.py:1099iflabelsisnotNone:#movelabelstocorrectdevicetoenablemodelparallelismlabels=labels.to(lm_logits.device)#Shiftsothattokens<npredictnshift_logits=lm......
  • 基于SpringBoot+Vue的毕业设计系统的开发设计实现(源码+lw+部署文档+讲解等)
    (文章目录)前言:heartpulse:博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌:heartpulse:......