59#ifndef CCC_FLAT_BITSET_H
60#define CCC_FLAT_BITSET_H
105#define CCC_flat_bitset_block_count(bit_capacity) \
106 CCC_private_flat_bitset_block_count(bit_capacity)
112#define CCC_flat_bitset_block_bytes(bit_capacity) \
113 CCC_private_flat_bitset_block_bytes(bit_capacity)
117#define CCC_flat_bitset_default() CCC_private_flat_bitset_default()
143#define CCC_flat_bitset_with_storage( \
144 count, compound_literal_array, optional_storage_specifier... \
146 CCC_private_flat_bitset_with_storage( \
147 count, compound_literal_array, optional_storage_specifier \
186#define CCC_flat_bitset_from( \
188 start_string_index, \
192 optional_capacity... \
194 CCC_private_flat_bitset_from( \
196 start_string_index, \
235#define CCC_flat_bitset_with_capacity(allocator, capacity, optional_count...) \
236 CCC_private_flat_bitset_with_capacity(allocator, capacity, optional_count)
276#define CCC_flat_bitset_storage_for( \
277 bit_compound_literal_array, optional_storage_specifier... \
279 CCC_private_flat_bitset_storage_for( \
280 bit_compound_literal_array, optional_storage_specifier \
317#define CCC_flat_bitset_for(cap, count, bitblock_pointer...) \
318 CCC_private_flat_bitset_for(cap, count, bitblock_pointer)
433 size_t range_start_index,
434 size_t range_bit_count,
465 CCC_Flat_bitset *bitset,
size_t range_start_index,
size_t range_bit_count
494 CCC_Flat_bitset *bitset,
size_t range_start_index,
size_t range_bit_count
519 size_t range_start_index,
520 size_t range_bit_count
539 size_t range_start_index,
540 size_t range_bit_count
559 size_t range_start_index,
560 size_t range_bit_count
580 size_t range_start_index,
581 size_t range_bit_count
608 size_t range_start_index,
609 size_t range_bit_count,
630 size_t range_start_index,
631 size_t range_bit_count
658 size_t range_start_index,
659 size_t range_bit_count,
708 size_t range_start_index,
709 size_t range_bit_count,
732 size_t range_start_index,
733 size_t range_bit_count
763 size_t range_start_index,
764 size_t range_bit_count,
958 size_t range_start_index,
959 size_t range_bit_count
1012#ifdef FLAT_BITSET_USING_NAMESPACE_CCC
1016# define FLAT_BITSET_BLOCK_BITS CCC_FLAT_BITSET_BLOCK_BITS
1017# define flat_bitset_block_count(arguments...) \
1018 CCC_flat_bitset_block_count(arguments)
1019# define flat_bitset_block_bytes(arguments...) \
1020 CCC_flat_bitset_block_bytes(arguments)
1021# define flat_bitset_storage_for(arguments...) \
1022 CCC_flat_bitset_storage_for(arguments)
1023# define flat_bitset_default(arguments...) CCC_flat_bitset_default(arguments)
1024# define flat_bitset_for(arguments...) CCC_flat_bitset_for(arguments)
1025# define flat_bitset_from(arguments...) CCC_flat_bitset_from(arguments)
1026# define flat_bitset_with_capacity(arguments...) \
1027 CCC_flat_bitset_with_capacity(arguments)
1028# define flat_bitset_with_storage(arguments...) \
1029 CCC_flat_bitset_with_storage(arguments)
1030# define flat_bitset_copy(arguments...) CCC_flat_bitset_copy(arguments)
1031# define flat_bitset_reserve(arguments...) CCC_flat_bitset_reserve(arguments)
1032# define flat_bitset_test(arguments...) CCC_flat_bitset_test(arguments)
1033# define flat_bitset_set(arguments...) CCC_flat_bitset_set(arguments)
1034# define flat_bitset_set_all(arguments...) CCC_flat_bitset_set_all(arguments)
1035# define flat_bitset_set_range(arguments...) \
1036 CCC_flat_bitset_set_range(arguments)
1037# define flat_bitset_reset(arguments...) CCC_flat_bitset_reset(arguments)
1038# define flat_bitset_reset_all(arguments...) \
1039 CCC_flat_bitset_reset_all(arguments)
1040# define flat_bitset_reset_range(arguments...) \
1041 CCC_flat_bitset_reset_range(arguments)
1042# define flat_bitset_flip(arguments...) CCC_flat_bitset_flip(arguments)
1043# define flat_bitset_flip_all(arguments...) \
1044 CCC_flat_bitset_flip_all(arguments)
1045# define flat_bitset_flip_range(arguments...) \
1046 CCC_flat_bitset_flip_range(arguments)
1047# define flat_bitset_any(arguments...) CCC_flat_bitset_any(arguments)
1048# define flat_bitset_any_range(arguments...) \
1049 CCC_flat_bitset_any_range(arguments)
1050# define flat_bitset_none(arguments...) CCC_flat_bitset_none(arguments)
1051# define flat_bitset_none_range(arguments...) \
1052 CCC_flat_bitset_none_range(arguments)
1053# define flat_bitset_all(arguments...) CCC_flat_bitset_all(arguments)
1054# define flat_bitset_all_range(arguments...) \
1055 CCC_flat_bitset_all_range(arguments)
1056# define flat_bitset_first_trailing_one(arguments...) \
1057 CCC_flat_bitset_first_trailing_one(arguments)
1058# define flat_bitset_first_trailing_one_range(arguments...) \
1059 CCC_flat_bitset_first_trailing_one_range(arguments)
1060# define flat_bitset_first_trailing_ones(arguments...) \
1061 CCC_flat_bitset_first_trailing_ones(arguments)
1062# define flat_bitset_first_trailing_ones_range(arguments...) \
1063 CCC_flat_bitset_first_trailing_ones_range(arguments)
1064# define flat_bitset_first_trailing_zero(arguments...) \
1065 CCC_flat_bitset_first_trailing_zero(arguments)
1066# define flat_bitset_first_trailing_zero_range(arguments...) \
1067 CCC_flat_bitset_first_trailing_zero_range(arguments)
1068# define flat_bitset_first_trailing_zeros(arguments...) \
1069 CCC_flat_bitset_first_trailing_zeros(arguments)
1070# define flat_bitset_first_trailing_zeros_range(arguments...) \
1071 CCC_flat_bitset_first_trailing_zeros_range(arguments)
1072# define flat_bitset_first_leading_one(arguments...) \
1073 CCC_flat_bitset_first_leading_one(arguments)
1074# define flat_bitset_first_leading_one_range(arguments...) \
1075 CCC_flat_bitset_first_leading_one_range(arguments)
1076# define flat_bitset_first_leading_ones(arguments...) \
1077 CCC_flat_bitset_first_leading_ones(arguments)
1078# define flat_bitset_first_leading_ones_range(arguments...) \
1079 CCC_flat_bitset_first_leading_ones_range(arguments)
1080# define flat_bitset_first_leading_zero(arguments...) \
1081 CCC_flat_bitset_first_leading_zero(arguments)
1082# define flat_bitset_first_leading_zero_range(arguments...) \
1083 CCC_flat_bitset_first_leading_zero_range(arguments)
1084# define flat_bitset_first_leading_zeros(arguments...) \
1085 CCC_flat_bitset_first_leading_zeros(arguments)
1086# define flat_bitset_first_leading_zeros_range(arguments...) \
1087 CCC_flat_bitset_first_leading_zeros_range(arguments)
1088# define flat_bitset_or(arguments...) CCC_flat_bitset_or(arguments)
1089# define flat_bitset_and(arguments...) CCC_flat_bitset_and(arguments)
1090# define flat_bitset_xor(arguments...) CCC_flat_bitset_xor(arguments)
1091# define flat_bitset_shift_left(arguments...) \
1092 CCC_flat_bitset_shift_left(arguments)
1093# define flat_bitset_shift_right(arguments...) \
1094 CCC_flat_bitset_shift_right(arguments)
1095# define flat_bitset_is_equal(arguments...) \
1096 CCC_flat_bitset_is_equal(arguments)
1097# define flat_bitset_is_proper_subset(arguments...) \
1098 CCC_flat_bitset_is_proper_subset(arguments)
1099# define flat_bitset_is_subset(arguments...) \
1100 CCC_flat_bitset_is_subset(arguments)
1101# define flat_bitset_data(arguments...) CCC_flat_bitset_data(arguments)
1102# define flat_bitset_capacity(arguments...) \
1103 CCC_flat_bitset_capacity(arguments)
1104# define flat_bitset_blocks_capacity(arguments...) \
1105 CCC_flat_bitset_blocks_capacity(arguments)
1106# define flat_bitset_count(arguments...) CCC_flat_bitset_count(arguments)
1107# define flat_bitset_blocks_count(arguments...) \
1108 CCC_flat_bitset_blocks_count(arguments)
1109# define flat_bitset_is_empty(arguments...) \
1110 CCC_flat_bitset_is_empty(arguments)
1111# define flat_bitset_popcount(arguments...) \
1112 CCC_flat_bitset_popcount(arguments)
1113# define flat_bitset_popcount_range(arguments...) \
1114 CCC_flat_bitset_popcount_range(arguments)
1115# define flat_bitset_clear(arguments...) CCC_flat_bitset_clear(arguments)
1116# define flat_bitset_clear_and_free(arguments...) \
1117 CCC_flat_bitset_clear_and_free(arguments)
1118# define flat_bitset_push_back(arguments...) \
1119 CCC_flat_bitset_push_back(arguments)
1120# define flat_bitset_pop_back(arguments...) \
1121 CCC_flat_bitset_pop_back(arguments)
CCC_Tribool CCC_flat_bitset_is_empty(CCC_Flat_bitset const *bitset)
Return true if no bits are actively tracked by the user and set.
CCC_Tribool CCC_flat_bitset_set(CCC_Flat_bitset *bitset, size_t index, CCC_Tribool bit)
Set the bit at valid index index to value bit (true or false).
CCC_Count CCC_flat_bitset_first_leading_one(CCC_Flat_bitset const *bitset)
Return the index of the first leading bit set to 1 in the set, starting from the Most Significant Bit...
CCC_Tribool CCC_flat_bitset_is_proper_subset(CCC_Flat_bitset const *subset, CCC_Flat_bitset const *set)
Return CCC_TRUE if subset is a proper subset of set (subset ⊂ set).
CCC_Count CCC_flat_bitset_first_trailing_zeros_range(CCC_Flat_bitset const *bitset, size_t range_start_index, size_t range_bit_count, size_t zeros_count)
Returns the index of the start of the first trailing zeros_count contiguous 0 bits in the range [rang...
CCC_Count CCC_flat_bitset_first_trailing_ones_range(CCC_Flat_bitset const *bitset, size_t range_start_index, size_t range_bit_count, size_t ones_count)
Returns the index of the start of the first trailing number of contiguous 1 bits in the range [range_...
CCC_Result CCC_flat_bitset_reserve(CCC_Flat_bitset *bitset, size_t to_add, CCC_Allocator const *allocator)
Reserves space for at least to_add more bits.
CCC_Count CCC_flat_bitset_first_leading_zero(CCC_Flat_bitset const *bitset)
Return the index of the first leading bit set to 0 in the set, starting from the Most Significant Bit...
CCC_Count CCC_flat_bitset_first_leading_ones(CCC_Flat_bitset const *bitset, size_t ones_count)
Returns the index of the start of the first leading bit_count contiguous 1 bits.
CCC_Result CCC_flat_bitset_clear_and_free(CCC_Flat_bitset *bitset, CCC_Allocator const *allocator)
Clears the bit set by setting the size to 0 and freeing the underlying memory. Capacity becomes 0 as ...
CCC_Count CCC_flat_bitset_first_trailing_zero(CCC_Flat_bitset const *bitset)
Return the index of the first bit set to 0 in the set.
CCC_Count CCC_flat_bitset_count(CCC_Flat_bitset const *bitset)
Return total number of bits actively tracked by the user and set.
CCC_Tribool CCC_flat_bitset_any_range(CCC_Flat_bitset const *bitset, size_t range_start_index, size_t range_bit_count)
Return true if any bits are 1 in the range [range_start_index, range_start_index + range_bit_count).
CCC_Tribool CCC_flat_bitset_none_range(CCC_Flat_bitset const *bitset, size_t range_start_index, size_t range_bit_count)
Return true if all bits are 0 in the range [range_start_index, range_start_index + range_bit_count).
CCC_Result CCC_flat_bitset_set_all(CCC_Flat_bitset *bitset, CCC_Tribool bit)
Set all the bits to the provided value (CCC_TRUE or CCC_FALSE).
CCC_Result CCC_flat_bitset_shift_left(CCC_Flat_bitset *bitset, size_t left_shifts)
Shift the bit set left by left_shifts amount.
CCC_Tribool CCC_flat_bitset_is_equal(CCC_Flat_bitset const *left, CCC_Flat_bitset const *right)
Checks two bit sets of the same size (not capacity) for equality.
CCC_Result CCC_flat_bitset_push_back(CCC_Flat_bitset *bitset, CCC_Tribool bit, CCC_Allocator const *allocator)
Append a bit value to the set as the new Most Significant Bit.
@ CCC_FLAT_BITSET_BLOCK_BITS
The number of bits in a block of the bit set.
Definition: flat_bitset.h:98
CCC_Result CCC_flat_bitset_and(CCC_Flat_bitset *destination, CCC_Flat_bitset const *source)
Bitwise AND destination set with source set.
CCC_Tribool CCC_flat_bitset_is_subset(CCC_Flat_bitset const *subset, CCC_Flat_bitset const *set)
Return CCC_TRUE if subset is a subset of set (subset ⊆ set).
CCC_Result CCC_flat_bitset_set_range(CCC_Flat_bitset *bitset, size_t range_start_index, size_t range_bit_count, CCC_Tribool bit)
Set all the bits in the specified range starting at the Least Significant Bit of the range and ending...
CCC_Tribool CCC_flat_bitset_any(CCC_Flat_bitset const *bitset)
Return true if any bits in set are 1.
CCC_Count CCC_flat_bitset_first_leading_one_range(CCC_Flat_bitset const *bitset, size_t index, size_t count)
Return the index of the first leading bit set to 1 in the range [range_start_index,...
void * CCC_flat_bitset_data(CCC_Flat_bitset const *bitset)
Return a reference to the base of the underlying block array.
CCC_Count CCC_flat_bitset_first_trailing_zeros(CCC_Flat_bitset const *bitset, size_t zeros_count)
Returns the index of the start of the first trailing number of contiguous 0 bits in the set.
CCC_Count CCC_flat_bitset_capacity(CCC_Flat_bitset const *bitset)
Return total number of bits the capacity of the set can hold.
CCC_Count CCC_flat_bitset_first_leading_zero_range(CCC_Flat_bitset const *bitset, size_t range_start_index, size_t range_bit_count)
Return the index of the first leading bit set to 0 in the range [range_start_index,...
CCC_Count CCC_flat_bitset_first_leading_ones_range(CCC_Flat_bitset const *bitset, size_t range_start_index, size_t range_bit_count, size_t ones_count)
Returns the index of the start of the first leading bit_count contiguous 1 bits in the range [range_s...
CCC_Result CCC_flat_bitset_or(CCC_Flat_bitset *destination, CCC_Flat_bitset const *source)
Bitwise OR destination set with source set.
CCC_Result CCC_flat_bitset_flip_all(CCC_Flat_bitset *bitset)
Toggle all of the bits to their opposing boolean value.
CCC_Tribool CCC_flat_bitset_pop_back(CCC_Flat_bitset *bitset)
Remove the Most Significant Bit from the set.
CCC_Tribool CCC_flat_bitset_reset(CCC_Flat_bitset *bitset, size_t index)
Set the bit at valid index index to boolean value b (true or false).
CCC_Tribool CCC_flat_bitset_test(CCC_Flat_bitset const *bitset, size_t index)
Test the bit at index index for boolean status (CCC_TRUE or CCC_FALSE).
CCC_Count CCC_flat_bitset_first_leading_zeros(CCC_Flat_bitset const *bitset, size_t zeros_count)
Returns the index of the start of the first leading number of contiguous 0 bits.
CCC_Count CCC_flat_bitset_first_trailing_one(CCC_Flat_bitset const *bitset)
Return the index of the first trailing bit set to 1 in the set.
CCC_Tribool CCC_flat_bitset_all_range(CCC_Flat_bitset const *bitset, size_t range_start_index, size_t range_bit_count)
Return true if all bits are set to 1 in the range [range_start_index, range_start_index + range_bit_c...
CCC_Result CCC_flat_bitset_reset_range(CCC_Flat_bitset *bitset, size_t range_start_index, size_t range_bit_count)
Set all the bits in the specified range starting at the Least Significant Bit of the range and ending...
CCC_Count CCC_flat_bitset_popcount(CCC_Flat_bitset const *bitset)
Return the number of bits set to CCC_TRUE. O(n).
CCC_Count CCC_flat_bitset_blocks_count(CCC_Flat_bitset const *bitset)
Return number of CCC_bitblocks used by the bit set for size bits.
CCC_Result CCC_flat_bitset_copy(CCC_Flat_bitset *destination, CCC_Flat_bitset const *source, CCC_Allocator const *allocator)
Copy the bit set at source to destination.
CCC_Count CCC_flat_bitset_blocks_capacity(CCC_Flat_bitset const *bitset)
Return number of CCC_bitblocks used by bit set for capacity bits.
CCC_Result CCC_flat_bitset_xor(CCC_Flat_bitset *destination, CCC_Flat_bitset const *source)
Bitwise XOR destination set with source set.
CCC_Count CCC_flat_bitset_first_trailing_zero_range(CCC_Flat_bitset const *bitset, size_t range_start_index, size_t range_bit_count)
Return the index of the first bit set to 0 in the range [range_start_index, range_start_index + range...
CCC_Result CCC_flat_bitset_reset_all(CCC_Flat_bitset *bitset)
Set all the bits to CCC_FALSE.
CCC_Count CCC_flat_bitset_popcount_range(CCC_Flat_bitset const *bitset, size_t range_start_index, size_t range_bit_count)
Return the number of bits set to CCC_TRUE in the range. O(n).
uint8_t CCC_Bit
A type to represent a single bit in the bit set.
Definition: flat_bitset.h:79
CCC_Result CCC_flat_bitset_flip_range(CCC_Flat_bitset *bitset, size_t range_start_index, size_t range_bit_count)
Flip all the bits in the range, starting at the Least Significant Bit in range and ending at the Most...
CCC_Count CCC_flat_bitset_first_trailing_one_range(CCC_Flat_bitset const *bitset, size_t range_start_index, size_t range_bit_count)
Return the index of the first trailing bit set to 1 in the range [range_start_index,...
CCC_Tribool CCC_flat_bitset_all(CCC_Flat_bitset const *bitset)
Return true if all bits in set are 1.
CCC_Tribool CCC_flat_bitset_flip(CCC_Flat_bitset *bitset, size_t index)
Toggle the bit at index i.
CCC_Tribool CCC_flat_bitset_none(CCC_Flat_bitset const *bitset)
Return true if all bits are set to 0.
CCC_Result CCC_flat_bitset_shift_right(CCC_Flat_bitset *bitset, size_t right_shifts)
Shift the bit set right by right_shifts amount.
CCC_Count CCC_flat_bitset_first_trailing_ones(CCC_Flat_bitset const *bitset, size_t ones_count)
Returns the index of the start of the first trailing number of contiguous 1 bits.
CCC_Count CCC_flat_bitset_first_leading_zeros_range(CCC_Flat_bitset const *bitset, size_t range_start_index, size_t range_bit_count, size_t zeros_count)
Returns the index of the start of the first leading number of contiguous 0 bits in the range [range_s...
CCC_Result CCC_flat_bitset_clear(CCC_Flat_bitset *bitset)
Clears the bit set by setting the size to 0 and all bits to 0. The underlying memory capacity remains...
The Private Flat Bitset Types and Interface.
@ CCC_PRIVATE_FLAT_BITSET_BLOCK_BITS
Definition: private_flat_bitset.h:52
The type passed by reference to any container function that may need to allocate memory....
Definition: types.h:384
A type for returning an unsigned integer from a container for counting. Intended to count sizes,...
Definition: types.h:243
Definition: private_flat_bitset.h:41
size_t count
Definition: private_flat_bitset.h:45
The C Container Collection Fundamental Types.
CCC_Tribool
A three state boolean to allow for an error state. Error is -1, False is 0, and True is 1.
Definition: types.h:178
CCC_Result
A result of actions on containers.
Definition: types.h:192