source: trunk/poppler/mypoppler/goo/GooList.cc @ 461

Last change on this file since 461 was 2, checked in by Eugene Romanenko, 16 years ago

First import

File size: 1.8 KB
Line 
1//========================================================================
2//
3// GooList.cc
4//
5// Copyright 2001-2003 Glyph & Cog, LLC
6//
7//========================================================================
8
9#include <config.h>
10
11#ifdef USE_GCC_PRAGMAS
12#pragma implementation
13#endif
14
15#include <stdlib.h>
16#include <string.h>
17#include "gmem.h"
18#include "GooList.h"
19
20//------------------------------------------------------------------------
21// GooList
22//------------------------------------------------------------------------
23
24GooList::GooList() {
25  size = 8;
26  data = (void **)gmallocn(size, sizeof(void*));
27  length = 0;
28  inc = 0;
29}
30
31GooList::GooList(int sizeA) {
32  size = sizeA;
33  data = (void **)gmallocn(size, sizeof(void*));
34  length = 0;
35  inc = 0;
36}
37
38GooList::~GooList() {
39  gfree(data);
40}
41
42void GooList::append(void *p) {
43  if (length >= size) {
44    expand();
45  }
46  data[length++] = p;
47}
48
49void GooList::append(GooList *list) {
50  int i;
51
52  while (length + list->length > size) {
53    expand();
54  }
55  for (i = 0; i < list->length; ++i) {
56    data[length++] = list->data[i];
57  }
58}
59
60void GooList::insert(int i, void *p) {
61  if (length >= size) {
62    expand();
63  }
64  if (i < length) {
65    memmove(data+i+1, data+i, (length - i) * sizeof(void *));
66  }
67  data[i] = p;
68  ++length;
69}
70
71void *GooList::del(int i) {
72  void *p;
73
74  p = data[i];
75  if (i < length - 1) {
76    memmove(data+i, data+i+1, (length - i - 1) * sizeof(void *));
77  }
78  --length;
79  if (size - length >= ((inc > 0) ? inc : size/2)) {
80    shrink();
81  }
82  return p;
83}
84
85void GooList::sort(int (*cmp)(const void *obj1, const void *obj2)) {
86  qsort(data, length, sizeof(void *), cmp);
87}
88
89void GooList::expand() {
90  size += (inc > 0) ? inc : size;
91  data = (void **)greallocn(data, size, sizeof(void*));
92}
93
94void GooList::shrink() {
95  size -= (inc > 0) ? inc : size/2;
96  data = (void **)greallocn(data, size, sizeof(void*));
97}
Note: See TracBrowser for help on using the repository browser.