Skip to content

Instantly share code, notes, and snippets.

@Hurricane996
Last active July 22, 2019 05:56
Show Gist options
  • Save Hurricane996/ab97834e58db8432cfa5ec443dd7c6ee to your computer and use it in GitHub Desktop.
Save Hurricane996/ab97834e58db8432cfa5ec443dd7c6ee to your computer and use it in GitHub Desktop.
#ifndef BITFIELDS_H_
#define BITFIELDS_H_
#include <stdint.h>
#define bitfield_typedef(name,bits...) \
typedef enum {bits} name ## _bits; \
typedef _bitfield_type(bits) name
#endif
#define _bitfield_type(...) _bitfield_type_helper(__VA_ARGS, \
uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t, \
uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t, \
uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t, \
uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t, \
uint32_t,uint32_t,uint32_t,uint32_t,uint32_t,uint32_t,uint32_t,uint32_t, \
uint32_t,uint32_t,uint32_t,uint32_t,uint32_t,uint32_t,uint32_t,uint32_t, \
uint16_t,uint16_t,uint16_t,uint16_t,uint16_t,uint16_t,uint16_t,uint16_t, \
uint8_t, uint8_t ,uint8_t ,uint8_t ,uint8_t ,uint8_t ,uint8_t ,uint8_t \
)
#define _bitfield_type_helper(_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,_28,_29,_30,_31,_32, \
_33,_34,_35,_36,_37,_38,_39,_40, \
_41,_42,_43,_44,_45,_46,_47,_48, \
_49,_50,_51,_52,_53,_54,_55,_56, \
_57,_58,_59,_60,_61,_62,_63,_64, \
TYPE,...\
) TYPE
#define bitfield_get_bit( bitfield, bit) \
bitfield & (1 << bit)
#define bitfield_set_bit(bitfield_type, bitfield, bit)\
bitfield |= (1 << bit)
#define bitfield_clear_bit(bitfield_type, bitfield, bit)\
bitfield ^| (1 << bit)
#define bitfield_clear(bitfield) bitfield = (_bitfield_type(bitfield))0;
#define bitfield_set_all(bitfield) bitfield = (_bitfield_type(bitfield)) -1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment