Main Page | Class List | Directories | File List | Class Members | File Members

multiset.h File Reference

#include "svalue.h"
#include "dmalloc.h"
#include "rbtree.h"
#include "block_alloc_h.h"

Go to the source code of this file.

Classes

struct  msnode_ind
struct  msnode_indval
union  msnode
struct  multiset_data
struct  multiset

Defines

#define MULTISET_FLAG_MARKER   0x1000
#define MULTISET_FLAG_MASK   (RB_FLAG_MASK | MULTISET_FLAG_MARKER)
#define MULTISET_WEAK_INDICES   2
#define MULTISET_WEAK_VALUES   4
#define MULTISET_WEAK   6
#define MULTISET_INDVAL   8
#define msnode_check(X)   ((union msnode *) (X))
#define MULTISET_STEP_FUNC(FUNC, NODE)   ((union msnode *) FUNC ((struct rb_node_hdr *) msnode_check (NODE)))
#define low_multiset_first(MSD)   MULTISET_STEP_FUNC (rb_first, (MSD)->root)
#define low_multiset_last(MSD)   MULTISET_STEP_FUNC (rb_last, (MSD)->root)
#define low_multiset_prev(NODE)   MULTISET_STEP_FUNC (rb_prev, NODE)
#define low_multiset_next(NODE)   MULTISET_STEP_FUNC (rb_next, NODE)
#define low_multiset_get_nth(MSD, N)   ((union msnode *) rb_get_nth ((struct rb_node_hdr *) (MSD)->root, (N)))
#define low_assign_multiset_index_no_free(TO, NODE)
#define low_assign_multiset_index(TO, NODE)
#define low_push_multiset_index(NODE)   low_assign_multiset_index_no_free (Pike_sp++, (NODE))
#define low_use_multiset_index(NODE, VAR)
#define low_get_multiset_value(MSD, NODE)   ((MSD)->flags & MULTISET_INDVAL ? &(NODE)->iv.val : &svalue_int_one)
#define low_set_multiset_value(MSD, NODE, VAL)
#define OFF2MSNODE(MSD, OFFSET)
#define MSNODE2OFF(MSD, NODE)
#define l_sizeof(L)   multiset_sizeof (L)
#define multiset_ind_types(L)   ((L)->msd->ind_types)
#define multiset_val_types(L)   ((L)->msd->val_types)
#define multiset_get_flags(L)   ((L)->msd->flags)
#define multiset_get_cmp_less(L)   (&(L)->msd->cmp_less)
#define multiset_indval(L)   ((L)->msd->flags & MULTISET_INDVAL)
#define multiset_is_empty(L)   (!(L)->msd->root)
#define free_multiset(L)
#define check_msnode(L, NODEPOS, ALLOW_DELETED)
#define access_msnode(L, NODEPOS)   OFF2MSNODE ((L)->msd, (NODEPOS))
#define add_msnode_ref(L)   do {(L)->node_refs++;} while (0)
#define sub_msnode_ref(L)
#define assign_multiset_index_no_free(TO, L, NODEPOS)
#define assign_multiset_index(TO, L, NODEPOS)
#define push_multiset_index(L, NODEPOS)   assign_multiset_index_no_free (Pike_sp++, (L), (NODEPOS))
#define use_multiset_index(L, NODEPOS, VAR)
#define get_multiset_value(L, NODEPOS)
#define set_multiset_value(L, NODEPOS, VAL)
#define assign_multiset_value_no_free(TO, L, NODEPOS)   assign_svalue_no_free (TO, get_multiset_value (L, NODEPOS))
#define assign_multiset_value(TO, L, NODEPOS)   assign_svalue (TO, get_multiset_value (L, NODEPOS))
#define push_multiset_value(L, NODEPOS)   push_svalue (get_multiset_value (L, NODEPOS))
#define allocate_multiset(allocsize, flags, cmp_less)
#define gc_cycle_check_multiset(X, WEAK)   gc_cycle_enqueue ((gc_cycle_check_cb *) real_gc_cycle_check_multiset, (X), (WEAK))

Functions

PMOD_EXPORT void multiset_clear_node_refs (struct multiset *l)
msnodelow_multiset_find_eq (struct multiset *l, struct svalue *key)
PMOD_EXPORT INT32 multiset_sizeof (struct multiset *l)
PMOD_PROTO void really_free_multiset (struct multiset *l)
 BLOCK_ALLOC_FILL_PAGES (multiset, 2)
