容器与迭代器,C实现《第一篇,数据类型》

前言

闲,想着用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实现的容器》
《第六篇,排序》
项目地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值