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 | |
---|
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. |
---|
39 | |
---|
40 | \begin{figure} |
---|
41 | \lstinput{20-32}{lst-features-intro.run.cfa} |
---|
42 | \caption[Multiple link directions in \CFA list library]{ |
---|
43 | Demonstration of the running \lstinline{req} example, done using the \CFA list library. |
---|
44 | This example does the same job that Figure~\ref{fig:lst-issues-attach} shows three ways. |
---|
45 | } |
---|
46 | \label{fig:lst-features-intro} |
---|
47 | \end{figure} |
---|
48 | |
---|
49 | \begin{figure} |
---|
50 | \centering |
---|
51 | \begin{tabular}{@{}ll@{}} |
---|
52 | \begin{tabular}{@{}l@{}} |
---|
53 | \lstinput{20-25}{lst-features-multidir.run.cfa} \\ |
---|
54 | \lstinput{40-67}{lst-features-multidir.run.cfa} |
---|
55 | \end{tabular} |
---|
56 | & |
---|
57 | \lstinput[language=C++]{20-60}{lst-issues-multi-static.run.c} |
---|
58 | \end{tabular} |
---|
59 | |
---|
60 | \caption{ |
---|
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 | } |
---|
64 | \label{fig:lst-features-multidir} |
---|
65 | \end{figure} |
---|
66 | |
---|
67 | Figure~\ref{fig:lst-features-multidir} shows how the \CFA library supports multi-static link directionality. |
---|
68 | The declaration of @req@ now has two inline-inheriting @dlink@ occurrences. |
---|
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@. |
---|
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. |
---|
75 | In the example, the calls @insert_first(reqs_pri_global, ...)@ imply, ``here, we are working by priority.'' |
---|
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, |
---|
79 | where Figure~\ref{f:Intrusive} adds the unnecessary name, @x@. |
---|
80 | In \CFA, a user doing a single direction (Figure~\ref{fig:lst-features-intro}) |
---|
81 | sets up a simple inheritance with @dlink@, and declares a list head to have the simpler type @dlist(...)@. |
---|
82 | While a user doing multiple link directions (Figure~\ref{fig:lst-features-multidir}) |
---|
83 | sets up a diamond inheritance with @dlink@, and declares a list head to have the more-informed type @dlist(..., DIR)@. |
---|
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 | |
---|