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