PMOD_EXPORT ptrdiff_t multiset_find_eq (struct multiset *l, struct svalue *key)
PMOD_EXPORT ptrdiff_t multiset_find_lt (struct multiset *l, struct svalue *key)
PMOD_EXPORT ptrdiff_t multiset_find_gt (struct multiset *l, struct svalue *key)
PMOD_EXPORT ptrdiff_t multiset_find_le (struct multiset *l, struct svalue *key)
PMOD_EXPORT ptrdiff_t multiset_find_ge (struct multiset *l, struct svalue *key)
PMOD_EXPORT ptrdiff_t multiset_first (struct multiset *l)
PMOD_EXPORT ptrdiff_t multiset_last (struct multiset *l)
PMOD_EXPORT ptrdiff_t multiset_prev (struct multiset *l, ptrdiff_t nodepos)
PMOD_EXPORT ptrdiff_t multiset_next (struct multiset *l, ptrdiff_t nodepos)
PMOD_EXPORT void do_sub_msnode_ref (struct multiset *l)
PMOD_EXPORT int msnode_is_deleted (struct multiset *l, ptrdiff_t nodepos)
PMOD_EXPORT struct multisetreal_allocate_multiset (int allocsize, int flags, struct svalue *cmp_less)
PMOD_EXPORT void do_free_multiset (struct multiset *l)
void multiset_fix_type_field (struct multiset *l)
PMOD_EXPORT void multiset_set_flags (struct multiset *l, int flags)
PMOD_EXPORT void multiset_set_cmp_less (struct multiset *l, struct svalue *cmp_less)
PMOD_EXPORT struct multisetmkmultiset (struct array *indices)
PMOD_EXPORT struct multisetmkmultiset_2 (struct array *indices, struct array *values, struct svalue *cmp_less)
PMOD_EXPORT void multiset_insert (struct multiset *l, struct svalue *ind)
PMOD_EXPORT ptrdiff_t multiset_insert_2 (struct multiset *l, struct svalue *ind, struct svalue *val, int replace)
PMOD_EXPORT ptrdiff_t multiset_add (struct multiset *l, struct svalue *ind, struct svalue *val)
PMOD_EXPORT ptrdiff_t multiset_add_after (struct multiset *l, ptrdiff_t node, struct svalue *ind, struct svalue *val)
PMOD_EXPORT int multiset_delete (struct multiset *l, struct svalue *ind)
PMOD_EXPORT int multiset_delete_2 (struct multiset *l, struct svalue *ind, struct svalue *removed_val)
PMOD_EXPORT void multiset_delete_node (struct multiset *l, ptrdiff_t node)
PMOD_EXPORT int multiset_member (struct multiset *l, struct svalue *key)
PMOD_EXPORT struct svaluemultiset_lookup (struct multiset *l, struct svalue *key)
arraymultiset_indices (struct multiset *l)
arraymultiset_values (struct multiset *l)
arraymultiset_range_indices (struct multiset *l, ptrdiff_t beg, ptrdiff_t end)
arraymultiset_range_values (struct multiset *l, ptrdiff_t beg, ptrdiff_t end)
PMOD_EXPORT void check_multiset_for_destruct (struct multiset *l)
PMOD_EXPORT struct multisetcopy_multiset (struct multiset *l)
PMOD_EXPORT struct multisetmerge_multisets (struct multiset *a, struct multiset *b, int operation)
PMOD_EXPORT struct multisetadd_multisets (struct svalue *argp, int count)
PMOD_EXPORT int multiset_equal_p (struct multiset *a, struct multiset *b, struct processing *p)
void describe_multiset (struct multiset *l, struct processing *p, int indent)
void simple_describe_multiset (struct multiset *l)
int multiset_is_constant (struct multiset *l, struct processing *p)
nodemake_node_from_multiset (struct multiset *l)
PMOD_EXPORT void f_aggregate_multiset (int args)
multisetcopy_multiset_recursively (struct multiset *l, struct mapping *p)
PMOD_EXPORT ptrdiff_t multiset_get_nth (struct multiset *l, size_t n)
unsigned gc_touch_all_multisets (void)
void gc_check_all_multisets (void)
void gc_mark_multiset_as_referenced (struct multiset *l)
void gc_mark_all_multisets (void)
void gc_zap_ext_weak_refs_in_multisets (void)
void real_gc_cycle_check_multiset (struct multiset *l, int weak)
void gc_cycle_check_all_multisets (void)
size_t gc_free_all_unreferenced_multisets (void)
void count_memory_in_multisets (INT32 *num, INT32 *size)
void init_multiset (void)
void exit_multiset (void)
void test_multiset (void)

Variables

