# Aggregate Types

## Overview

Aggregate types are comprised of one or more primitive types.

def-enum

Defines a &c; enumeration.

Macro

## Syntax

    	  def-enum name fields &key separator-string

### Arguments and Values

`name`

- A symbol that names the enumeration.

`fields`

- A list of field defintions. Each definition can be a symbol or a list of two elements. Symbols get assigned a value of the current counter which starts at `0` and increments by `1` for each subsequent symbol. It the field definition is a list, the first position is the symbol and the second position is the value to assign the the symbol. The current counter gets set to `1+` this value.

`separator-string`

- A string that governs the creation of constants. The default is `"#"`.

### Description

Declares a &c; enumeration. It generates constants with integer values for the elements of the enumeration. The symbols for the these constant values are created by the `concatenation` of the enumeration name, separator-string, and field symbol. Also creates a foreign type with the name `name` of type `:int`.

### Examples

    (def-enum abc (:a :b :c))
    ;; Creates constants abc#a (1), abc#b (2), abc#c (3) and defines
    ;; the foreign type "abc" to be :int

    (def-enum efoo (:e1 (:e2 10) :e3) :separator-string "-")
    ;; Creates constants efoo-e1 (1), efoo-e2 (10), efoo-e3 (11) and defines
    ;; the foreign type efoo to be :int

### Side Effects

Creates a :int foreign type, defines constants.

### Affected by

None.

### Exceptional Situations

None.

def-struct

Defines a &c; structure.

Macro

## Syntax

    	  def-struct name &rest fields

### Arguments and Values

`name`

- A symbol that names the structure.

`fields`

- A variable number of field defintions. Each definition is a list consisting of a symbol naming the field followed by its foreign type.

### Description

Declares a structure. A special type is available as a slot in the field. It is a pointer that points to an instance of the parent structure. It's type is `:pointer-self`.

### Examples

    (def-struct foo (a :unsigned-int)
                    (b (* :char))
                    (c (:array :int 10))
                    (next :pointer-self))

### Side Effects

Creates a foreign type.

### Affected by

None.

### Exceptional Situations

None.

get-slot-value

Retrieves a value from a slot of a structure.

Macro

## Syntax

    	  get-slot-value obj type field => value

### Arguments and Values

`obj`

- A pointer to foreign structure.

`type`

- A name of the foreign structure.

`field`

- A name of the desired field in foreign structure.

value

- The value of the field in the structure.

### Description

Accesses a slot value from a structure. This is generalized and can be used with `setf`.

### Examples

    (get-slot-value foo-ptr 'foo-structure 'field-name)
    (setf (get-slot-value foo-ptr 'foo-structure 'field-name) 10)

### Side Effects

None.

### Affected by

None.

### Exceptional Situations

None.

get-slot-pointer

Retrieves a pointer from a slot of a structure.

Macro

## Syntax

    	  get-slot-pointer obj type field => pointer

### Arguments and Values

`obj`

- A pointer to foreign structure.

`type`

- A name of the foreign structure.

`field`

- A name of the desired field in foreign structure.

pointer

- The value of the field in the structure.

### Description

This is similar to `get-slot-value`. It is used when the value of a slot is a pointer type.

### Examples

    (get-slot-pointer foo-ptr 'foo-structure 'my-char-ptr)

### Side Effects

None.

### Affected by

None.

### Exceptional Situations

None.

def-array-pointer

Defines a pointer to a array of type.

Macro

## Syntax

    	  def-array-pointer name type

### Arguments and Values

`name`

- A name of the new foreign type.

`type`

- The foreign type of the array elements.

### Description

Defines a type tat is a pointer to an array of type.

### Examples

    (def-array-pointer byte-array-pointer :unsigned-char)

### Side Effects

Defines a new foreign type.

### Affected by

None.

### Exceptional Situations

None.

deref-array

Deference an array.

Macro

## Syntax

    	  deref-array array type position => value

### Arguments and Values

`array`

- A foreign array.

`type`

- The foreign type of the array.

`position`

- An integer specifying the position to retrieve from the array.

value

- The value stored in the position of the array.

### Description

Dereferences (retrieves) the value of an array element.

### Examples

    (def-array-pointer ca :char)
    (let ((fs (convert-to-foreign-string "ab")))
       (values (null-char-p (deref-array fs 'ca 0))
               (null-char-p (deref-array fs 'ca 2))))
    => &nil;
       &t;

### Notes

The TYPE argument is ignored for CL implementations other than AllegroCL. If you want to cast a pointer to another type use WITH-CAST-POINTER together with DEREF-POINTER/DEREF-ARRAY.

### Side Effects

None.

### Affected by

None.

### Exceptional Situations

None.

def-union

Defines a foreign union type.

Macro

## Syntax

    	  def-union name &rest fields

### Arguments and Values

`name`

- A name of the new union type.

`fields`

- A list of fields of the union.

### Description

Defines a foreign union type.

### Examples

    (def-union test-union
      (a-char :char)
      (an-int :int))

    (let ((u (allocate-foreign-object 'test-union))
      (setf (get-slot-value u 'test-union 'an-int) (+ 65 (* 66 256)))
      (prog1
        (ensure-char-character (get-slot-value u 'test-union 'a-char))
        (free-foreign-object u)))
    => #\A

### Side Effects

Defines a new foreign type.

### Affected by

None.

### Exceptional Situations

None.