summaryrefslogtreecommitdiff
path: root/vala/valatypesymbol.vala
diff options
context:
space:
mode:
authorJuerg Billeter <j@bitron.ch>2007-12-02 10:23:29 +0000
committerJürg Billeter <juergbi@src.gnome.org>2007-12-02 10:23:29 +0000
commit160d75b8e40911b86fa2383116454f4efaa5096c (patch)
treeb2a03b31c855731a8a242eeb25dc71adebe67504 /vala/valatypesymbol.vala
parent064eb741c97ba311cd77de22600c9ea8f67cddf4 (diff)
downloadvala-160d75b8e40911b86fa2383116454f4efaa5096c.tar.gz
rename DataType to Typesymbol
2007-12-02 Juerg Billeter <j@bitron.ch> * vala/valatypesymbol.vala, vala/Makefile.am: rename DataType to Typesymbol * vala/*.vala, gobject/*.vala, vapigen/*.vala: adapt after renaming svn path=/trunk/; revision=745
Diffstat (limited to 'vala/valatypesymbol.vala')
-rw-r--r--vala/valatypesymbol.vala273
1 files changed, 273 insertions, 0 deletions
diff --git a/vala/valatypesymbol.vala b/vala/valatypesymbol.vala
new file mode 100644
index 000000000..a81d8a5ee
--- /dev/null
+++ b/vala/valatypesymbol.vala
@@ -0,0 +1,273 @@
+/* valatype.vala
+ *
+ * Copyright (C) 2006-2007 Jürg Billeter, Raffaele Sandrini
+ *
+ * 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.1 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>
+ * Raffaele Sandrini <rasa@gmx.ch>
+ */
+
+using GLib;
+using Gee;
+
+/**
+ * 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.
+ */
+public abstract class Vala.Typesymbol : Symbol {
+ private Gee.List<string> cheader_filenames = new ArrayList<string> ();
+
+ private Pointer pointer_type;
+
+ /* holds the array types of this type; each rank is a separate one */
+ private Map<int,Array> array_types;
+
+ /**
+ * Returns the name of this data type as it is used in C code.
+ *
+ * @return the name to be used in C code
+ */
+ public abstract string get_cname (bool const_type = false);
+
+ /**
+ * 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;
+ }
+
+ /**
+ * 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;
+ }
+
+ /**
+ * 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;
+ }
+
+ /**
+ * 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
+ */
+ public virtual string get_upper_case_cname (string infix = null) {
+ return null;
+ }
+
+ /**
+ * 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;
+ }
+
+ public override Collection<string> get_cheader_filenames () {
+ if (cheader_filenames.size == 0) {
+ /* default to header filenames of the namespace */
+ foreach (string filename in parent_symbol.get_cheader_filenames ()) {
+ add_cheader_filename (filename);
+ }
+
+ if (cheader_filenames.size == 0 && source_reference != null && !source_reference.file.pkg) {
+ // don't add default include directives for VAPI files
+ cheader_filenames.add (source_reference.file.get_cinclude_filename ());
+ }
+ }
+ return new ReadOnlyCollection<string> (cheader_filenames);
+ }
+
+ /**
+ * 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) {
+ cheader_filenames.add (filename);
+ }
+
+ /**
+ * 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 */
+ parent_symbol.scope.add (pointer_type.name, pointer_type);
+
+ /* link the namespace */
+ pointer_type.owner = parent_symbol.scope;
+ }
+
+ return pointer_type;
+ }
+
+ /**
+ * Returns the array type for elements of this data type.
+ *
+ * @param rank the rank the array should be of
+ * @return array type for this data type
+ */
+ public Array! get_array (int rank) {
+ Array array_type = null;
+
+ if (array_types != null) {
+ array_type = array_types[rank];
+ }
+
+ if (array_type == null) {
+ if (array_types == null) {
+ array_types = new HashMap<int,Array> ();
+ }
+
+ var new_array_type = new Array (this, rank, source_reference);
+ parent_symbol.scope.add (new_array_type.name, new_array_type);
+
+ /* add internal length field */
+ new_array_type.scope.add (new_array_type.get_length_field ().name, new_array_type.get_length_field ());
+ /* add internal resize method */
+ new_array_type.scope.add (new_array_type.get_resize_method ().name, new_array_type.get_resize_method ());
+ /* add internal move method */
+ new_array_type.scope.add (new_array_type.get_move_method ().name, new_array_type.get_move_method ());
+
+ /* link the array type to the same source as the container type */
+ new_array_type.source_reference = this.source_reference;
+
+ array_types[rank] = new_array_type;
+
+ array_type = new_array_type;
+ }
+
+ return array_type;
+ }
+
+ /**
+ * Checks whether this data type is equal to or 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 (Typesymbol! t) {
+ return (this == t);
+ }
+
+ /**
+ * Return the index of the specified type parameter name.
+ */
+ public virtual int get_type_parameter_index (string! name) {
+ return -1;
+ }
+}