multisetfirst_multiset
multisetgc_internal_multiset
PMOD_EXPORT struct svalue svalue_int_one


Define Documentation

#define access_msnode L,
NODEPOS   )     OFF2MSNODE ((L)->msd, (NODEPOS))
 

#define add_msnode_ref  )     do {(L)->node_refs++;} while (0)
 

#define allocate_multiset allocsize,
flags,
cmp_less   ) 
 

Value:

dmalloc_touch (struct multiset *,                                       \
                 real_allocate_multiset ((allocsize), (flags), (cmp_less)))

#define assign_multiset_index TO,
L,
NODEPOS   ) 
 

Value:

do {                    \
    struct multiset *_ms_ = (L);                                        \
    union msnode *_ms_node_ = access_msnode (_ms_, (NODEPOS));          \
    low_assign_multiset_index (TO, _ms_node_);                          \
  } while (0)

#define assign_multiset_index_no_free TO,
L,
NODEPOS   ) 
 

Value:

do {            \
    struct multiset *_ms_ = (L);                                        \
    union msnode *_ms_node_ = access_msnode (_ms_, (NODEPOS));          \
    low_assign_multiset_index_no_free (TO, _ms_node_);                  \
  } while (0)

#define assign_multiset_value TO,
L,
NODEPOS   )     assign_svalue (TO, get_multiset_value (L, NODEPOS))
 

#define assign_multiset_value_no_free TO,
L,
NODEPOS   )     assign_svalue_no_free (TO, get_multiset_value (L, NODEPOS))
 

#define check_msnode L,
NODEPOS,
ALLOW_DELETED   ) 
 

#define free_multiset  ) 
 

Value:

do {                                            \
    struct multiset *_ms_ = (L);                                        \
    debug_malloc_touch (_ms_);                                          \
    DO_IF_DEBUG (                                                       \
      DO_IF_PIKE_CLEANUP (                                              \
        if (gc_external_refs_zapped)                                    \
          gc_check_zapped (_ms_, PIKE_T_MULTISET, __FILE__, __LINE__))); \
    if (!sub_ref (_ms_)) really_free_multiset (_ms_);                   \
  } while (0)

#define gc_cycle_check_multiset X,
WEAK   )     gc_cycle_enqueue ((gc_cycle_check_cb *) real_gc_cycle_check_multiset, (X), (WEAK))
 

#define get_multiset_value L,
NODEPOS   ) 
 

Value:

((L)->msd->flags & MULTISET_INDVAL ?                                    \
   &access_msnode ((L), (NODEPOS))->iv.val : &svalue_int_one)

#define l_sizeof  )     multiset_sizeof (L)
 

#define low_assign_multiset_index TO,
NODE   ) 
 

Value:

do {                    \
    struct svalue *_ms_index_to2_ = (TO);                               \
    free_svalue (_ms_index_to2_);                                       \
    low_assign_multiset_index_no_free (_ms_index_to2_, (NODE));         \
  } while (0)

#define low_assign_multiset_index_no_free TO,
NODE   ) 
 

Value:

do {            \
    struct svalue *_ms_index_to_ = (TO);                                \
    *_ms_index_to_ = msnode_check (NODE)->i.ind;                        \
    DO_IF_DEBUG (                                                       \
      if (!(_ms_index_to_->type & MULTISET_FLAG_MARKER))                \
        Pike_fatal (msg_no_multiset_flag_marker);                       \
    );                                                                  \
    _ms_index_to_->type &= ~MULTISET_FLAG_MASK;                         \
    add_ref_svalue (_ms_index_to_);                                     \
  } while (0)

#define low_get_multiset_value MSD,
NODE   )     ((MSD)->flags & MULTISET_INDVAL ? &(NODE)->iv.val : &svalue_int_one)
 

#define low_multiset_first MSD   )     MULTISET_STEP_FUNC (rb_first, (MSD)->root)
 

#define low_multiset_get_nth MSD,
 )     ((union msnode *) rb_get_nth ((struct rb_node_hdr *) (MSD)->root, (N)))
 

#define low_multiset_last MSD   )     MULTISET_STEP_FUNC (rb_last, (MSD)->root)
 

#define low_multiset_next NODE   )     MULTISET_STEP_FUNC (rb_next, NODE)
 

#define low_multiset_prev NODE   )     MULTISET_STEP_FUNC (rb_prev, NODE)
 

#define low_push_multiset_index NODE   )     low_assign_multiset_index_no_free (Pike_sp++, (NODE))
 

#define low_set_multiset_value MSD,
NODE,
VAL   ) 
 

Value:

