summaryrefslogtreecommitdiff
path: root/omega/basic/src/Link.cc
blob: 50b94415359f2a952b83e3f4898df32cbc1b27d3 (plain)
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
#include <basic/Link.h>

namespace omega {

#if ListElementFreeList
  static List_Element<void*> *_kludgy_List_Element_free_list_pointer;
// we rely on the fact that that is initialized to 0 before any
// constructor-based initialization that could call List_Element::new.

  void *kludgy_List_Element_new(size_t size)
    {
    void *mem;
    if (size == sizeof(List_Element<void*>) &&
	_kludgy_List_Element_free_list_pointer)
	{
	List_Element<void*> *it = _kludgy_List_Element_free_list_pointer;
	_kludgy_List_Element_free_list_pointer = it->tail;
	mem = it;
	}
    else
	mem = ::operator new(size);

    return mem;
    }

  void  kludgy_List_Element_delete(void *ptr, size_t size)
    {
    if (ptr)
	if (size == sizeof(List_Element<void*>))
	    {
	    List_Element<void*> *it = (List_Element<void*> *) ptr;
	    it->tail = _kludgy_List_Element_free_list_pointer;
	    _kludgy_List_Element_free_list_pointer = it;
	    }
	else
	    ::operator delete(ptr);
    }

#endif

} // namespace