types.rst revision 1.3
1.. Copyright (C) 2014-2017 Free Software Foundation, Inc.
2   Originally contributed by David Malcolm <dmalcolm@redhat.com>
3
4   This is free software: you can redistribute it and/or modify it
5   under the terms of the GNU General Public License as published by
6   the Free Software Foundation, either version 3 of the License, or
7   (at your option) any later version.
8
9   This program is distributed in the hope that it will be useful, but
10   WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12   General Public License for more details.
13
14   You should have received a copy of the GNU General Public License
15   along with this program.  If not, see
16   <http://www.gnu.org/licenses/>.
17
18.. default-domain:: cpp
19
20Types
21=====
22
23.. class:: gccjit::type
24
25   gccjit::type represents a type within the library.  It is a subclass
26   of :class:`gccjit::object`.
27
28Types can be created in several ways:
29
30* fundamental types can be accessed using
31  :func:`gccjit::context::get_type`:
32
33  .. code-block:: c++
34
35      gccjit::type int_type = ctxt.get_type (GCC_JIT_TYPE_INT);
36
37  or using the :func:`gccjit::context::get_int_type<T>` template:
38
39  .. code-block:: c++
40
41      gccjit::type t = ctxt.get_int_type <unsigned short> ();
42
43  See :c:func:`gcc_jit_context_get_type` for the available types.
44
45* derived types can be accessed by using functions such as
46  :func:`gccjit::type::get_pointer` and :func:`gccjit::type::get_const`:
47
48  .. code-block:: c++
49
50    gccjit::type const_int_star = int_type.get_const ().get_pointer ();
51    gccjit::type int_const_star = int_type.get_pointer ().get_const ();
52
53* by creating structures (see below).
54
55Standard types
56--------------
57
58.. function:: gccjit::type gccjit::context::get_type (enum gcc_jit_types)
59
60   Access a specific type.  This is a thin wrapper around
61   :c:func:`gcc_jit_context_get_type`; the parameter has the same meaning.
62
63.. function:: gccjit::type \
64              gccjit::context::get_int_type (size_t num_bytes, int is_signed)
65
66   Access the integer type of the given size.
67
68.. function:: gccjit::type \
69              gccjit::context::get_int_type <T> ()
70
71   Access the given integer type.  For example, you could map the
72   ``unsigned short`` type into a gccjit::type via:
73
74   .. code-block:: c++
75
76      gccjit::type t = ctxt.get_int_type <unsigned short> ();
77
78Pointers, `const`, and `volatile`
79---------------------------------
80
81.. function::  gccjit::type gccjit::type::get_pointer ()
82
83   Given type "T", get type "T*".
84
85.. FIXME: get_const doesn't seem to exist
86
87.. function::  gccjit::type gccjit::type::get_const ()
88
89   Given type "T", get type "const T".
90
91.. function::  gccjit::type gccjit::type::get_volatile ()
92
93   Given type "T", get type "volatile T".
94
95.. function::  gccjit::type \
96               gccjit::context::new_array_type (gccjit::type element_type, \
97                                                int num_elements, \
98			                        gccjit::location loc)
99
100   Given type "T", get type "T[N]" (for a constant N).
101   Param "loc" is optional.
102
103
104Structures and unions
105---------------------
106
107.. class:: gccjit::struct_
108
109A compound type analagous to a C `struct`.
110
111:class:`gccjit::struct_` is a subclass of :class:`gccjit::type` (and thus
112of :class:`gccjit::object` in turn).
113
114.. class:: gccjit::field
115
116A field within a :class:`gccjit::struct_`.
117
118:class:`gccjit::field` is a subclass of :class:`gccjit::object`.
119
120You can model C `struct` types by creating :class:`gccjit::struct_` and
121:class:`gccjit::field` instances, in either order:
122
123* by creating the fields, then the structure.  For example, to model:
124
125  .. code-block:: c
126
127    struct coord {double x; double y; };
128
129  you could call:
130
131  .. code-block:: c++
132
133    gccjit::field field_x = ctxt.new_field (double_type, "x");
134    gccjit::field field_y = ctxt.new_field (double_type, "y");
135    std::vector fields;
136    fields.push_back (field_x);
137    fields.push_back (field_y);
138    gccjit::struct_ coord = ctxt.new_struct_type ("coord", fields);
139
140* by creating the structure, then populating it with fields, typically
141  to allow modelling self-referential structs such as:
142
143  .. code-block:: c
144
145    struct node { int m_hash; struct node *m_next; };
146
147  like this:
148
149  .. code-block:: c++
150
151    gccjit::struct_ node = ctxt.new_opaque_struct_type ("node");
152    gccjit::type node_ptr = node.get_pointer ();
153    gccjit::field field_hash = ctxt.new_field (int_type, "m_hash");
154    gccjit::field field_next = ctxt.new_field (node_ptr, "m_next");
155    std::vector fields;
156    fields.push_back (field_hash);
157    fields.push_back (field_next);
158    node.set_fields (fields);
159
160.. FIXME: the above API doesn't seem to exist yet
161
162.. function:: gccjit::field \
163              gccjit::context::new_field (gccjit::type type,\
164                                          const char *name, \
165                                          gccjit::location loc)
166
167   Construct a new field, with the given type and name.
168
169.. function:: gccjit::struct_ \
170   gccjit::context::new_struct_type (const std::string &name,\
171                                     std::vector<field> &fields,\
172                                     gccjit::location loc)
173
174     Construct a new struct type, with the given name and fields.
175
176.. function:: gccjit::struct_ \
177              gccjit::context::new_opaque_struct (const std::string &name, \
178                                                  gccjit::location loc)
179
180     Construct a new struct type, with the given name, but without
181     specifying the fields.   The fields can be omitted (in which case the
182     size of the struct is not known), or later specified using
183     :c:func:`gcc_jit_struct_set_fields`.
184