valaflags.vala 3.64 KB
Newer Older
1 2
/* valaflags.vala
 *
3
 * Copyright (C) 2006-2007  Jürg Billeter
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 *
 * 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>
 */

using GLib;

25 26 27 28
/**
 * Represents a flags declaration in the source code.
 */
public class Vala.Flags : DataType {
29 30 31
	private List<FlagsValue> values;
	private string cname;
	private string cprefix;
32

33 34 35 36 37 38 39
	/**
	 * Creates a new flags.
	 *
	 * @param name   type name
	 * @param source reference to source code
	 * @return       newly created flags
	 */
40
	public Flags (construct string! name, construct SourceReference source_reference = null) {
41
	}
42

43 44 45 46 47 48 49 50
	/**
	 * Appends the specified flags value to the list of values.
	 *
	 * @param value a flags value
	 */
	public void add_value (FlagsValue! value) {
		values.append (value);
	}
51

52 53
	public override void accept (CodeVisitor! visitor) {
		visitor.visit_begin_flags (this);
54

55 56
		foreach (FlagsValue value in values) {
			value.accept (visitor);
57 58
		}

59 60
		visitor.visit_end_flags (this);
	}
61

62
	public override string get_cname (bool const_type = false) {
63 64
		if (cname == null) {
			cname = "%s%s".printf (@namespace.get_cprefix (), name);
65
		}
66 67
		return cname;
	}
68

69
	public override ref string get_upper_case_cname (string infix) {
70 71 72 73 74
		return "%s%s".printf (@namespace.get_lower_case_cprefix (), Namespace.camel_case_to_lower_case (name)).up ();
	}

	public override bool is_reference_type () {
		return false;
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
	private void set_cname (string! cname) {
		this.cname = cname;
	}

	/**
	 * Returns the string to be prepended to the name of members of this
	 * enum when used in C code.
	 *
	 * @return the prefix to be used in C code
	 */
	public string! get_cprefix () {
		if (cprefix == null) {
			cprefix = "%s_".printf (get_upper_case_cname (null));
		}
		return cprefix;
	}

	/**
	 * Sets the string to be prepended to the name of members of this enum
	 * when used in C code.
	 *
	 * @param cprefix the prefix to be used in C code
	 */
	public void set_cprefix (string! cprefix) {
		this.cprefix = cprefix;
	}

	private void process_ccode_attribute (Attribute! a) {
		if (a.has_argument ("cname")) {
			set_cname (a.get_string ("cname"));
		}
		if (a.has_argument ("cprefix")) {
			set_cprefix (a.get_string ("cprefix"));
		}
		if (a.has_argument ("cheader_filename")) {
			var val = a.get_string ("cheader_filename");
			foreach (string filename in val.split (",")) {
				add_cheader_filename (filename);
			}
		}
	}

	/**
	 * Process all associated attributes.
	 */
	public void process_attributes () {
		foreach (Attribute a in attributes) {
			if (a.name == "CCode") {
				process_ccode_attribute (a);
			}
		}
	}

	public override string get_type_id () {
		// FIXME: use GType-registered flags
		return "G_TYPE_INT";
	}

135 136 137 138 139 140 141
	public override string get_marshaller_type_name () {
		return "FLAGS";
	}

	public override string get_get_value_function () {
		return "g_value_get_flags";
	}
142

143 144 145
	public override string get_set_value_function () {
		return "g_value_set_flags";
	}
146 147 148 149

	public override string get_default_value () {
		return "0";
	}
150
}