chiark / gitweb /
doc/concepts.tex: Typeset method rĂ´le names as identifiers.
[sod] / lib / sod.3
... / ...
CommitLineData
1.\" -*-nroff-*-
2.\"
3.\" The Sod runtime library
4.\"
5.\" (c) 2015 Straylight/Edgeware
6.\"
7.
8.\"----- Licensing notice ---------------------------------------------------
9.\"
10.\" This file is part of the Sensible Object Design, an object system for C.
11.\"
12.\" SOD is free software; you can redistribute it and/or modify
13.\" it under the terms of the GNU Library General Public License as
14.\" published by the Free Software Foundation; either version 2 of the
15.\" License, or (at your option) any later version.
16.\"
17.\" SOD is distributed in the hope that it will be useful,
18.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
19.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20.\" GNU Library General Public License for more details.
21.\"
22.\" You should have received a copy of the GNU Library General Public
23.\" License along with SOD; if not, write to the Free
24.\" Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25.\" MA 02111-1307, USA.
26.
27.\" Highlight using terminal escapes, rather than overstriking.
28.\"\X'tty: sgr 1'
29.
30.\" String definitions and font selection.
31.ie t \{\
32. ds o \(bu
33. if \n(.g .fam P
34.\}
35.el \{\
36. ds o o
37.\}
38.
39.\" .hP TEXT -- start an indented paragraph with TEXT hanging off to the left
40.de hP
41.IP
42\h'-\w'\fB\\$1\ \fP'u'\fB\\$1\ \fP\c
43..
44.
45.\"--------------------------------------------------------------------------
46.TH sod 3 "8 September 2015" "Straylight/Edgeware" "Sensible Object Design"
47.
48.SH NAME
49sod \- Sensible Object Design runtime library
50.
51.\"--------------------------------------------------------------------------
52.SH SYNOPSIS
53.B #include <sod/sod.h>
54.PP
55.B void *\c
56.B SOD_XCHAIN(\c
57.IB chead ,
58.BI "const " cls " *" obj );
59.br
60.B ptrdiff_t
61.B SOD_OFFSETDIFF(\c
62.IB type ,
63.IB mema ,
64.IB memb );
65.br
66.IB cls "__ilayout *" \c
67.B SOD_ILAYOUT(\c
68.IB cls ,
69.IB chead ,
70.BI "const void *" obj );
71.br
72.B void *\c
73.B SOD_INSTBASE(\c
74.BI "const " cls " *" obj );
75.PP
76.B const void *\c
77.B SOD_CLASSOF(\c
78.BI "const " cls " *" obj );
79.br
80.B int
81.B sod_subclassp(\c
82.BI "const SodClass *" sub ,
83.BI "const SodClass *" super );
84.PP
85.IB cls " *" \c
86.B SOD_CONVERT(\c
87.IB cls ,
88.BI "const void *" obj );
89.br
90.B int
91.B sod_convert(\c
92.BI "const SodClass *" cls ,
93.BI "const void *" obj );
94.PP
95.IB cls " *" \c
96.B SOD_INIT(\c
97.IB cls ,
98.BI "void *" p ,
99.IB keywords );
100.br
101.B void *\c
102.B sod_init(\c
103.BI "const SodClass *" cls ,
104.BI "void *" p ,
105.B ...);
106.br
107.B void *\c
108.B sod_initv(\c
109.BI "const SodClass *" cls ,
110.BI "void *" p ,
111.BI "va_list " ap );
112.br
113.B SOD_DECL(\c
114.IB cls ,
115.IB var );
116.PP
117.
118.\"--------------------------------------------------------------------------
119.SH DESCRIPTION
120.
121The functions and macros defined here generally expect that
122instances and classes inherit from the standard
123.B SodObject
124root object.
125While the translator can (at some effort) support alternative roots,
126they will require different run-time support machinery.
127.
128.SS Layout utilities
129The following macros are useful in
130finding one's way around an instance layout structure,
131given various levels of information about
132what kind of object one is dealing with,
133or for computing the tables which are used for
134this kind of navigation.
135.PP
136These macros are mostly intended for use in
137code generated by the Sod translator.
138Others may find them useful for special effects,
139but they can be tricky to understand and use correctly
140and can't really be recommended for general use.
141.PP
142The
143.B SOD_OFFSETDIFF
144macro returns the signed offset between
145two members of a structure or union type.
146Given a structure or union type
147.IR type ,
148and two member names
149.I mema
150and
151.IR memb ,
152then
153.B SOD_OFFSETDIFF(\c
154.IB type ,
155.IB mema ,
156.IB memb )
157gives the difference, in bytes,
158between the objects
159.IB x . mema
160and
161.IB x . memb
162for any object
163.I x
164of type
165.IR type .
166This macro is used internally when generating vtables
167and is not expected to be very useful elsewhere.
168.PP
169The
170.B SOD_ILAYOUT
171macro recovers the instance layout base address
172from a pointer to one of its instance chains.
173Specifically, given a class name
174.IR cls ,
175the nickname
176.I chead
177of the least specific class in one of
178.IR cls 's
179superclass chains,
180and a pointer
181.I obj
182to the instance storage for the chain containing
183.I chead
184within an exact instance of
185.I cls
186(i.e., not an instance of any proper subclass),
187.B SOD_ILAYOUT(\c
188.IB cls ,
189.IB chead ,
190.IB obj )
191returns the a pointer to the layout structure containing
192.IB obj .
193This macro is used internally in effective method bodies
194and is not expected to be very useful elsewhere
195since it's unusual to have such specific knowledge
196about the dynamic type of an instance.
197The
198.B SOD_INSTBASE
199macro (described below) is more suited to general use.
200.PP
201The
202.B SOD_INSTBASE
203macro finds the base address of an instance's layout.
204Given a pointer
205.BI "const " cls " *" obj
206to an instance,
207.BI SOD_INSTBASE( obj )
208returns the base address of the storage allocated to
209.IR obj .
210This is useful if you want to free a dynamically allocated instance,
211for example.
212This macro needs to look up an offset in
213.IR obj 's
214vtable to do its work.
215Compare
216.B SOD_ILAYOUT
217above,
218which is faster but requires
219precise knowledge of the instance's dynamic class.
220.
221.SS Classes
222The following macros and functions
223query the runtime relationhips between
224instances and classes.
225.PP
226The
227.B SOD_CLASSOF
228macro returns the class object describing an instance's dynamic class.
229Given a pointer
230.BI "const " cls " *" obj
231to an instance,
232.BI SOD_CLASSOF( obj )
233returns a pointer to
234.IR obj 's
235dynamic class,
236which
237(assuming
238.I obj
239is typed correctly in the first place)
240will be a subclass of
241.IR cls .
242(If you wanted the class object for
243.I cls
244itself,
245it's called
246.IB cls __class \fR.)
247.PP
248The
249.B sod_subclassp
250function answers whether one class
251.I sub
252is actually a subclass of another class
253.IR super .
254.B sod_subclassp(\c
255.IB sub ,
256.IB super )
257returns nonzero if and only if
258.I sub
259is a subclass of
260.IR super .
261This involves a run-time trawl through the class structures:
262while some effort has been made to make it perform well
263it's still not very fast.
264.
265.SS Conversions
266The following macros and functions are used
267to convert instance pointers of some (static) type
268into instance pointers of other static types
269to the same instance.
270.PP
271The
272.B SOD_XCHAIN
273macro performs a `cross-chain upcast'.
274Given a pointer
275.I cls
276.BI * obj
277to an instance of a class of type
278.I cls
279and the nickname
280.I chead
281of the least specific class in one of
282.IR cls 's
283superclass chains which does not contain
284.I cls
285itself,
286.B SOD_XCHAIN(\c
287.IB chead ,
288.IB obj )
289returns the address of that chain's storage
290within the instance layout as a raw
291.B void *
292pointer.
293(Note that
294.I cls
295is not mentioned explicitly.)
296This macro is used by the generated
297.IB cls __CONV_ c
298conversion macros,
299which you are encouraged to use instead where possible.
300.PP
301The
302.B SOD_CONVERT
303macro
304and
305.B sod_convert
306function
307perform general conversions
308(up-, down-, and cross-casts) on instance pointers.
309Given a class
310.I cls
311and a pointer
312.BI "const void *" obj
313to an instance,
314they return an appropriately converted pointer to
315.I obj
316if
317.I obj
318is indeed an instance of (some subclass of)
319.IR cls ;
320otherwise they return a null pointer.
321.PP
322The
323.B SOD_CONVERT
324macro expects
325.I cls
326to be a class name;
327the
328.B sod_convert
329function
330expects a pointer to a class object instead.
331.PP
332This involves a run-time trawl through the class structures:
333while some effort has been made to make it perform well
334it's still not very fast.
335For upcasts (where
336.I cls
337is a superclass of the static type of
338.IR obj )
339the automatically defined conversion macros should be used instead,
340because they're much faster and can't fail.
341.PP
342When the target class is known statically,
343it's slightly more convenient to use the
344.B SOD_CONVERT
345macro rather than the
346.B sod_convert
347function,
348since the class object name is longer and uglier,
349and the macro returns a pointer of the correct type.
350.
351.SS Instance lifecycle
352The following macros and functions
353manage the standard steps along
354an instance's lifecycle.
355.PP
356The
357.B SOD_INIT
358macro,
359and the
360.B sod_init
361and
362.B sod_initv
363functions,
364imprint and initialize an instance of a class
365.I cls
366in the storage starting at address
367.IR p .
368.PP
369The direct class for the new instance is specified as
370a class name to
371.BR SOD_INIT ,
372or a pointer to a class object to the functions.
373.PP
374Keyword arguments for the initialization message may be provided.
375The
376.B SOD_INIT
377macro expects a single preprocessor-time argument
378which is a use of one of
379.B KWARGS
380or
381.B NO_KWARGS
382(see
383.BR keyword (3));
384the
385.B sod_init
386function expects the keywords as
387a variable-length argument tail;
388and
389.B sod_initv
390expects the keywords to be passed indirectly,
391through the captured argument-tail cursor
392.IR ap .
393.PP
394The return value is an instance pointer for the class
395.IR cls ;
396the
397.B SOD_INIT
398macro will have converted it to the correct type,
399so it should probably be used where possible.
400In fact, this is guaranteed to be equal to
401.I p
402by the layout rules described in
403.BR sod-structs (3).
404.PP
405The
406.B SOD_DECL
407macro declares and initializes an instance
408with automatic storage duration.
409Given a class name
410.I cls
411and an identifier
412.IR var ,
413.B SOD_DECL(\c
414.IB cls ,
415.IB var )
416declares
417.I var
418to be a pointer to an instance of
419.IR cls .
420The instance is initialized in the sense that
421its vtable and class pointers have been set up,
422and slots for which initializers are defined
423are set to the appropriate initial values.
424The instance has automatic storage duration:
425pointers to it will become invalid when control
426exits the scope of the declaration.
427.
428.\"--------------------------------------------------------------------------
429.SH SEE ALSO
430.BR keyword (3),
431.BR sod (1),
432.BR sod-structs (3).
433.
434.\"--------------------------------------------------------------------------
435.SH AUTHOR
436Mark Wooding, <mdw@distorted.org.uk>
437.
438.\"----- That's all, folks --------------------------------------------------