do {                    \
    if ((MSD)->flags & MULTISET_INDVAL)                                 \
      assign_svalue (&(NODE)->iv.val, VAL);                             \
  } while (0)

#define low_use_multiset_index NODE,
VAR   ) 
 

Value:

((VAR) = msnode_check (NODE)->i.ind,                                    \
   DO_IF_DEBUG ((VAR).type & MULTISET_FLAG_MARKER ? 0 :                 \
                (Pike_fatal (msg_no_multiset_flag_marker), 0) COMMA)    \
   (VAR).type &= ~MULTISET_FLAG_MASK,                                   \
   &(VAR))

#define MSNODE2OFF MSD,
NODE   ) 
 

Value:

((MSD)->flags & MULTISET_INDVAL ?                                       \
   &(NODE)->iv - &(MSD)->nodes->iv : &(NODE)->i - &(MSD)->nodes->i)

#define msnode_check  )     ((union msnode *) (X))
 

#define MULTISET_FLAG_MARKER   0x1000
 

#define MULTISET_FLAG_MASK   (RB_FLAG_MASK | MULTISET_FLAG_MARKER)
 

#define multiset_get_cmp_less  )     (&(L)->msd->cmp_less)
 

#define multiset_get_flags  )     ((L)->msd->flags)
 

#define multiset_ind_types  )     ((L)->msd->ind_types)
 

#define multiset_indval  )     ((L)->msd->flags & MULTISET_INDVAL)
 

#define MULTISET_INDVAL   8
 

#define multiset_is_empty  )     (!(L)->msd->root)
 

#define MULTISET_STEP_FUNC FUNC,
NODE   )     ((union msnode *) FUNC ((struct rb_node_hdr *) msnode_check (NODE)))
 

#define multiset_val_types  )     ((L)->msd->val_types)
 

#define MULTISET_WEAK   6
 

#define MULTISET_WEAK_INDICES   2
 

#define MULTISET_WEAK_VALUES   4
 

#define OFF2MSNODE MSD,
OFFSET   ) 
 

Value:

((MSD)->flags & MULTISET_INDVAL ?                                       \
   (union msnode *) (&(MSD)->nodes->iv + (OFFSET)) :                    \
   (union msnode *) (&(MSD)->nodes->i + (OFFSET)))

#define push_multiset_index L,
NODEPOS   )     assign_multiset_index_no_free (Pike_sp++, (L), (NODEPOS))
 

#define push_multiset_value L,
NODEPOS   )     push_svalue (get_multiset_value (L, NODEPOS))
 

#define set_multiset_value L,
NODEPOS,
VAL   ) 
 

Value:

do {                    \
    if ((L)->msd->flags & MULTISET_INDVAL)                              \
      assign_svalue (&access_msnode ((L), (NODEPOS))->iv.val, VAL);     \
  } while (0)

#define sub_msnode_ref  ) 
 

Value:

do {                                            \
    struct multiset *_ms_ = (L);                                        \
    DO_IF_DEBUG (                                                       \
      if (!_ms_->node_refs) Pike_fatal (msg_multiset_no_node_refs);     \
    );                                                                  \
    if (!--_ms_->node_refs && _ms_->msd->refs == 1)                     \
      multiset_clear_node_refs (_ms_);                                  \
  } while (0)

#define use_multiset_index L,
NODEPOS,
VAR   ) 
 

Value:

((VAR) = access_msnode ((L), (NODEPOS))->i.ind,                 \
   (VAR).type &= ~MULTISET_FLAG_MASK,                                   \
   &(VAR))


Function Documentation

PMOD_EXPORT struct multiset* add_multisets struct svalue argp,
int  count
 

BLOCK_ALLOC_FILL_PAGES multiset  ,
 

PMOD_EXPORT void check_multiset_for_destruct struct multiset l  ) 
 

PMOD_EXPORT struct multiset* copy_multiset struct multiset l  ) 
 

struct multiset* copy_multiset_recursively struct multiset l,
struct mapping p
 

void count_memory_in_multisets INT32 *  num,
INT32 *  size
 

void describe_multiset struct multiset l,
struct processing p,
int  indent
 

PMOD_EXPORT void do_free_multiset struct multiset l  ) 
 

PMOD_EXPORT void do_sub_msnode_ref struct multiset l  ) 
 

void exit_multiset void   ) 
 

PMOD_EXPORT void f_aggregate_multiset int  args  ) 
 

void gc_check_all_multisets void   ) 
 

void gc_cycle_check_all_multisets void   ) 
 

size_t gc_free_all_unreferenced_multisets void   ) 
 

