blob: 87ee2b304608682afe76d3b76d1e4beb2ffbe0b2 [file] [log] [blame] [view]
# Emboss Roadmap
Arrows indicate implementation order; that is, "A -> B -> C" means "C depends on
B which depends on A."
```dot {layout_engine=dot}
digraph {
node [ shape=box target="_top" ]
edge [ dir="back" ]
rankdir="RL"
{
rank="sink"
misc [ label="Other" URL="#misc" ]
strings [ label="String Type" URL="#strings" ]
proto_back [ label="Proto Backend" URL="#proto_back" ]
arr_of_bits [ label="Packed Arrays" URL="#arr_of_bits" ]
array_stride [ label="Arbitrary Array Stride" URL="#array_stride" ]
dyn_array_elem_size [ label="Dynamic Elements" URL="#dyn_array_elem_size" ]
shift_ops [ label="<< and >>" URL="#shift_ops" ]
private [ label="Private Fields" URL="#private" ]
type_syn [ label="Type Syntax" URL="#type_syn" ]
division [ label="//" URL="#division" ]
exponent [ label="**" URL="#exponent" ]
requires [ label="[requires]" URL="#requires" ]
}
del_range [ label="rm [range]" URL="#del_range" ]
del_is_integer [ label="rm [is_integer]" URL="#del_is_integer" ]
{
rank="source"
del_anon_hack [ label="Unhack Anon Bits" URL="#del_anon_hack" ]
checksums [ label="CRC/Checksum" URL="#checksums" ]
}
del_is_integer -> type_syn
del_range -> requires
checksums -> requires
del_anon_hack -> private
del_is_integer -> exponent
del_is_integer -> division
open_source -> del_range
open_source -> del_is_integer
edge [style=dashed]
}
```
[TOC]
## Type Syntax {#type_syn}
A syntax for expressing Emboss expression types. Likely some variation of set
builder notation:
```
{ x in $integer | 0 <= x <= 510 && x % 2 == 0 }
```
This is needed to replace the `[is_integer]` attribute
## Remove `[is_integer]` {#del_is_integer}
Replace the `[is_integer]` attribute on `external`s with a `[type]` attribute.
This also lets us remove the hack in `expression_bounds.py`. In passing, it
should also allow `Flag` fields to be used as booleans in expressions.
## Private Fields {#private}
Provide some annotation -- likely an attribute -- that indicates that a field is
"private:" that it should not appear in text format, and that it cannot be
referenced from outside the structure. From an end user perspective, this is
primarily useful for virtual fields; internally, the automatic structure that
wraps anonymous bits can also be marked private so that the backend can stop
caring about `is_anonymous`.
## Finishing Refactoring Hacky Anonymous Bits Code {#del_anon_hack}
Replace the final uses of *`name`*`.is_anonymous` with something that marks
"anonymous" fields as "private."
## `[requires]` on Fields {#requires}
Allow the `[requires]` attribute on fields, which can provide an arbitrary
expression whose value must be `true` for the field to be `Ok()`.
## Remove `[range]` {#del_range}
Replace all extant uses of `[range: low..high]` with `[requires: low <= field <
high]`, and remove support for `[range]`.
## Native Checksum/CRC Support {#checksums}
Add support for checking standard checksums/CRCs, and for automatically
computing them.
## Shift Operators (`<<` and `>>`) {#shift_ops}
Left and right shift operators for use in expressions.
## Flooring Integer Division (`//`) and Modulus (`%`) {#division}
Flooring (not truncating) integer division for use in expressions, and the
corresponding modulus operator.
## Exponentiation (`**`) {#exponent}
Exponentiation operator. Mostly needed for `[type]` on `UInt`, `Int`, and
`Bcd`.
## Arrays with Runtime-Sized Elements {#dyn_array_elem_size}
Support for arrays where the element size is not known until runtime; e.g.,
arrays of arrays, where the inner array's size is determined by some variable.
## Arbitrary Array Stride {#array_stride}
Support for arrays where the stride (distance between the starts of successive
elements) is different from the element size. Needed to support padding between
elements and interlaced elements.
## Large Arrays of `bits` {#arr_of_bits}
Support for large, packed arrays of, e.g., 12-bit integers. Requires such
arrays to be byte-order-aware, and there are potential readability concerns.
## Proto Backend {#proto_back}
A backend which generates:
1. A `.proto` file with an "equivalent" set of types.
2. C++ code that can populate the protos from Emboss views and vice versa.
Essentially, you would be able to serialize to and deserialize from the "proto
form" the same way that you can currently serialize to and deserialize from
text.
## String Type {#strings}
A physical type for strings. This is complex, because strings can be stored in
many formats. It is likely that Emboss will only support byte strings, and will
not directly handle character encodings, but that still leaves a number of
common formats:
1. Length-specified: length is determined by another field.
2. Delimited: string runs until some delimiter byte; usually zero, but
sometimes ASCII space or '$'.
3. Optionally-delimited: string runs until either a delimiter byte *or* some
maximum size.
4. Right-padded: string bytes run to some maximum size, but padding bytes
(usually ASCII space) should be chopped off the end. Bytes with the
padding value can appear in the middle.
## Miscellaneous/Potential Features {#misc}
These features could happen if there is interest, but there is no current plan
to implement them.
### Fixed Point
Support for fixed-point arithmetic, both in expressions and physical formats.
### Documentation Backend
Support for an HTML/PDF/???-format documentation generator.
### Python Backend
A code generator for Python.