xref: /freebsd-src/sys/compat/linuxkpi/common/include/linux/container_of.h (revision fa862482fb0a8759984437d71221b17377625491)
1*fa862482SVladimir Kondratyev /*-
2*fa862482SVladimir Kondratyev  * Copyright (c) 2010 Isilon Systems, Inc.
3*fa862482SVladimir Kondratyev  * Copyright (c) 2010 iX Systems, Inc.
4*fa862482SVladimir Kondratyev  * Copyright (c) 2010 Panasas, Inc.
5*fa862482SVladimir Kondratyev  * Copyright (c) 2017 Matt Macy <mmacy@FreeBSD.org>
6*fa862482SVladimir Kondratyev  * All rights reserved.
7*fa862482SVladimir Kondratyev  *
8*fa862482SVladimir Kondratyev  * Redistribution and use in source and binary forms, with or without
9*fa862482SVladimir Kondratyev  * modification, are permitted provided that the following conditions
10*fa862482SVladimir Kondratyev  * are met:
11*fa862482SVladimir Kondratyev  * 1. Redistributions of source code must retain the above copyright
12*fa862482SVladimir Kondratyev  *    notice unmodified, this list of conditions, and the following
13*fa862482SVladimir Kondratyev  *    disclaimer.
14*fa862482SVladimir Kondratyev  * 2. Redistributions in binary form must reproduce the above copyright
15*fa862482SVladimir Kondratyev  *    notice, this list of conditions and the following disclaimer in the
16*fa862482SVladimir Kondratyev  *    documentation and/or other materials provided with the distribution.
17*fa862482SVladimir Kondratyev  *
18*fa862482SVladimir Kondratyev  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19*fa862482SVladimir Kondratyev  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20*fa862482SVladimir Kondratyev  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21*fa862482SVladimir Kondratyev  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22*fa862482SVladimir Kondratyev  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23*fa862482SVladimir Kondratyev  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*fa862482SVladimir Kondratyev  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*fa862482SVladimir Kondratyev  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*fa862482SVladimir Kondratyev  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27*fa862482SVladimir Kondratyev  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*fa862482SVladimir Kondratyev  */
29*fa862482SVladimir Kondratyev 
30*fa862482SVladimir Kondratyev #ifndef _LINUXKPI_LINUX_CONTAINER_OF_H
31*fa862482SVladimir Kondratyev #define	_LINUXKPI_LINUX_CONTAINER_OF_H
32*fa862482SVladimir Kondratyev 
33*fa862482SVladimir Kondratyev #include <sys/stdint.h>
34*fa862482SVladimir Kondratyev 
35*fa862482SVladimir Kondratyev #include <linux/build_bug.h>
36*fa862482SVladimir Kondratyev #include <linux/stddef.h>
37*fa862482SVladimir Kondratyev 
38*fa862482SVladimir Kondratyev #define	container_of(ptr, type, member)				\
39*fa862482SVladimir Kondratyev ({								\
40*fa862482SVladimir Kondratyev 	const __typeof(((type *)0)->member) *__p = (ptr);	\
41*fa862482SVladimir Kondratyev 	(type *)((uintptr_t)__p - offsetof(type, member));	\
42*fa862482SVladimir Kondratyev })
43*fa862482SVladimir Kondratyev 
44*fa862482SVladimir Kondratyev #define	typeof_member(type, member)	__typeof(((type *)0)->member)
45*fa862482SVladimir Kondratyev 
46*fa862482SVladimir Kondratyev #endif
47