void gc_mark_all_multisets void   ) 
 

void gc_mark_multiset_as_referenced struct multiset l  ) 
 

unsigned gc_touch_all_multisets void   ) 
 

void gc_zap_ext_weak_refs_in_multisets void   ) 
 

void init_multiset void   ) 
 

union msnode* low_multiset_find_eq struct multiset l,
struct svalue key
 

node* make_node_from_multiset struct multiset l  ) 
 

PMOD_EXPORT struct multiset* merge_multisets struct multiset a,
struct multiset b,
int  operation
 

PMOD_EXPORT struct multiset* mkmultiset struct array indices  ) 
 

PMOD_EXPORT struct multiset* mkmultiset_2 struct array indices,
struct array values,
struct svalue cmp_less
 

PMOD_EXPORT int msnode_is_deleted struct multiset l,
ptrdiff_t  nodepos
 

PMOD_EXPORT ptrdiff_t multiset_add struct multiset l,
struct svalue ind,
struct svalue val
 

PMOD_EXPORT ptrdiff_t multiset_add_after struct multiset l,
ptrdiff_t  node,
struct svalue ind,
struct svalue val
 

PMOD_EXPORT void multiset_clear_node_refs struct multiset l  ) 
 

PMOD_EXPORT int multiset_delete struct multiset l,
struct svalue ind
 

PMOD_EXPORT int multiset_delete_2 struct multiset l,
struct svalue ind,
struct svalue removed_val
 

PMOD_EXPORT void multiset_delete_node struct multiset l,
ptrdiff_t  node
 

PMOD_EXPORT int multiset_equal_p struct multiset a,
struct multiset b,
struct processing p
 

PMOD_EXPORT ptrdiff_t multiset_find_eq struct multiset l,
struct svalue key
 

PMOD_EXPORT ptrdiff_t multiset_find_ge struct multiset l,
struct svalue key
 

PMOD_EXPORT ptrdiff_t multiset_find_gt struct multiset l,
struct svalue key
 

PMOD_EXPORT ptrdiff_t multiset_find_le struct multiset l,
struct svalue key
 

PMOD_EXPORT ptrdiff_t multiset_find_lt struct multiset l,
struct svalue key
 

PMOD_EXPORT ptrdiff_t multiset_first struct multiset l  ) 
 

void multiset_fix_type_field struct multiset l  ) 
 

PMOD_EXPORT ptrdiff_t multiset_get_nth struct multiset l,
size_t  n
 

struct array* multiset_indices struct multiset l  ) 
 

PMOD_EXPORT void multiset_insert struct multiset l,
struct svalue ind
 

PMOD_EXPORT ptrdiff_t multiset_insert_2 struct multiset l,
struct svalue ind,
struct svalue val,
int  replace
 

int multiset_is_constant struct multiset l,
struct processing p
 

PMOD_EXPORT ptrdiff_t multiset_last struct multiset l  ) 
 

PMOD_EXPORT struct svalue* multiset_lookup struct multiset l,
struct svalue key
 

PMOD_EXPORT int multiset_member struct multiset l,
struct svalue key
 

PMOD_EXPORT ptrdiff_t multiset_next struct multiset l,
ptrdiff_t  nodepos
 

PMOD_EXPORT ptrdiff_t multiset_prev struct multiset l,
ptrdiff_t  nodepos
 

struct array* multiset_range_indices struct multiset l,
ptrdiff_t  beg,
ptrdiff_t  end
 

struct array* multiset_range_values struct multiset l,
ptrdiff_t  beg,
ptrdiff_t  end
 

PMOD_EXPORT void multiset_set_cmp_less struct multiset l,
struct svalue cmp_less
 

PMOD_EXPORT void multiset_set_flags struct multiset l,
int  flags
 

PMOD_EXPORT INT32 multiset_sizeof struct multiset l  ) 
 

struct array* multiset_values struct multiset l  ) 
 

PMOD_EXPORT struct multiset* real_allocate_multiset int  allocsize,
int  flags,
struct svalue cmp_less
 

void real_gc_cycle_check_multiset struct multiset l,
int  weak
 

PMOD_PROTO void really_free_multiset struct multiset l  ) 
 

void simple_describe_multiset struct multiset l  ) 
 

void test_multiset void   ) 
 


Variable Documentation

struct multiset* first_multiset
 

struct multiset* gc_internal_multiset
 

PMOD_EXPORT struct svalue svalue_int_one
 


Generated on Fri Jul 22 23:44:29 2005 for Pike by  doxygen 1.3.9.1