summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/util/utl_tmpl/utl_list.cpp
blob: 997b1301d41bb175ebc3c140509ca5e235148c98 (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
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
// $Id$

/*
 *======================================================================
 *
 *Copyright 1992 Sun Microsystems, Inc.
 *
 *The Interface Definition Language Compiler Front End (CFE) is made
 *available for use provided that this legend is included on all media and
 *documentation and as a part of the software program in whole or part.
 *Users may copy and extend functionality (but may not remove
 *functionality) of the Interface Definition Language CFE without charge,
 *but are not authorized to license or distribute it to anyone else except
 *as part of a product or program developed by the user or with the express
 *written consent of Sun Microsystems, Inc.
 *
 *The names of Sun Microsystems, Inc. and any of its subsidiaries may not
 *be used in advertising or publicity pertaining to distribution of
 *Interface Definition Language CFE as permitted herein.
 *
 *The Interface Definition Language CFE may not be exported outside the
 *United States without first obtaining the appropriate government
 *approvals.
 *
 *INTERFACE DEFINITION LANGUAGE CFE IS PROVIDED AS IS WITH NO WARRANTIES
 *OF ANY KIND INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND
 *FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR ARISING FROM A
 *COURSE OF DEALING, USAGE OR TRADE PRACTICE.
 *
 *Interface Definition Language CFE is provided with no support and
 *without any obligation on the part of Sun Microsystems, Inc. or any of
 *its subsidiaries or affiliates to assist in its use, correction,
 *modification or enhancement.
 *
 *SUN MICROSYSTEMS, INC. OR ANY OF ITS SUBSIDIARIES OR AFFILIATES SHALL
 *HAVE NO LIABILITY WITH RESPECT TO THE INFRINGEMENT OF COPYRIGHTS, TRADE
 *SECRETS OR ANY PATENTS BY INTERFACE DEFINITION LANGUAGE CFE OR ANY PART
 *THEREOF.
 *
 *IN NO EVENT WILL SUN MICROSYSTEMS, INC. OR ANY OF ITS SUBSIDIARIES OR
 *AFFILIATES BE LIABLE FOR ANY LOST REVENUE OR PROFITS OR OTHER SPECIAL,
 *INDIRECT AND CONSEQUENTIAL DAMAGES, EVEN IF SUN HAS BEEN ADVISED OF THE
 *POSSIBILITY OF SUCH DAMAGES.
 *
 *SunSoft, Inc.  
 *2550 Garcia Avenue 
 *Mountain View, California  94043
 *
 *
 *
 *
 *======================================================================
 */

// utl_list.cc
//
// Implementation of generic single-linked lists

#include	<stddef.h>
#include	<utl_list.hh>
#include	<idl_bool.hh>

ACE_RCSID(utl_tmpl, utl_list, "$Id$")

/*
 * Constructor(s)
 */

template<class L, class T>
UTL_List<L, T>::UTL_List(T *c, L *l)
	: pd_car_data(c),
	  pd_cdr_data(l) 
{
}

/*
 * Private operations
 */

// Compute list length
template<class L, class T>
long
UTL_List<L, T>::list_length(long n)
{
  if (pd_cdr_data == NULL)
    return n;
  else
    return pd_cdr_data->list_length(n+1);
}

/*
 * Public operations
 */

// Smash last cdr with l
template<class L, class T>
void
UTL_List<L, T>::nconc(L *l)
{
  if (pd_cdr_data == NULL)
    pd_cdr_data = l;
  else
    pd_cdr_data->nconc(l);
}

/*
 * Override this operation to copy lists of other types
 */
// Copy a list
template<class L, class T>
L *
UTL_List<L, T>::copy()
{
  if (pd_cdr_data == NULL)
    return new L(head(), NULL);
  return new L(head(), pd_cdr_data->copy());
}

// Get list item
template<class L, class T>
T *
UTL_List<L, T>::head()
{
  return pd_car_data;
}

// Get next list
template<class L, class T>
L *
UTL_List<L, T>::tail()
{
  return pd_cdr_data;
}

// Set list item
template<class L, class T>
void
UTL_List<L, T>::set_head(T *s)
{
  pd_car_data = s;
}

// Set next list
template<class L, class T>
void
UTL_List<L, T>::set_tail(L *l)
{
  pd_cdr_data = l;
}

// Compute list length
template<class L, class T>
long
UTL_List<L, T>::length()
{
  return list_length(1);
}

/*
 * Redefinition of inherited virtual operations
 */

// UTL_List active iterator

/*
 * Constructor
 */

template<class L, class T>
UTL_ListActiveIterator<L, T>::UTL_ListActiveIterator(UTL_List<L, T> *s)
		      : source(s)
{
}

/*
 * Private operations
 */

/*
 * Public operations
 */

// Is iterator done?
template<class L, class T>
long
UTL_ListActiveIterator<L, T>::is_done()
{
  return (source == NULL) ? I_TRUE : I_FALSE;
}

// Get current item
template<class L, class T>
T *
UTL_ListActiveIterator<L, T>::item()
{
  if (source == NULL)
    return NULL;
  return source->head();
}

// Advance to next item
template<class L, class T>
void
UTL_ListActiveIterator<L, T>::next()
{
  if (source != NULL)
    source = source->tail();
}

/*
 * Redefinition of inherited operations
 */