]> gitweb.factorcode.org Git - factor.git/blob - basis/classes/struct/struct-docs.factor
1a5294992e8789c78ebb4e861c4771c8441977a0
[factor.git] / basis / classes / struct / struct-docs.factor
1 ! (c)Joe Groff bsd license
2 USING: alien classes help.markup help.syntax kernel libc
3 quotations slots ;
4 IN: classes.struct
5
6 HELP: <struct-boa>
7 { $values
8     { "class" class }
9 }
10 { $description "This macro implements " { $link boa } " for " { $link struct } " classes. A struct of the given class is constructed, and its slots are initialized using values off the top of the datastack." } ;
11
12 HELP: (struct)
13 { $values
14     { "class" class }
15     { "struct" struct }
16 }
17 { $description "Allocates garbage-collected heap memory for a new " { $link struct } " of the specified " { $snippet "class" } ". The new struct's slots are left uninitialized; in most cases, the " { $link <struct> } " word, which initializes the struct's slots with their initial values, should be used instead." } ;
18
19 { (struct) (malloc-struct) } related-words
20
21 HELP: <struct>
22 { $values
23     { "class" class }
24     { "struct" struct }
25 }
26 { $description "Allocates garbage-collected heap memory for a new " { $link struct } " of the specified " { $snippet "class" } ". The new struct's slots are initialized with the initial values specified in the struct definition." } ;
27
28 { <struct> <struct-boa> malloc-struct memory>struct } related-words
29
30 HELP: STRUCT:
31 { $syntax "STRUCT: class { slot type } { slot type } ... ;" }
32 { $values { "class" "a new " { $link struct } " class to define" } { "slots" "a list of slot specifiers" } }
33 { $description "Defines a new " { $link struct } " type. The syntax is nearly identical to " { $link POSTPONE: TUPLE: } "; however, there are some additional restrictions on struct types:"
34 { $list
35 { "Struct classes cannot have a superclass defined." }
36 { "The slots of a struct must all have a type declared. The type must be a C type." } 
37 { { $link read-only } " slots on structs are not enforced, though they may be declared." }
38 } } ;
39
40 HELP: S{
41 { $syntax "S{ class slots... }" }
42 { $values { "class" "a " { $link struct } " class word" } { "slots" "slot values" } }
43 { $description "Marks the beginning of a literal struct. The syntax is identical to tuple literal syntax with " { $link POSTPONE: T{ } { $snippet " }" } "; either the assoc syntax (that is, " { $snippet "S{ class { slot value } { slot value } ... }" } ") or the simple syntax (" { $snippet "S{ class f value value ... }" } ") can be used." } ;
44
45 HELP: S@
46 { $syntax "S@ class alien" }
47 { $values { "class" "a " { $link struct } " class word" } { "alien" "a literal alien" } }
48 { $description "Marks the beginning of a literal struct at a specific C address. The prettyprinter uses this syntax when the memory backing a struct object is invalid. This syntax should not generally be used in source code." } ;
49
50 { POSTPONE: S{ POSTPONE: S@ } related-words
51
52 HELP: UNION-STRUCT:
53 { $syntax "UNION-STRUCT: class { slot type } { slot type } ... ;" }
54 { $values { "class" "a new " { $link struct } " class to define" } { "slots" "a list of slot specifiers" } }
55 { $description "Defines a new " { $link struct } " type where all of the slots share the same storage. See " { $link POSTPONE: STRUCT: } " for details on the syntax." } ;
56
57 HELP: define-struct-class
58 { $values
59     { "class" class } { "slots" "a sequence of " { $link struct-slot-spec } "s" }
60 }
61 { $description "Defines a new " { $link struct } " class. This is the runtime equivalent of the " { $link POSTPONE: STRUCT: } " syntax." } ;
62
63 HELP: define-union-struct-class
64 { $values
65     { "class" class } { "slots" "a sequence of " { $link struct-slot-spec } "s" }
66 }
67 { $description "Defines a new " { $link struct } " class where all of the slots share the same storage. This is the runtime equivalent of the " { $link POSTPONE: UNION-STRUCT: } " syntax." } ;
68
69 HELP: malloc-struct
70 { $values
71     { "class" class }
72     { "struct" struct }
73 }
74 { $description "Allocates unmanaged C heap memory for a new " { $link struct } " of the specified " { $snippet "class" } ". The new struct's slots are initialized to their initial values. The struct should be " { $link free } "d when it is no longer needed." } ;
75
76 HELP: (malloc-struct)
77 { $values
78     { "class" class }
79     { "struct" struct }
80 }
81 { $description "Allocates unmanaged C heap memory for a new " { $link struct } " of the specified " { $snippet "class" } ". The new struct's slots are left uninitialized; to initialize the allocated memory with the slots' initial values, use " { $link malloc-struct } ". The struct should be " { $link free } "d when it is no longer needed." } ;
82
83 HELP: memory>struct
84 { $values
85     { "ptr" c-ptr } { "class" class }
86     { "struct" struct }
87 }
88 { $description "Constructs a new " { $link struct } " of the specified " { $snippet "class" } " at the memory location referenced by " { $snippet "ptr" } ". The referenced memory is unchanged." } ;
89
90 HELP: struct
91 { $class-description "The parent class of all struct types." } ;
92
93 { struct POSTPONE: STRUCT: POSTPONE: UNION-STRUCT: } related-words
94
95 HELP: struct-class
96 { $class-description "The metaclass of all " { $link struct } " classes." } ;
97
98 ARTICLE: "classes.struct.examples" "Struct class examples"
99 "A struct with a variety of fields:"
100 { $code
101     "USING: alien.c-types classes.struct ;"
102     ""
103     "STRUCT: test-struct"
104     "    { i int }"
105     "    { chicken char[16] }"
106     "    { data void* } ;"
107 }
108 "Creating a new instance of this struct, and printing out:"
109 { $code "test-struct <struct> ." }
110 "Creating a new instance with slots initialized from the stack:"
111 { $code
112     "USING: libc specialized-arrays ;"
113     "SPECIALIZED-ARRAY: char"
114     ""
115     "42"
116     "\"Hello, chicken.\" >char-array"
117     "1024 malloc"
118     "test-struct <struct-boa> ."
119 } ;
120
121 ARTICLE: "classes.struct.define" "Defining struct classes"
122 "Struct classes are defined using a syntax similar to the " { $link POSTPONE: TUPLE: } " syntax for defining tuple classes:"
123 { $subsections POSTPONE: STRUCT: }
124 "Union structs are also supported, which behave like structs but share the same memory for all the slots."
125 { $subsections POSTPONE: UNION-STRUCT: } ;
126
127 ARTICLE: "classes.struct.create" "Creating instances of structs"
128 "Structs can be allocated with " { $link new } "- and " { $link boa } "-like constructor words. Additional words are provided for building structs from C memory and from existing buffers:"
129 { $subsections
130     <struct>
131     <struct-boa>
132     malloc-struct
133     memory>struct
134 }
135 "When the contents of a struct will be immediately reset, faster primitive words are available that will create a struct without initializing its contents:"
136 { $subsections
137     (struct)
138     (malloc-struct)
139 }
140 "Structs have literal syntax, similar to " { $link POSTPONE: T{ } " for tuples:"
141 { $subsections POSTPONE: S{ } ;
142
143 ARTICLE: "classes.struct.c" "Passing structs to C functions"
144 "Structs can be passed and returned by value, or by reference."
145 $nl
146 "If a parameter is declared with a struct type, the parameter is passed by value. To pass a struct by reference, declare a parameter with a pointer to struct type."
147 $nl
148 "If a C function is declared as returning a struct type, the struct is returned by value, and wrapped in an instance of the correct struct class automatically. If a C function is declared as returning a pointer to a struct, it will return an " { $link alien } " instance. This is because there is no way to distinguish between a pointer to a single struct and a pointer to an array of zero or more structs. It is up to the caller to wrap it in a struct, or a specialized array of structs, respectively."
149 $nl
150 "An example of a struct declaration:"
151 { $code
152     "USING: alien.c-types classes.struct ;"
153     ""
154     "STRUCT: Point"
155     "    { x int }"
156     "    { y int }"
157     "    { z int } ;"
158 }
159 "A C function which returns a struct by value:"
160 { $code
161     "USING: alien.syntax ;"
162     "FUNCTION: Point give_me_a_point ( char* description ) ;"
163 }
164 "A C function which takes a struct parameter by reference:"
165 { $code
166     "FUNCTION: void print_point ( Point* p ) ;"
167 } ;
168
169 ARTICLE: "classes.struct" "Struct classes"
170 "The " { $vocab-link "classes.struct" } " vocabulary implements " { $link struct } " classes. They are similar to " { $link tuple } " classes, but their slots exhibit value semantics, and they are backed by a contiguous structured block of memory. Structs can be used for space-efficient storage of data in the Factor heap, as well as for passing data to and from C libraries using the " { $link "alien" } "."
171 { $subsections
172     "classes.struct.examples"
173     "classes.struct.define"
174     "classes.struct.create"
175     "classes.struct.c"
176 } ;
177
178 ABOUT: "classes.struct"