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

Last change on this file since 515 was 515, checked in by Silvan Scherrer, 9 years ago

updated poppler to 0.20.3

File size: 2.2 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 ? sizeA : 8;
33  data = (void **)gmallocn(size, sizeof(void*));
34  length = 0;
35  inc = 0;
36}
37
38GooList::~GooList() {
39  gfree(data);
40}
41
42GooList *GooList::copy() {
43  GooList *ret;
44
45  ret = new GooList(length);
46  ret->length = length;
47  memcpy(ret->data, data, length * sizeof(void *));
48  ret->inc = inc;
49  return ret;
50}
51
52void GooList::append(void *p) {
53  if (length >= size) {
54    expand();
55  }
56  data[length++] = p;
57}
58
59void GooList::append(GooList *list) {
60  int i;
61
62  while (length + list->length > size) {
63    expand();
64  }
65  for (i = 0; i < list->length; ++i) {
66    data[length++] = list->data[i];
67  }
68}
69
70void GooList::insert(int i, void *p) {
71  if (length >= size) {
72    expand();
73  }
74  if (i < 0) {
75    i = 0;
76  }
77  if (i < length) {
78    memmove(data+i+1, data+i, (length - i) * sizeof(void *));
79  }
80  data[i] = p;
81  ++length;
82}
83
84void *GooList::del(int i) {
85  void *p;
86
87  p = data[i];
88  if (i < length - 1) {
89    memmove(data+i, data+i+1, (length - i - 1) * sizeof(void *));
90  }
91  --length;
92  if (size - length >= ((inc > 0) ? inc : size/2)) {
93    shrink();
94  }
95  return p;
96}
97
98void GooList::sort(int (*cmp)(const void *obj1, const void *obj2)) {
99  qsort(data, length, sizeof(void *), cmp);
100}
101
102void GooList::reverse() {
103  void *t;
104  int n, i;
105
106  n = length / 2;
107  for (i = 0; i < n; ++i) {
108    t = data[i];
109    data[i] = data[length - 1 - i];
110    data[length - 1 - i] = t;
111  }
112}
113
114void GooList::expand() {
115  size += (inc > 0) ? inc : size;
116  data = (void **)greallocn(data, size, sizeof(void*));
117}
118
119void GooList::shrink() {
120  size -= (inc > 0) ? inc : size/2;
121  data = (void **)greallocn(data, size, sizeof(void*));
122}
Note: See TracBrowser for help on using the repository browser.