valadatatype.vala 7.97 KB
Newer Older
1
2
/* valatype.vala
 *
3
 * Copyright (C) 2006-2007  Jürg Billeter, Raffaele Sandrini
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.

 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 *
 * Author:
 * 	Jürg Billeter <j@bitron.ch>
21
 *	Raffaele Sandrini <rasa@gmx.ch>
22
23
24
 */

using GLib;
25
using Gee;
26

27
28
29
30
/**
 * Represents a runtime data type. This data type may be defined in Vala source
 * code or imported from an external library with a Vala API file.
 */
31
public abstract class Vala.DataType : Symbol {
32
	private Gee.List<string> cheader_filenames = new ArrayList<string> ();
33

34
35
	private Pointer pointer_type;

36
	/* holds the array types of this type; each rank is a separate one */
37
	private Map<int,Array> array_types;
38

39
40
41
42
43
	/**
	 * Returns the name of this data type as it is used in C code.
	 *
	 * @return the name to be used in C code
	 */
44
	public abstract string get_cname (bool const_type = false);
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
	
	/**
	 * Checks whether this data type has value or reference type semantics.
	 *
	 * @return true if this data type has reference type semantics
	 */
	public virtual bool is_reference_type () {
		return false;
	}
	
	/**
	 * Returns the C function name that duplicates instances of this data
	 * type. The specified C function must accept one argument referencing
	 * the instance of this data type and return a reference to the
	 * duplicate.
	 *
	 * @return the name of the C function if supported or null otherwise
	 */
	public virtual string get_dup_function () {
		return null;
	}
	
	/**
	 * Returns the C function name that frees instances of this data type.
	 * This is only valid for data types with reference type semantics that
	 * do not support reference counting. The specified C function must
	 * accept one argument pointing to the instance to be freed.
	 *
	 * @return the name of the C function or null if this data type is not a
	 *         reference type or if it supports reference counting
	 */
	public virtual string get_free_function () {
		return null;
	}
	
	/**
	 * Checks whether this data type supports reference counting. This is
	 * only valid for reference types.
	 *
	 * @return true if this data type supports reference counting
	 */
	public virtual bool is_reference_counting () {
		return false;
	}
	
	/**
	 * Returns the C function name that increments the reference count of
	 * instances of this data type. This is only valid for data types
	 * supporting reference counting. The specified C function must accept
	 * one argument referencing the instance of this data type and return
	 * the reference.
	 *
	 * @return the name of the C function or null if this data type does not
	 *         support reference counting
	 */
	public virtual string get_ref_function () {
		return null;
	}
	
	/**
	 * Returns the C function name that decrements the reference count of
	 * instances of this data type. This is only valid for data types
	 * supporting reference counting. The specified C function must accept
	 * one argument referencing the instance of this data type.
	 *
	 * @return the name of the C function or null if this data type does not
	 *         support reference counting
	 */
	public virtual string get_unref_function () {
		return null;
	}
	
	/**
	 * Returns the C symbol representing the runtime type id for this data
	 * type. The specified symbol must express a registered GType.
	 *
	 * @return the name of the GType name in C code or null if this data
	 *         type is not registered with GType
	 */
	public virtual string get_type_id () {
		return null;
	}
	
128
129
130
131
132
133
134
135
136
	/**
	 * Returns the name of this data type as used in C code marshallers
	 *
	 * @return type name for marshallers
	 */
	public virtual string get_marshaller_type_name () {
		return null;
	}
	
137
138
139
140
141
142
143
144
145
146
147
148
149
150
	/**
	 * Returns the cname of the GValue getter function,
	 */
	public virtual string get_get_value_function () {
		return null;
	}
	
