| [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 |  | 
|---|