[5717495] | 1 | \chapter{Linked List}
|
---|
| 2 |
|
---|
| 3 | I wrote a linked-list library for \CFA. This chapter describes it.
|
---|
| 4 |
|
---|
| 5 | The library provides a doubly-linked list that
|
---|
| 6 | attaches links intrusively,
|
---|
| 7 | supports multiple link directions,
|
---|
| 8 | integrates with user code via the type system,
|
---|
| 9 | treats its ends uniformly, and
|
---|
| 10 | identifies a list using an explicit head.
|
---|
| 11 |
|
---|
| 12 | TODO: more summary
|
---|
| 13 |
|
---|
| 14 |
|
---|
| 15 |
|
---|
| 16 | \section{Features}
|
---|
| 17 |
|
---|
| 18 | \subsection{Core Design Issues}
|
---|
| 19 |
|
---|
| 20 | This section reviews how a user experiences my \CFA list library's position on the issues of Section~\ref{toc:lst:issue}.
|
---|
| 21 | The library provides a doubly-linked list that
|
---|
| 22 | attaches links intrusively,
|
---|
| 23 | supports multiple link directions,
|
---|
| 24 | integrates with user code via the type system,
|
---|
| 25 | treats its ends uniformly, and
|
---|
| 26 | identifies a list using an explicit head.
|
---|
| 27 |
|
---|
[5d9c4bb] | 28 | The \CFA list library's version of the running @req@ example is in Figure~\ref{fig:lst-features-intro}.
|
---|
| 29 | Its link attachment is intrusive and the resulting memory layout is pure-stack, just as for the LQ version of Figure~\ref{f:Intrusive}.
|
---|
| 30 | The framework-provided type @dlink(...)@ provides the links.
|
---|
| 31 | The user inserts the links into the @req@ structure by using \CFA inline-inheritance (TODO: reference introduction).
|
---|
| 32 | Inline inheritance means the type of the field is @dlink(req)@, the field is unnamed, a reference to a @req@ is implicitly convertible to @dlink@.\footnote{
|
---|
| 33 | The \CFA list examples elide the \lstinline{P9_EMBEDDED} annotations that (TODO: xref P9E future work) proposes to obviate.
|
---|
| 34 | Thus, these examples illustrate a to-be state, free of what is to be historic clutter.
|
---|
| 35 | The elided portions are immaterial to the discussion and the examples work with the annotations provided.
|
---|
| 36 | The \CFA test suite (TODO:cite?) includes equivalent demonstrations, with the annotations included.}
|
---|
| 37 | These links have a nontrivial, user-specified location within the @req@ structure;
|
---|
| 38 | this convention encapsulates the implied pointer arithmetic safely.
|
---|
[5717495] | 39 |
|
---|
| 40 | \begin{figure}
|
---|
[b64d0f4] | 41 | \lstinput{20-32}{lst-features-intro.run.cfa}
|
---|
[5717495] | 42 | \caption[Multiple link directions in \CFA list library]{
|
---|
[5d9c4bb] | 43 | Demonstration of the running \lstinline{req} example, done using the \CFA list library.
|
---|
[5717495] | 44 | This example does the same job that Figure~\ref{fig:lst-issues-attach} shows three ways.
|
---|
| 45 | }
|
---|
[5d9c4bb] | 46 | \label{fig:lst-features-intro}
|
---|
[5717495] | 47 | \end{figure}
|
---|
| 48 |
|
---|
| 49 | \begin{figure}
|
---|
[5d9c4bb] | 50 | \centering
|
---|
| 51 | \begin{tabular}{@{}ll@{}}
|
---|
| 52 | \begin{tabular}{@{}l@{}}
|
---|
[b64d0f4] | 53 | \lstinput{20-25}{lst-features-multidir.run.cfa} \\
|
---|
| 54 | \lstinput{40-67}{lst-features-multidir.run.cfa}
|
---|
[5d9c4bb] | 55 | \end{tabular}
|
---|
| 56 | &
|
---|
[b64d0f4] | 57 | \lstinput[language=C++]{20-60}{lst-issues-multi-static.run.c}
|
---|
[5d9c4bb] | 58 | \end{tabular}
|
---|
| 59 |
|
---|
| 60 | \caption{
|
---|
[5717495] | 61 | Demonstration of multiple static link directions done in the \CFA list library.
|
---|
| 62 | This example does the same job as Figure~\ref{fig:lst-issues-multi-static}.
|
---|
| 63 | }
|
---|
[5d9c4bb] | 64 | \label{fig:lst-features-multidir}
|
---|
[5717495] | 65 | \end{figure}
|
---|
| 66 |
|
---|
[5d9c4bb] | 67 | Figure~\ref{fig:lst-features-multidir} shows how the \CFA library supports multi-static link directionality.
|
---|
[5717495] | 68 | The declaration of @req@ now has two inline-inheriting @dlink@ occurrences.
|
---|
[5d9c4bb] | 69 | The first of these lines gives a type named @req.by_pri@, @req@ inherits from it, and it inherits from @dlink@.
|
---|
| 70 | The second line @req.by_rqr@ is similar to @req.by_pri@.
|
---|
[5717495] | 71 | Thus, there is a diamond, non-virtual, inheritance from @req@ to @dlink@, with @by_pri@ and @by_rqr@ being the mid-level types.
|
---|
| 72 | Disambiguation occurs in the declarations of the list-head objects.
|
---|
| 73 | The type of the variable @reqs_pri_global@ is @dlist(req, req.by_pri)@,
|
---|
| 74 | meaning operations called on @reqs_pri_global@ are implicitly disambiguated.
|
---|
[5d9c4bb] | 75 | In the example, the calls @insert_first(reqs_pri_global, ...)@ imply, ``here, we are working by priority.''
|
---|
[5717495] | 76 |
|
---|
| 77 | The \CFA library also supports the common case, of single directionality, more naturally than LQ.
|
---|
| 78 | Figure~\ref{fig:lst-features-intro} shows a single-direction list done with no contrived name for the link direction,
|
---|
[5d9c4bb] | 79 | where Figure~\ref{f:Intrusive} adds the unnecessary name, @x@.
|
---|
[5717495] | 80 | In \CFA, a user doing a single direction (Figure~\ref{fig:lst-features-intro})
|
---|
[5d9c4bb] | 81 | sets up a simple inheritance with @dlink@, and declares a list head to have the simpler type @dlist(...)@.
|
---|
[5717495] | 82 | While a user doing multiple link directions (Figure~\ref{fig:lst-features-multidir})
|
---|
[5d9c4bb] | 83 | sets up a diamond inheritance with @dlink@, and declares a list head to have the more-informed type @dlist(..., DIR)@.
|
---|
[5717495] | 84 |
|
---|
| 85 | The \CFA library offers a type-system mediated integration with user code.
|
---|
| 86 | The examples presented do not use preprocessor macros.
|
---|
| 87 | The touchpoints @dlink@ and @dlist@ are ordinary types.
|
---|
| 88 | Even though they are delivered as header-included static-inline implementations,
|
---|
| 89 | the \CFA compiler typechecks the list library code separately from user code.
|
---|
| 90 | Errors in user code are reported only with mention of the library's declarations.
|
---|
| 91 |
|
---|
| 92 | The \CFA library works in headed and headless modes. TODO: elaborate.
|
---|
| 93 |
|
---|
| 94 | \subsection{Iteration-FOUNDATIONS}
|
---|
| 95 |
|
---|
| 96 | TODO: This section should be moved to a Foundations chapter. The next section stays under Linked List.
|
---|
| 97 |
|
---|
| 98 |
|
---|
| 99 | \subsection{Iteration}
|
---|
| 100 |
|
---|
| 101 |
|
---|
| 102 | \section{Future Work}
|
---|
| 103 | \label{toc:lst:futwork}
|
---|
| 104 |
|
---|
| 105 |
|
---|
| 106 | TODO: deal with: A doubly linked list is being designed.
|
---|
| 107 |
|
---|
| 108 | TODO: deal with: Link fields are system-managed.
|
---|
| 109 | Links in GDB.
|
---|
| 110 |
|
---|