Port to new memory interface (WIP)
This commit is contained in:
1 parent
3f8c30e592
commit
bf617ab6ab
2 files changed
+68
-36
No files matched your search
+64
-36
@@ -101,8 +101,7 @@ m_bitset_reset(m_bitset_t t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Clear a bitset (DESTRUCTOR) */
|
/* Clear a bitset (DESTRUCTOR) */
|
||||||
M_INLINE void
|
M_P(void, m_bitset, _clear, m_bitset_t t)
|
||||||
m_bitset_clear(m_bitset_t t)
|
|
||||||
{
|
{
|
||||||
m_bitset_reset(t);
|
m_bitset_reset(t);
|
||||||
M_MEMORY_FREE(m_b1tset_limb_ct, t->ptr, t->alloc);
|
M_MEMORY_FREE(m_b1tset_limb_ct, t->ptr, t->alloc);
|
||||||
@@ -114,8 +113,7 @@ m_bitset_clear(m_bitset_t t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Set a bitset to another one */
|
/* Set a bitset to another one */
|
||||||
M_INLINE void
|
M_P(void, m_bitset, _set, m_bitset_t d, const m_bitset_t s)
|
||||||
m_bitset_set(m_bitset_t d, const m_bitset_t s)
|
|
||||||
{
|
{
|
||||||
M_B1TSET_CONTRACT(d);
|
M_B1TSET_CONTRACT(d);
|
||||||
M_B1TSET_CONTRACT(s);
|
M_B1TSET_CONTRACT(s);
|
||||||
@@ -141,15 +139,14 @@ m_bitset_set(m_bitset_t d, const m_bitset_t s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize & set a bitset to another one (CONSTRUCTOR) */
|
/* Initialize & set a bitset to another one (CONSTRUCTOR) */
|
||||||
M_INLINE void
|
M_P(void, m_bitset, _init_set, m_bitset_t d, const m_bitset_t s)
|
||||||
m_bitset_init_set(m_bitset_t d, const m_bitset_t s)
|
|
||||||
{
|
{
|
||||||
M_ASSERT (d != s);
|
M_ASSERT (d != s);
|
||||||
// In case of exception, d remains initialized,
|
// In case of exception, d remains initialized,
|
||||||
// but without any allocation done.
|
// but without any allocation done.
|
||||||
// Therefore it is safe, not to clear d on exception.
|
// Therefore it is safe, not to clear d on exception.
|
||||||
m_bitset_init(d);
|
m_bitset_init(d);
|
||||||
m_bitset_set(d, s);
|
m_bitset_set M_R(d, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize & move a bitset (CONSTRUCTOR) from another one (DESTRUCTOR) */
|
/* Initialize & move a bitset (CONSTRUCTOR) from another one (DESTRUCTOR) */
|
||||||
@@ -167,10 +164,9 @@ m_bitset_init_move(m_bitset_t d, m_bitset_t s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Move a bitset from another one (DESTRUCTOR) */
|
/* Move a bitset from another one (DESTRUCTOR) */
|
||||||
M_INLINE void
|
M_P(void, m_bitset, _move, m_bitset_t d, m_bitset_t s)
|
||||||
m_bitset_move(m_bitset_t d, m_bitset_t s)
|
|
||||||
{
|
{
|
||||||
m_bitset_clear(d);
|
m_bitset_clear M_R(d);
|
||||||
m_bitset_init_move (d, s);
|
m_bitset_init_move (d, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,8 +199,7 @@ m_bitset_flip_at(m_bitset_t v, size_t i)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Push back the boolean 'x' in the bitset (increasing the bitset) */
|
/* Push back the boolean 'x' in the bitset (increasing the bitset) */
|
||||||
M_INLINE void
|
M_P(void, m_bitset, _push_back, m_bitset_t v, bool x)
|
||||||
m_bitset_push_back (m_bitset_t v, bool x)
|
|
||||||
{
|
{
|
||||||
M_B1TSET_CONTRACT (v);
|
M_B1TSET_CONTRACT (v);
|
||||||
if (M_UNLIKELY (v->size >= M_B1TSET_FROM_ALLOC (v->alloc))) {
|
if (M_UNLIKELY (v->size >= M_B1TSET_FROM_ALLOC (v->alloc))) {
|
||||||
@@ -242,8 +237,7 @@ m_bitset_push_back (m_bitset_t v, bool x)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Resize the bitset to have exactly 'size' bits */
|
/* Resize the bitset to have exactly 'size' bits */
|
||||||
M_INLINE void
|
M_P(void, m_bitset, _resize, m_bitset_t v, size_t size)
|
||||||
m_bitset_resize (m_bitset_t v, size_t size)
|
|
||||||
{
|
{
|
||||||
M_B1TSET_CONTRACT (v);
|
M_B1TSET_CONTRACT (v);
|
||||||
// Check for overflow
|
// Check for overflow
|
||||||
@@ -290,8 +284,7 @@ m_bitset_resize (m_bitset_t v, size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Reserve allocation in the bitset to accommodate at least 'size' bits without reallocation */
|
/* Reserve allocation in the bitset to accommodate at least 'size' bits without reallocation */
|
||||||
M_INLINE void
|
M_P(void, m_bitset, _reserve, m_bitset_t v, size_t alloc)
|
||||||
m_bitset_reserve (m_bitset_t v, size_t alloc)
|
|
||||||
{
|
{
|
||||||
M_B1TSET_CONTRACT (v);
|
M_B1TSET_CONTRACT (v);
|
||||||
size_t oldAlloc = M_B1TSET_TO_ALLOC (v->size);
|
size_t oldAlloc = M_B1TSET_TO_ALLOC (v->size);
|
||||||
@@ -390,7 +383,7 @@ m_bitset_size(m_bitset_t v)
|
|||||||
return v->size;
|
return v->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the capacity in limbs of the bitset */
|
/* Return the capacity in bits of the bitset */
|
||||||
M_INLINE size_t
|
M_INLINE size_t
|
||||||
m_bitset_capacity(m_bitset_t v)
|
m_bitset_capacity(m_bitset_t v)
|
||||||
{
|
{
|
||||||
@@ -456,12 +449,11 @@ m_b1tset_rshift(m_b1tset_limb_ct ptr[], size_t n, m_b1tset_limb_ct carry)
|
|||||||
|
|
||||||
/* Insert a new bit at position 'key' of value 'value' in the bitset 'set'
|
/* Insert a new bit at position 'key' of value 'value' in the bitset 'set'
|
||||||
shifting the set accordingly */
|
shifting the set accordingly */
|
||||||
M_INLINE void
|
M_P(void, m_bitset, _push_at, m_bitset_t set, size_t key, bool value)
|
||||||
m_bitset_push_at(m_bitset_t set, size_t key, bool value)
|
|
||||||
{
|
{
|
||||||
M_B1TSET_CONTRACT (set);
|
M_B1TSET_CONTRACT (set);
|
||||||
// First push another value to extend the array to the right size
|
// First push another value to extend the array to the right size
|
||||||
m_bitset_push_back(set, false);
|
m_bitset_push_back M_R(set, false);
|
||||||
M_ASSERT (set->ptr != NULL);
|
M_ASSERT (set->ptr != NULL);
|
||||||
M_ASSERT_INDEX(key, set->size);
|
M_ASSERT_INDEX(key, set->size);
|
||||||
|
|
||||||
@@ -517,7 +509,7 @@ m_bitset_equal_p (const m_bitset_t set1, const m_bitset_t set2)
|
|||||||
M_B1TSET_CONTRACT (set2);
|
M_B1TSET_CONTRACT (set2);
|
||||||
if (set1->size != set2->size)
|
if (set1->size != set2->size)
|
||||||
return false;
|
return false;
|
||||||
/* We won't compare each bit individualy,
|
/* We won't compare each bit individually,
|
||||||
but instead compare them per limb */
|
but instead compare them per limb */
|
||||||
const size_t limbSize = (set1->size + M_B1TSET_LIMB_BIT -1) / M_B1TSET_LIMB_BIT;
|
const size_t limbSize = (set1->size + M_B1TSET_LIMB_BIT -1) / M_B1TSET_LIMB_BIT;
|
||||||
for(size_t i = 0 ; i < limbSize;i++)
|
for(size_t i = 0 ; i < limbSize;i++)
|
||||||
@@ -526,7 +518,7 @@ m_bitset_equal_p (const m_bitset_t set1, const m_bitset_t set2)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize an iterator to the first bit of the biset */
|
/* Initialize an iterator to the first bit of the bitset */
|
||||||
M_INLINE void
|
M_INLINE void
|
||||||
m_bitset_it(m_bitset_it_t it, m_bitset_t set)
|
m_bitset_it(m_bitset_it_t it, m_bitset_t set)
|
||||||
{
|
{
|
||||||
@@ -632,8 +624,7 @@ m_bitset_out_str(FILE *file, const m_bitset_t set)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Input the bitset from a formatted text in a FILE */
|
/* Input the bitset from a formatted text in a FILE */
|
||||||
M_INLINE bool
|
M_P(bool, m_bitset, _in_str, m_bitset_t set, FILE *file)
|
||||||
m_bitset_in_str(m_bitset_t set, FILE *file)
|
|
||||||
{
|
{
|
||||||
M_B1TSET_CONTRACT (set);
|
M_B1TSET_CONTRACT (set);
|
||||||
M_ASSERT(file != NULL);
|
M_ASSERT(file != NULL);
|
||||||
@@ -643,7 +634,7 @@ m_bitset_in_str(m_bitset_t set, FILE *file)
|
|||||||
c = fgetc(file);
|
c = fgetc(file);
|
||||||
while (c == '0' || c == '1') {
|
while (c == '0' || c == '1') {
|
||||||
const bool b = (c == '1');
|
const bool b = (c == '1');
|
||||||
m_bitset_push_back (set, b);
|
m_bitset_push_back M_R(set, b);
|
||||||
c = fgetc(file);
|
c = fgetc(file);
|
||||||
}
|
}
|
||||||
M_B1TSET_CONTRACT (set);
|
M_B1TSET_CONTRACT (set);
|
||||||
@@ -651,8 +642,7 @@ m_bitset_in_str(m_bitset_t set, FILE *file)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Parse the bitset from a formatted text in a C string */
|
/* Parse the bitset from a formatted text in a C string */
|
||||||
M_INLINE bool
|
M_P(bool, m_bitset, _parse_str, m_bitset_t set, const char str[], const char **endptr)
|
||||||
m_bitset_parse_str(m_bitset_t set, const char str[], const char **endptr)
|
|
||||||
{
|
{
|
||||||
M_B1TSET_CONTRACT (set);
|
M_B1TSET_CONTRACT (set);
|
||||||
M_ASSERT(str != NULL);
|
M_ASSERT(str != NULL);
|
||||||
@@ -664,7 +654,7 @@ m_bitset_parse_str(m_bitset_t set, const char str[], const char **endptr)
|
|||||||
do {
|
do {
|
||||||
if (M_UNLIKELY(c != '0' && c != '1')) goto exit;
|
if (M_UNLIKELY(c != '0' && c != '1')) goto exit;
|
||||||
const bool b = (c == '1');
|
const bool b = (c == '1');
|
||||||
m_bitset_push_back (set, b);
|
m_bitset_push_back M_R(set, b);
|
||||||
c = *str++;
|
c = *str++;
|
||||||
} while (c != ']' && c != 0);
|
} while (c != ']' && c != 0);
|
||||||
M_B1TSET_CONTRACT (set);
|
M_B1TSET_CONTRACT (set);
|
||||||
@@ -675,10 +665,9 @@ m_bitset_parse_str(m_bitset_t set, const char str[], const char **endptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Set the bitset from a formatted text in a C string */
|
/* Set the bitset from a formatted text in a C string */
|
||||||
M_INLINE bool
|
M_P(bool, m_bitset, _set_str, m_bitset_t dest, const char str[])
|
||||||
m_bitset_set_str(m_bitset_t dest, const char str[])
|
|
||||||
{
|
{
|
||||||
return m_bitset_parse_str(dest, str, NULL);
|
return m_bitset_parse_str M_R(dest, str, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Perform an AND operation between the bitsets,
|
/* Perform an AND operation between the bitsets,
|
||||||
@@ -886,8 +875,48 @@ m_bitset_popcount(const m_bitset_t set)
|
|||||||
,EQUAL(m_bitset_equal_p) \
|
,EQUAL(m_bitset_equal_p) \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/* Oplist for a bitset */
|
||||||
|
#define M_BITSET_POOL_OPLIST \
|
||||||
|
(INIT(m_bitset_init) \
|
||||||
|
,INIT_SET(API_0P(m_bitset_init_set)) \
|
||||||
|
,INIT_WITH(API_1(M_INIT_VAI)) \
|
||||||
|
,SET(API_0P(m_bitset_set)) \
|
||||||
|
,CLEAR(API_0P(m_bitset_clear)) \
|
||||||
|
,INIT_MOVE(m_bitset_init_move) \
|
||||||
|
,MOVE(API_0P(m_bitset_move)) \
|
||||||
|
,SWAP(m_bitset_swap) \
|
||||||
|
,TYPE(m_bitset_t) \
|
||||||
|
,SUBTYPE(bool) \
|
||||||
|
,EMPTY_P(m_bitset_empty_p), \
|
||||||
|
,GET_SIZE(m_bitset_size) \
|
||||||
|
,IT_TYPE(m_bitset_it_t) \
|
||||||
|
,IT_FIRST(m_bitset_it) \
|
||||||
|
,IT_SET(m_bitset_it_set) \
|
||||||
|
,IT_LAST(m_bitset_it_last) \
|
||||||
|
,IT_END(m_bitset_it_end) \
|
||||||
|
,IT_END_P(m_bitset_end_p) \
|
||||||
|
,IT_LAST_P(m_bitset_last_p) \
|
||||||
|
,IT_EQUAL_P(m_bitset_it_equal_p) \
|
||||||
|
,IT_NEXT(m_bitset_next) \
|
||||||
|
,IT_PREVIOUS(m_bitset_previous) \
|
||||||
|
,IT_CREF(m_bitset_cref) \
|
||||||
|
,RESET(m_bitset_reset) \
|
||||||
|
,PUSH(API_0P(m_bitset_push_back)) \
|
||||||
|
,POP(m_bitset_pop_back) \
|
||||||
|
,HASH(m_bitset_hash) \
|
||||||
|
,GET_STR(API_0P(m_bitset_get_str)) \
|
||||||
|
,OUT_STR(m_bitset_out_str) \
|
||||||
|
,PARSE_STR(API_0P(m_bitset_parse_str)) \
|
||||||
|
,IN_STR(API_0P(m_bitset_in_str)) \
|
||||||
|
,EQUAL(m_bitset_equal_p) \
|
||||||
|
)
|
||||||
|
|
||||||
/* Register the OPLIST as a global one */
|
/* Register the OPLIST as a global one */
|
||||||
|
#ifdef M_USE_POOL
|
||||||
|
#define M_OPL_m_bitset_t() M_BITSET_POOL_OPLIST
|
||||||
|
#else
|
||||||
#define M_OPL_m_bitset_t() M_BITSET_OPLIST
|
#define M_OPL_m_bitset_t() M_BITSET_OPLIST
|
||||||
|
#endif
|
||||||
|
|
||||||
// TODO: set_at2, insert_v, remove_v
|
// TODO: set_at2, insert_v, remove_v
|
||||||
|
|
||||||
@@ -965,18 +994,17 @@ M_BEGIN_PROTECTED_CODE
|
|||||||
|
|
||||||
/* Output to a m_string_t 'str' the formatted text representation of the bitset 'set'
|
/* Output to a m_string_t 'str' the formatted text representation of the bitset 'set'
|
||||||
or append it to the string (append=true) */
|
or append it to the string (append=true) */
|
||||||
M_INLINE void
|
M_P(void, m_bitset, _get_str, m_string_t str, const m_bitset_t set, bool append)
|
||||||
m_bitset_get_str(m_string_t str, const m_bitset_t set, bool append)
|
|
||||||
{
|
{
|
||||||
M_B1TSET_CONTRACT (set);
|
M_B1TSET_CONTRACT (set);
|
||||||
M_ASSERT(str != NULL);
|
M_ASSERT(str != NULL);
|
||||||
(append ? m_string_cat_cstr : m_string_set_cstr) (str, "[");
|
(append ? m_string_cat_cstr : m_string_set_cstr) M_R(str, "[");
|
||||||
for(size_t i = 0; i < set->size; i++) {
|
for(size_t i = 0; i < set->size; i++) {
|
||||||
const bool b = m_bitset_get (set, i);
|
const bool b = m_bitset_get (set, i);
|
||||||
const char c = b ? '1' : '0';
|
const char c = b ? '1' : '0';
|
||||||
m_string_push_back (str, c);
|
m_string_push_back M_R(str, c);
|
||||||
}
|
}
|
||||||
m_string_push_back (str, ']');
|
m_string_push_back M_R(str, ']');
|
||||||
}
|
}
|
||||||
|
|
||||||
M_END_PROTECTED_CODE
|
M_END_PROTECTED_CODE
|
||||||
|
|||||||
@@ -2202,7 +2202,11 @@ namespace m_lib {
|
|||||||
)
|
)
|
||||||
|
|
||||||
/* Register the OPLIST as a global one */
|
/* Register the OPLIST as a global one */
|
||||||
|
#ifdef M_USE_POOL
|
||||||
|
#define M_OPL_m_string_t() M_STRING_POOL_OPLIST
|
||||||
|
#else
|
||||||
#define M_OPL_m_string_t() M_STRING_OPLIST
|
#define M_OPL_m_string_t() M_STRING_OPLIST
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Register the string_t oplist as a generic type */
|
/* Register the string_t oplist as a generic type */
|
||||||
#define M_GENERIC_ORG_MLIB_COMP_CORE_OPLIST_1() M_STRING_OPLIST
|
#define M_GENERIC_ORG_MLIB_COMP_CORE_OPLIST_1() M_STRING_OPLIST
|
||||||
|
|||||||
Reference in new issue
Block a user