kbtree的源码阅读

kbtree.h: generic search tree based on B-tree.



第一部分: 在算法开始前, 定义一些数据结构:

定义树的最大深度.

0035 #define KB_MAX_DEPTH 64  定义树的最大深度是64

这是树的一个结点的定义, 这里面使用的是C语言的bit fields

在这里, 就是四个字节,分别is_internal是占一个bit, n占了31个bit

0037 typedef struct {
0038     int32_t is_internal:1, n:31;
0039 } kbnode_t;


第二部分: 所暴露的函数, 与初始化

0364 #define KBTREE_INIT(name, key_t, __cmp)         0365     __KB_TREE_T(name)                           0366     __KB_INIT(name, key_t)                      0367     __KB_GET_AUX1(name, key_t, __cmp)           0368     __KB_GET(name, key_t)                       0369     __KB_INTERVAL(name, key_t)                  0370     __KB_PUT(name, key_t, __cmp)                0371     __KB_DEL(name, key_t) 0372     __KB_ITR(name, key_t)

2.1 定义代表树的结构

第一个__KB_TREE_T(name)所定义的是一个结构体, 用于代表这个树

0053 #define __KB_TREE_T(name)                       0054     typedef struct {                            0055         kbnode_t *root;                         0056         int off_key, off_ptr, ilen, elen;       0057         int n, t;                               0058         int n_keys, n_nodes;                    0059     } kbtree_##name##_t;

2.2 定义初始化树的函数

0061 #define __KB_INIT(name, key_t)                                          0062     kbtree_##name##_t *kb_init_##name(int size)

具体的函数实现在 3.1 中说明这个函数说什么



第三部分: 具体的函数的实现


3.1 初始化函数kb_init_##name(s) 的函数的代码如下:
0062     kbtree_##name##_t *kb_init_##name(int size)                         0063     {                                                                   0064         kbtree_##name##_t *b;                                           \                                             定义一个名字为b的树的代表
0065         b = (kbtree_##name##_t*)calloc(1, sizeof(kbtree_##name##_t));   \                         给b分配相关的内存
0066         b->t = ((size - 4 - sizeof(void*)) / (sizeof(void*) + sizeof(key_t)) + 1) >> 1; \               key_t 是自己定义的一个键值的类型.
0067         if (b->t < 2) {                                                 0068             free(b); return 0;                                          0069         }                                                               0070         b->n = 2 * b->t - 1;                                            0071         b->off_ptr = 4 + b->n * sizeof(key_t);                          0072         b->ilen = (4 + sizeof(void*) + b->n * (sizeof(void*) + sizeof(key_t)) + 3) >> 2 << 2; 0073         b->elen = (b->off_ptr + 3) >> 2 << 2;                           0074         b->root = (kbnode_t*)calloc(1, b->ilen);                        \                                           分配一个root结点
0075         ++b->n_nodes;                                                   \                                                    结点数加1
0076         return b;                                                       0077     }
				
时间: 2024-10-05 05:21:14

kbtree的源码阅读的相关文章

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划

body, td { font-family: tahoma; font-size: 10pt; } 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划 SQL编译解析三部曲分为:构建语法树,生成逻辑计划,指定物理执行计划.第一步骤,在我的上一篇博客淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树里做了介绍,这篇博客主要研究第二步,生成逻辑计划. 一. 什么是逻辑计划?我们已经知道,语法树就是一个树状的结构组织,每个节点代表一种类型的语法含义.如

JDK部分源码阅读与理解

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/JDK部分源码阅读与理解/ 不喜欢重复造轮子,不喜欢贴各种东西.JDK代码什么的,让整篇文章很乱...JDK源码谁都有,没什么好贴的...如果你没看过JDK源码,建议打开Eclipse边看源码边看这篇文章,看过的可以把这篇文章当成是知识点备忘录... JDK容器类中有大量的空指针.数组越界.状态异常等异常处理,这些不是重点,我们关注的应该是它的一些底层的具体实现,这篇

如何阅读Java源码 阅读java的真实体会

刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃<Core Java>,你是很难从中吸收到营养的,特别是<深入Java虚拟机>这类书,别人觉得好,未必适合现在的你. 虽然Tomcat的源码很漂亮,但我绝不建议你一开始就读它.我文中会专门谈到这个,暂时不展开. 强烈

Memcache-Java-Client-Release源码阅读(之七)

一.主要内容 本章节的主要内容是介绍Memcache Client的Native,Old_Compat,New_Compat三个Hash算法的应用及实现. 二.准备工作 1.服务器启动192.168.0.106:11211,192.168.0.106:11212两个服务端实例. 2.示例代码: String[] servers = { "192.168.0.106:11211", "192.168.0.106:11212" }; SockIOPool pool =

源码阅读笔记 - 1 MSVC2015中的std::sort

大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格式化,去掉或者展开用于条件编译或者debug检查的宏,依重要程度重新排序函数,但是不会改变命名方式(虽然MSVC的STL命名实在是我不能接受的那种),对于代码块的解释会在代码块前(上面)用注释标明. template<class _RanIt, class _Diff, class _Pr> in

JDK 源码 阅读 - 2 - 设计模式 - 创建型模式

A.创建型模式 抽象工厂(Abstract Factory) javax.xml.parsers.DocumentBuilderFactory DocumentBuilderFactory通过FactoryFinder实例化具体的Factory. 使用例子: DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilder

CI源码阅读

CodeIgniter源码分析 http://calixwu.com/2014/11/codeigniter-yuanmafenxi.html CI框架源码阅读笔记 http://www.cnblogs.com/ohmygirl/p/4052686.html

《java.util.concurrent 包源码阅读》13 线程池系列之ThreadPoolExecutor 第三部分

这一部分来说说线程池如何进行状态控制,即线程池的开启和关闭. 先来说说线程池的开启,这部分来看ThreadPoolExecutor构造方法: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecut