Reorder sections in bits to match the ordering in struct (#102)
* doc: reorder sections in bits to match the ordering in struct
* doc: add documentation about using struct to effectively create a union (#101)
diff --git a/doc/language-reference.md b/doc/language-reference.md
index 40da052..d9e132a 100644
--- a/doc/language-reference.md
+++ b/doc/language-reference.md
@@ -619,6 +619,20 @@
This can be useful as a way to group related fields together.
+#### Using `struct` to define a C-like `union`
+
+Emboss doesn't support C-like `union`s directly via built in type
+definitions. However, you can use Emboss's overlapping fields feature to
+effectively create a `union`:
+
+```
+struct Foo:
+ 0 [+1] UInt a
+ 0 [+2] UInt b
+ 0 [+4] UInt c
+```
+
+
#### Automatically-Generated Fields
A `struct` will have `$size_in_bytes`, `$max_size_in_bytes`, and
@@ -917,6 +931,61 @@
or writing a memory-mapped register space.
+#### Anonymous `bits`
+
+It is possible to use an anonymous `bits` definition directly in a `struct`;
+for example:
+
+```
+struct Message:
+ [$default byte_order: "BigEndian"]
+ 0 [+4] UInt message_length
+ 4 [+4] bits:
+ 0 [+1] Flag incoming
+ 1 [+1] Flag last_fragment
+ 2 [+4] UInt scale_factor
+ 31 [+1] Flag error
+```
+
+In this case, the fields of the `bits` will be treated as though they are fields
+of the outer struct.
+
+
+#### Inline `bits`
+
+Like `enum`s, it is also possible to define a named `bits` inline in a `struct`
+or `bits`. For example:
+
+```
+struct Message:
+ [$default byte_order: "BigEndian"]
+ 0 [+4] UInt message_length
+ 4 [+4] bits payload:
+ 0 [+1] Flag incoming
+ 1 [+1] Flag last_fragment
+ 2 [+4] UInt scale_factor
+ 31 [+1] Flag error
+```
+
+This is equivalent to:
+
+```
+struct Message:
+ [$default byte_order: "BigEndian"]
+
+ bits Payload:
+ 0 [+1] Flag incoming
+ 1 [+1] Flag last_fragment
+ 2 [+4] UInt scale_factor
+ 31 [+1] Flag error
+
+ 0 [+4] UInt message_length
+ 4 [+4] Payload payload
+```
+
+This can be useful as a way to group related fields together.
+
+
#### Automatically-Generated Fields
A `bits` will have `$size_in_bits`, `$max_size_in_bits`, and `$min_size_in_bits`
@@ -974,61 +1043,6 @@
`$min_size_in_bytes`.
-#### Anonymous `bits`
-
-It is possible to use an anonymous `bits` definition directly in a `struct`;
-for example:
-
-```
-struct Message:
- [$default byte_order: "BigEndian"]
- 0 [+4] UInt message_length
- 4 [+4] bits:
- 0 [+1] Flag incoming
- 1 [+1] Flag last_fragment
- 2 [+4] UInt scale_factor
- 31 [+1] Flag error
-```
-
-In this case, the fields of the `bits` will be treated as though they are fields
-of the outer struct.
-
-
-#### Inline `bits`
-
-Like `enum`s, it is also possible to define a named `bits` inline in a `struct`
-or `bits`. For example:
-
-```
-struct Message:
- [$default byte_order: "BigEndian"]
- 0 [+4] UInt message_length
- 4 [+4] bits payload:
- 0 [+1] Flag incoming
- 1 [+1] Flag last_fragment
- 2 [+4] UInt scale_factor
- 31 [+1] Flag error
-```
-
-This is equivalent to:
-
-```
-struct Message:
- [$default byte_order: "BigEndian"]
-
- bits Payload:
- 0 [+1] Flag incoming
- 1 [+1] Flag last_fragment
- 2 [+4] UInt scale_factor
- 31 [+1] Flag error
-
- 0 [+4] UInt message_length
- 4 [+4] Payload payload
-```
-
-This can be useful as a way to group related fields together.
-
-
### `external`
An `external` type is used when a type cannot be defined in Emboss itself;