File: set.c

package info (click to toggle)
tom 1.1.1-2
  • links: PTS
  • area: main
  • in suites: potato
  • size: 6,340 kB
  • ctags: 2,244
  • sloc: objc: 27,863; ansic: 9,804; sh: 7,411; yacc: 3,377; lex: 966; asm: 208; makefile: 62; cpp: 10
file content (106 lines) | stat: -rw-r--r-- 2,283 bytes parent folder | download
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
   Written by Pieter J. Schoenmakers <tiggr@ics.ele.tue.nl>

   Copyright (C) 1996 Pieter J. Schoenmakers.

   This file is part of TOM.  TOM is distributed under the terms of the
   TOM License, a copy of which can be found in the TOM distribution; see
   the file LICENSE.

   $Id: set.c,v 1.10 1998/01/05 01:18:45 tiggr Exp $  */

#include <string.h>
#include "trt.h"
#include <tom/tom-r.h>
#include "keyed.h"

tom_object
i_tom_Set_r_at_r (tom_object self, selector cmd, tom_object key)
{
  set_elt *be = (void *) bucket_elt_find (self, key);

  return be ? be->c.key : 0;
}

tom_object
i_tom_EqSet_r_at_r (tom_object self, selector cmd, tom_object key)
{
  set_elt *be = (void *) bucket_elt_find_eq (self, key);

  return be ? be->c.key : 0;
}

static void
mark_container_elts (tom_object self)
{
  struct _es_i_tom_HashTable *ht = trt_ext_address (self, _ei_i_tom_HashTable);
  set_elt **pbe, **buckets = ht->buckets;
  tom_int i, n = ht->num_buckets;
  void *nbe;

  for (i = 0; i < n; i++)
    for (pbe = nbe = &buckets[i]; *pbe; pbe = nbe)
      {
	if (TGC_COLOUR ((*pbe)->c.key->asi) == TGC_WHITE)
	  {
	    set_elt *be = *pbe;

	    *pbe = be->c.next;
	    xfree (be);

	    ht->length--;
	  }
	else
	  nbe = &(*pbe)->c.next;
      }
}

void
i_tom_MutableSet_v_gc_container_mark_elements (tom_object self, selector cmd)
{
  mark_container_elts (self);
}

void
i_tom_MutableEqSet_v_gc_container_mark_elements (tom_object self, selector cmd)
{
  mark_container_elts (self);
}

void
i_tom_MutableSet_v_add_r (tom_object self, selector cmd, tom_object object)
{
  bucket_elt_find_create (self, object, sizeof (set_elt));
}

void
i_tom_MutableEqSet_v_add_r (tom_object self, selector cmd, tom_object object)
{
  bucket_elt_find_create_eq (self, object, sizeof (set_elt));
}

void
i_tom_MutableSet_v_remove_r (tom_object self, selector cmd, tom_object object)
{
  bucket_elt *be = bucket_elt_remove (self, object);

  xfree (be);
}

void
i_tom_MutableEqSet_v_remove_r (tom_object self, selector cmd, tom_object object)
{
  bucket_elt *be = bucket_elt_remove_eq (self, object);

  xfree (be);
}

tom_object
i_tom_MutableEqSet_r_retrieve (tom_object self, selector cmd)
{
  bucket_elt *be = bucket_elt_retrieve (self);
  tom_object ret = be->key;

  xfree (be);
  return ret;
}