/
container.h
27 lines (22 loc) · 953 Bytes
/
container.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**************************************************************************
* container.h *
* Copyright (C) 2014 Joshua <gnu.crazier@gmail.com> *
**************************************************************************/
#pragma once
#include <stdlib.h>
/** caculator the offset of a struct membe in the struct. */
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
/** for pointer type safe. */
#ifdef __GNUC__
#define member_type(type, member) __typeof__(((type *)0)->member)
#else
#define member_type(type, member) const void
#endif
/**
* \brief traslate ptr to it's container type *.
* \param ptr the ptr which is to be translated.
* \param type the container type.
* \param member the member name of ptr in type.
*/
#define container_of(ptr, type, member) \
((type *)((char *)(member_type(type, member) *){ptr} - offsetof(type, member)))