Skip to content

Commit 8c1221a

Browse files
committed
Merge branch 'master' of git@github.com:fritzprix/cdsl.git
# Conflicts: # include/serialization/serializer.h # source/base_tree.c # source/cdsl_rbtree.c # source/test/cdsl_rbtree_test.c
2 parents 0134a4d + 482badf commit 8c1221a

20 files changed

+263
-82
lines changed

include/cdsl_avltree.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ extern "C" {
2626
#define cdsl_avltreeMaxDepth(root) tree_max_depth((base_treeRoot_t*) root)
2727
#define cdsl_avltreeForEach(root, cb, order, arg) tree_for_each((base_treeRoot_t*) root, (base_tree_callback_t) cb, order, arg)
2828
#define cdsl_avltreeForEachToTarget(root,cb,key, arg) tree_for_each_to_target((base_treeRoot_t*) root, (base_tree_callback_t) cb, key, arg)
29+
#define cdsl_avltreeSerialize(root, serializer, cb) tree_serialize((base_treeRoot_t*) root, (cdsl_serializer_t*) serializer, cb, &_cdsl_avltree_serializer_ext)
30+
#define cdsl_avltreeDeserialize(root, desrl, alloc) tree_deserialize((base_treeRoot_t*) root,(cdsl_deserializer_t*) desrl, alloc, &_cdsl_avltree_serializer_ext)
31+
#define cdsl_avltreeCompare(aroot, broot) tree_compare((base_treeRoot_t*) aroot, (base_treeRoot_t*) broot)
2932
#define cdsl_avltreeSize(root) tree_size((base_treeRoot_t*) root)
3033
#define cdsl_avltreePrint(root, print) tree_print((base_treeRoot_t*) root, print)
3134
#define cdsl_avltreeIsEmpty(root) tree_is_empty((base_treeRoot_t*) root)
@@ -164,7 +167,7 @@ struct cdsl_avlnode {
164167
* \param[in] rootp pointer to root of the tree
165168
* \param[in] bal balance factor for the AVL tree management
166169
*/
167-
extern void cdsl_avltreeRootInit(avltreeRoot_t* rootp, int bal);
170+
extern void cdsl_avltreeRootInit(avltreeRoot_t* rootp, uint8_t bal);
168171

169172
/*!
170173
* \brief Initialize tree node with key value
@@ -235,10 +238,14 @@ extern avltreeNode_t* cdsl_avltreeDeleteMinReplace(avltreeRoot_t* rootp, base_tr
235238
*/
236239
extern avltreeNode_t* cdsl_avltreeDeleteMaxReplace(avltreeRoot_t* rootp, base_tree_replacer_t replacer, void* cb_arg);
237240

241+
238242
/*!
239243
* @}
240244
*/
241245

246+
extern const cdsl_serializeExtInterface_t _cdsl_avltree_serializer_ext;
247+
248+
242249

243250
#if defined(__cplusplus)
244251
}

include/cdsl_defs.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ extern "C" {
4141
#define STRCMP(s1,s2) baremetal_strcmp(s1,s2)
4242
#define F_OPEN(filename, mode) ((int) -1)
4343
#define F_WRITE(fd, buffer, size) ((int) -1)
44+
#define F_READ(fd, buffer, size) ((int) -1)
45+
#define MEMCPY(dest,src,sz) {}
46+
#define MALLOC NULL
47+
#define FREE
48+
#define GET_DEFAULT_MMNGT() {}
4449
#define F_CLOSE(fd) ((int) -1)
4550
#define F_FDOPEN(fd) NULL
4651
#define F_FCLOSE(fp) ((int) -1)

include/serialization/serializer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#ifndef INCLUDE_SERIALIZATION_SERIALIZER_H_
99
#define INCLUDE_SERIALIZATION_SERIALIZER_H_
1010

11+
#include "arch.h"
1112
#include "cdsl_defs.h"
1213

1314
#ifdef __cplusplus
@@ -55,6 +56,7 @@ struct cdsl_serialize_header {
5556
#define TYPE_TREE ((uint16_t) (1 << 8))
5657
#define SUB_TYPE_PLAIN ((uint16_t) 0)
5758
#define SUB_TYPE_REDBLACK ((uint16_t) 1)
59+
#define SUB_TYPE_AVLNODE ((uint16_t) 2)
5860
#define TYPE_LIST ((uint16_t) (2 << 8))
5961
uint16_t type;
6062
};
@@ -149,6 +151,7 @@ struct cdsl_serialize_ext_interface {
149151

150152
void (*write_serialize_header)(cdsl_serializeHeader_t* header);
151153
cdsl_serializeNode_t* (*alloc_ext_node)(size_t* node_sz);
154+
void (*free_ext_node) (cdsl_serializeNode_t* allocated);
152155
void (*write_node_haeder)(cdsl_serializeNode_t* node_head, const void* node);
153156
void (*on_node_build)(const cdsl_serializeNode_t* node_header, void* node);
154157

package_arm_cm3.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name":"cdsl",
3-
"include":["./include","./","./include/arch/arm"],
3+
"include":["./include","./","./include/arch/arm","./include/serialization"],
44
"output":["libcdsl.a"],
55
"version":"0.1",
66
"buildcmd":[

package_arm_cm4.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name":"cdsl",
3-
"include":["./include","./","./include/arch/arm"],
3+
"include":["./include","./","./include/arch/arm","./include/serialization"],
44
"output":["libcdsl.a"],
55
"version":"0.1",
66
"buildcmd":[

package_x86_32.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name":"cdsl",
3-
"include":["./include","./","./include/arch/x86_32"],
3+
"include":["./include","./","./include/arch/x86_32","./include/serialization"],
44
"output":["libcdsl.a","libcdsl.so"],
55
"version":"0.1",
66
"buildcmd":[

package_x86_64.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name":"cdsl",
3-
"include":["./include","./","./include/arch/x86_64"],
3+
"include":["./include","./","./include/arch/x86_64","./include/serialization"],
44
"output":["libcdsl.a","libcdsl.so"],
55
"version":"0.1",
66
"buildcmd":[

source/arch/arm/configs/cortex-m0_config

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ CONFIG_TEST=n
22
CONFIG_BAREMETAL=y
33
CONFIG_ARCH=arm
44
CONFIG_SUB_ARCH=cortex-m0
5-
include /home/innocentevil/my_work/cdsl-tachyos/recipe.mk
6-
include /home/innocentevil/my_work/cdsl-tachyos/source/recipe.mk
7-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/arm/baremetal.mk
8-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/arm/recipe.mk
9-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/arm/cortex-m0/recipe.mk
5+
include /home/lucifer/my_work/cdsl/recipe.mk
6+
include /home/lucifer/my_work/cdsl/source/recipe.mk
7+
include /home/lucifer/my_work/cdsl/source/serialization/recipe.mk
8+
include /home/lucifer/my_work/cdsl/source/arch/arm/baremetal.mk
9+
include /home/lucifer/my_work/cdsl/source/arch/arm/recipe.mk
10+
include /home/lucifer/my_work/cdsl/source/arch/arm/cortex-m0/recipe.mk
1011

1112
DEF+= BAREMETAL=y SUB_ARCH=cortex-m0

source/arch/arm/configs/cortex-m3_config

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ CONFIG_TEST=n
22
CONFIG_BAREMETAL=y
33
CONFIG_ARCH=arm
44
CONFIG_SUB_ARCH=cortex-m3
5-
include /home/innocentevil/my_work/cdsl-tachyos/recipe.mk
6-
include /home/innocentevil/my_work/cdsl-tachyos/source/recipe.mk
7-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/arm/baremetal.mk
8-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/arm/recipe.mk
9-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/arm/cortex-m3/recipe.mk
5+
include /home/lucifer/my_work/cdsl/recipe.mk
6+
include /home/lucifer/my_work/cdsl/source/recipe.mk
7+
include /home/lucifer/my_work/cdsl/source/serialization/recipe.mk
8+
include /home/lucifer/my_work/cdsl/source/arch/arm/baremetal.mk
9+
include /home/lucifer/my_work/cdsl/source/arch/arm/recipe.mk
10+
include /home/lucifer/my_work/cdsl/source/arch/arm/cortex-m3/recipe.mk
1011

1112
DEF+= BAREMETAL=y SUB_ARCH=cortex-m3

source/arch/arm/configs/cortex-m4_config

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ CONFIG_TEST=n
22
CONFIG_BAREMETAL=y
33
CONFIG_ARCH=arm
44
CONFIG_SUB_ARCH=cortex-m4
5-
include /home/innocentevil/my_work/cdsl-tachyos/recipe.mk
6-
include /home/innocentevil/my_work/cdsl-tachyos/source/recipe.mk
7-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/arm/baremetal.mk
8-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/arm/recipe.mk
9-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/arm/cortex-m4/recipe.mk
5+
include /home/lucifer/my_work/cdsl/recipe.mk
6+
include /home/lucifer/my_work/cdsl/source/recipe.mk
7+
include /home/lucifer/my_work/cdsl/source/serialization/recipe.mk
8+
include /home/lucifer/my_work/cdsl/source/arch/arm/baremetal.mk
9+
include /home/lucifer/my_work/cdsl/source/arch/arm/recipe.mk
10+
include /home/lucifer/my_work/cdsl/source/arch/arm/cortex-m4/recipe.mk
1011

1112
DEF+= BAREMETAL=y SUB_ARCH=cortex-m4

source/arch/x86/configs/x86_32_config

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ CONFIG_TEST=y
22
CONFIG_BAREMETAL=n
33
CONFIG_ARCH=x86
44
CONFIG_SUB_ARCH=x86_32
5-
include /home/innocentevil/my_work/cdsl-tachyos/recipe.mk
6-
include /home/innocentevil/my_work/cdsl-tachyos/source/recipe.mk
7-
include /home/innocentevil/my_work/cdsl-tachyos/source/test/recipe.mk
8-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/x86/recipe.mk
9-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/x86/x86_32/recipe.mk
5+
include /home/lucifer/my_work/cdsl/recipe.mk
6+
include /home/lucifer/my_work/cdsl/source/recipe.mk
7+
include /home/lucifer/my_work/cdsl/source/serialization/recipe.mk
8+
include /home/lucifer/my_work/cdsl/source/test/recipe.mk
9+
include /home/lucifer/my_work/cdsl/source/arch/x86/recipe.mk
10+
include /home/lucifer/my_work/cdsl/source/arch/x86/x86_32/recipe.mk
1011

1112
DEF+=

source/arch/x86/configs/x86_64_config

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ CONFIG_TEST=y
22
CONFIG_BAREMETAL=n
33
CONFIG_ARCH=x86
44
CONFIG_SUB_ARCH=x86_64
5-
include /home/innocentevil/my_work/cdsl-tachyos/recipe.mk
6-
include /home/innocentevil/my_work/cdsl-tachyos/source/recipe.mk
7-
include /home/innocentevil/my_work/cdsl-tachyos/source/test/recipe.mk
8-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/x86/recipe.mk
9-
include /home/innocentevil/my_work/cdsl-tachyos/source/arch/x86/x86_64/recipe.mk
5+
include /home/lucifer/my_work/cdsl/recipe.mk
6+
include /home/lucifer/my_work/cdsl/source/recipe.mk
7+
include /home/lucifer/my_work/cdsl/source/serialization/recipe.mk
8+
include /home/lucifer/my_work/cdsl/source/test/recipe.mk
9+
include /home/lucifer/my_work/cdsl/source/arch/x86/recipe.mk
10+
include /home/lucifer/my_work/cdsl/source/arch/x86/x86_64/recipe.mk
1011

1112
DEF+=

source/base_tree.c

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,13 @@ static base_treeNode_t* build_tree_rc(base_treeNode_t* parent, struct deserializ
5252

5353
static DECLARE_FOREACH_CALLBACK(serialize_for_each);
5454

55-
#define GET_DOFFSET(node_head_size, ext_type) (node_head_size - offsetof(cdsl_serializeNode_t, flags))
56-
#define GET_EOFFSET(data, node) (((size_t) node) - ((size_t) data))
55+
#define GET_DOFFSET(node_head_size, ext_type) \
56+
(node_head_size - offsetof(cdsl_serializeNode_t, flags))
57+
#define GET_EOFFSET(data, node) \
58+
(((size_t) node) - ((size_t) data))
5759

58-
59-
#define IS_NODE_EMBEDDED(data, node, size) ((((size_t) data) <= ((size_t) node)) && ((((size_t) data) + size) > ((size_t) node)))
60+
#define IS_NODE_EMBEDDED(data, node, size) \
61+
((((size_t) data) <= ((size_t) node)) && ((((size_t) data) + size) > ((size_t) node)))
6062

6163

6264
static DECLARE_FOREACH_CALLBACK(serialize_for_each) {
@@ -68,18 +70,20 @@ static DECLARE_FOREACH_CALLBACK(serialize_for_each) {
6870
base_treeSerNode_t ser_node = {0};
6971
base_treeSerNode_t* ser_nodep = NULL;
7072
size_t node_sz = sizeof(base_treeSerNode_t);
71-
if(ext_interface && ext_interface->alloc_ext_node) {
73+
if(ext_interface && \
74+
ext_interface->alloc_ext_node && \
75+
ext_interface->free_ext_node) {
7276
ser_nodep = (base_treeSerNode_t*) ext_interface->alloc_ext_node(&node_sz);
7377
} else {
7478
ser_nodep = &ser_node;
7579
}
7680

7781
if((order & NODE_MSK) == NODE_NULL) {
78-
ser_node.key = -1;
79-
ser_node._node.flags = NODE_NULL;
82+
ser_nodep->key = -1;
83+
ser_nodep->_node.flags = NODE_NULL;
8084
} else {
81-
ser_node._node.d_offset = GET_DOFFSET(node_sz,base_treeSerNode_t);
82-
ser_node._node.flags = NODE_NORMAL;
85+
ser_nodep->_node.d_offset = GET_DOFFSET(node_sz,base_treeSerNode_t);
86+
ser_nodep->_node.flags = NODE_NORMAL;
8387
if(ext_interface && ext_interface->write_node_haeder) {
8488
ext_interface->write_node_haeder((cdsl_serializeNode_t*) ser_nodep, node);
8589
}
@@ -90,17 +94,23 @@ static DECLARE_FOREACH_CALLBACK(serialize_for_each) {
9094
// callback SHOULD be provided
9195
return FOREACH_BREAK;
9296
}
93-
data = callback->on_node_to_data(callback, node, &ser_node._node.d_size);
97+
data = callback->on_node_to_data(callback, node, &ser_nodep->_node.d_size);
9498

95-
if(data && ser_node._node.d_size) {
96-
if (IS_NODE_EMBEDDED(data, node, ser_node._node.d_size)) {
97-
ser_node._node.flags |= EMBEDDED_MSK;
98-
ser_node._node.e_offset = GET_EOFFSET(data, node);
99+
if(data && ser_nodep->_node.d_size) {
100+
if (IS_NODE_EMBEDDED(data, node, ser_nodep->_node.d_size)) {
101+
ser_nodep->_node.flags |= EMBEDDED_MSK;
102+
ser_nodep->_node.e_offset = GET_EOFFSET(data, node);
99103
}
100104
}
101105
}
102106

103-
args->result_code = serializer->on_next(serializer, (cdsl_serializeNode_t*) &ser_node, sizeof(base_treeSerNode_t), data);
107+
108+
args->result_code = serializer->on_next(serializer, (cdsl_serializeNode_t*) ser_nodep, sizeof(base_treeSerNode_t), data);
109+
if(ext_interface && \
110+
ext_interface->alloc_ext_node && \
111+
ext_interface->free_ext_node) {
112+
ext_interface->free_ext_node((cdsl_serializeNode_t*) ser_nodep);
113+
}
104114
if(args->result_code) {
105115
return FOREACH_BREAK;
106116
}

source/cdsl_avltree.c

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@
88
#include "cdsl_avltree.h"
99

1010

11-
#define DIR_LEFT ((uint8_t) 1)
12-
#define DIR_RIGHT ((uint8_t) 2)
11+
#define DIR_LEFT ((uint8_t) 1)
12+
#define DIR_RIGHT ((uint8_t) 2)
1313

14-
#define PATTERN_MASK ((uint8_t) 0x0F)
15-
#define LEFTRIGTH_PATTERN ((uint8_t) (DIR_RIGHT << 2) | DIR_LEFT)
16-
#define LEFTLEFT_PATTERN ((uint8_t) (DIR_LEFT << 2) | DIR_LEFT)
17-
#define RIGHTLEFT_PATTERN ((uint8_t) (DIR_LEFT << 2) | DIR_RIGHT)
18-
#define RIGHTRIGHT_PATTERN ((uint8_t) (DIR_RIGHT << 2) | DIR_RIGHT)
14+
#define HEIGHT_COMPRESSION_RATE ((uint8_t) 4)
15+
16+
#define PATTERN_MASK ((uint8_t) 0x0F)
17+
#define LEFTRIGTH_PATTERN ((uint8_t) (DIR_RIGHT << 2) | DIR_LEFT)
18+
#define LEFTLEFT_PATTERN ((uint8_t) (DIR_LEFT << 2) | DIR_LEFT)
19+
#define RIGHTLEFT_PATTERN ((uint8_t) (DIR_LEFT << 2) | DIR_RIGHT)
20+
#define RIGHTRIGHT_PATTERN ((uint8_t) (DIR_RIGHT << 2) | DIR_RIGHT)
1921

2022
static avltreeNode_t* insert_rc(int bal, avltreeNode_t* sub_root_c, avltreeNode_t* item, uint8_t *rc_dir, avltreeNode_t** replaced);
2123
static avltreeNode_t* delete_rc(int bal, avltreeNode_t* sub_root_c, avltreeNode_t** deleteed,trkey_t key, base_tree_replacer_t replacer, void* args);
@@ -30,9 +32,20 @@ static avltreeNode_t* rotate_left(avltreeNode_t* sub_root);
3032
static int max_child_height(avltreeNode_t* node);
3133

3234

35+
static void _write_ser_node_header (cdsl_serializeNode_t* node_head, const void* node);
36+
static void _write_serialize_header(cdsl_serializeHeader_t* header);
37+
static void _build_node(const cdsl_serializeNode_t* node_header, void* node);
38+
3339

40+
const cdsl_serializeExtInterface_t _cdsl_avltree_serializer_ext = {
41+
.free_ext_node = NULL,
42+
.alloc_ext_node = NULL,
43+
.write_node_haeder = _write_ser_node_header,
44+
.write_serialize_header = _write_serialize_header,
45+
.on_node_build = _build_node
46+
};
3447

35-
void cdsl_avltreeRootInit(avltreeRoot_t* rootp, int bal) {
48+
void cdsl_avltreeRootInit(avltreeRoot_t* rootp, uint8_t bal) {
3649
if(!rootp) {
3750
return;
3851
}
@@ -550,4 +563,20 @@ static int max_child_height(avltreeNode_t* node) {
550563
return 0;
551564
}
552565

566+
static void _write_ser_node_header (cdsl_serializeNode_t* node_head, const void* node) {
567+
if(node_head == NULL) return;
568+
avltreeNode_t* avlnode = (avltreeNode_t*) node;
569+
SET_SPEC(node_head,avlnode->height);
570+
}
571+
572+
static void _write_serialize_header(cdsl_serializeHeader_t* header) {
573+
header->type |= SUB_TYPE_AVLNODE;
574+
}
575+
576+
static void _build_node(const cdsl_serializeNode_t* node_header, void* node) {
577+
uint8_t spec = GET_SPEC(node_header);
578+
avltreeNode_t* avlnode = (avltreeNode_t*) node;
579+
avlnode->height = spec;
580+
}
581+
553582

source/cdsl_hashtree.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "cdsl_hash.h"
1111
#include "cdsl_hashtree.h"
1212

13-
#include "../include/cdsl_rbtree.h"
13+
#include "cdsl_rbtree.h"
1414
#include "cdsl_slist.h"
1515

1616
#define REPLACER_ARG_INIT {0,}

0 commit comments

Comments
 (0)