前言
闲,想着用C写一套容器接口,纯属娱乐,以此文章做记录。
数据类型 type_value_t
容器,装数据。C没有模版的机制,C写的容器如何能装载不同的数据类型?我将C的数据分为两类,一是数值,如 int、char、float 等,另外一类就是引用,也就是pointer。于是设计一种数据结构统一代表C的数据类型。
typedef long long v_type;
typedef union _type_value
{
void* pointer;
unsigned char type_value[sizeof(v_type)];
} type_value_t;
type_value_t 赋值
使用8个字节统一代表各种数据类型。对,这有点浪费,但方便我设计接口。那么这个 type_value_t 如何设置各种不同值呢?
#define set_type_val(t, v) (((*((v_type*)t.type_value))=(*((v_type*)(&(v)))))?t:t)
#define set_type_ptr(t, p) ((t.pointer=p)?t:t)
// int --> type_value_t
static inline
type_value_t _int_type(int v)
{
type_value_t tv;
return set_type_val(tv, v);
}
// float --> type_value_t
static inline
type_value_t _flv_type(float v)
{
type_value_t tv;
return set_type_val(tv, v);
}
// double --> type_value_t
static inline
type_value_t _2flv_type(double v)
{
type_value_t tv;
return set_type_val(tv, v);
}
// pointer --> type_value_t
static inline
type_value_t _ptr_type(void* p)
{
type_value_t tv;
return set_type_ptr(tv, p);
}
- 1 set_type_val 用于把各种数值设置进type_value_t的 type_value 字段。
- 2 set_type_ptr 用于把指针设置如type_value_t 的 pointer 字段。
- 3 事实上,所有size小于等于8个字节的数据,都可以通过这个宏设置进去。
type_value_t 取值
#define type_v(vt,t) (*((vt*)t.type_value))
// 取int值
#define type_int(t) type_v(int, t)
// 取float值
#define type_float(t) type_v(float, t)
// 取double值
#define type_double(t) type_v(double, t)
// 取指针
#define type_pointer(t) (t.pointer)
- 1 type_v(vt, t) 用与以某种值的形式返回type_value_t中type_value的值,例如返回int、float、double、pointer。
- 2 也可以返回某种自定义的且size小于8的数据类型。例如struct xx {},可以使用 type_v(xx, t)返回xx类型的值,但大于8个字节的数据,只能存放其有效的指针,使用type_pointer(t) 返回其有效指针。
完
《第一篇,数据类型》
《第二篇,迭代器》
《第三篇,容器接口》
《第四篇,vector实现的容器》
《第五篇,list实现的容器》
《第六篇,排序》
项目地址