	/**
	 * Returns the cname of the GValue setter function,
	 */
	public virtual string get_set_value_function () {
		return null;
	}
	
151
152
153
154
155
156
157
158
159
	/**
	 * Returns the C name of this data type in upper case. Words are
	 * separated by underscores. The upper case C name of the namespace is
	 * prefix of the result.
	 *
	 * @param infix a string to be placed between namespace and data type
	 *              name or null
	 * @return      the upper case name to be used in C code
	 */
160
	public virtual string get_upper_case_cname (string infix = null) {
161
162
		return null;
	}
163
164
165
166
167
168
169
170
171
172
173

	/**
	 * Returns the default value for the given type. Returning null means
	 * there is no default value (i.e. not that the default name is NULL).
	 *
	 * @return	the name of the default value
	 */
	public virtual string get_default_value () {
		return null;
	}

174
175
	public override Collection<string> get_cheader_filenames () {
		if (cheader_filenames.size == 0) {
176
			/* default to header filenames of the namespace */
177
			foreach (string filename in parent_symbol.get_cheader_filenames ()) {
178
				add_cheader_filename (filename);
179
			}
180

181
			if (cheader_filenames.size == 0 && source_reference != null && !source_reference.file.pkg) {
182
				// don't add default include directives for VAPI files
183
				cheader_filenames.add (source_reference.file.get_cinclude_filename ());
184
			}
185
		}
186
		return new ReadOnlyCollection<string> (cheader_filenames);
187
	}
188

189
190
191
192
193
194
195
	/**
	 * Adds a filename to the list of C header filenames users of this data
	 * type must include.
	 *
	 * @param filename a C header filename
	 */
	public void add_cheader_filename (string! filename) {
196
		cheader_filenames.add (filename);
197
	}
198
	
199
200
201
202
203
204
205
206
207
	/**
	 * Returns the pointer type of this data type.
	 *
	 * @return pointer-type for this data type
	 */
	public Pointer! get_pointer () {
		if (pointer_type == null) {
			pointer_type = new Pointer (this, source_reference);
			/* create a new Symbol */
208
			parent_symbol.scope.add (pointer_type.name, pointer_type);
209
210

			/* link the namespace */
211
			pointer_type.owner = parent_symbol.scope;
212
213
214
215
216
		}

		return pointer_type;
	}
	
217
	/**
218
219
	 * Returns the array type for elements of this data type.
	 *
220
	 * @param rank the rank the array should be of
221
	 * @return array type for this data type
222
	 */
223
	public Array! get_array (int rank) {
224
225
226
		Array array_type = null;

		if (array_types != null) {
227
			array_type = array_types[rank];
228
229
		}

230
		if (array_type == null) {
231
			if (array_types == null) {
232
				array_types = new HashMap<int,Array> ();
233
234
			}

235
			var new_array_type = new Array (this, rank, source_reference);
236
			parent_symbol.scope.add (new_array_type.name, new_array_type);
237
238

			/* add internal length field */
239
			new_array_type.scope.add (new_array_type.get_length_field ().name, new_array_type.get_length_field ());
240
			/* add internal resize method */
241
			new_array_type.scope.add (new_array_type.get_resize_method ().name, new_array_type.get_resize_method ());
Jürg Billeter's avatar
Jürg Billeter committed
242
243
			/* add internal move method */
			new_array_type.scope.add (new_array_type.get_move_method ().name, new_array_type.get_move_method ());
244

245
			/* link the array type to the same source as the container type */
246
			new_array_type.source_reference = this.source_reference;
247
			
248
			array_types[rank] = new_array_type;
249
250
			
			array_type = new_array_type;
251
252
253
		}
		
		return array_type;
254
	}
255
256
257
258
259
260
261
262
263
264
265

	/**
	 * Checks whether this data type is a subtype of the specified data
	 * type.
	 *
	 * @param t a data type
	 * @return  true if t is a supertype of this data type, false otherwise
	 */
	public virtual bool is_subtype_of (DataType! t) {
		return false;
	}
266
267
268
269
270
271
272
	
	/**
	 * Return the index of the specified type parameter name.
	 */
	public virtual int get_type_parameter_index (string! name) {
		return -1;
	}
273
}