source: libcfa/src/bits/collection.hfa@ 91aa5ab

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 91aa5ab was 636d3715, checked in by Peter A. Buhr <pabuhr@…>, 5 years ago

more code sharing in containers

  • Property mode set to 100644
File size: 1.6 KB
Line 
1#pragma once
2
3struct Colable {
4 Colable * next; // next node in the list
5 // invariant: (next != 0) <=> listed()
6};
7
8inline {
9 void ?{}( Colable & co ) with( co ) {
10 next = 0p;
11 } // post: ! listed()
12
13 // return true iff *this is an element of a collection
14 bool listed( Colable & co ) with( co ) { // pre: this != 0
15 return next != 0p;
16 }
17
18 Colable * getNext( Colable & co ) with( co ) {
19 return next;
20 }
21
22 Colable *& Next( Colable * cp ) {
23 return cp->next;
24 }
25
26 forall( dtype T ) {
27 T *& Next( T * n ) {
28 return (T *)Next( (Colable *)n );
29 }
30
31 bool listed( T * n ) {
32 return Next( (Colable *)n ) != 0p;
33 }
34 } // distribution
35} // distribution
36
37
38struct Collection {
39 void * root; // pointer to root element of list
40};
41
42inline {
43 // class invariant: root == 0 & empty() | *root in *this
44 void ?{}( Collection &, const Collection & ) = void; // no copy
45 Collection & ?=?( const Collection & ) = void; // no assignment
46
47 void ?{}( Collection & collection ) with( collection ) {
48 root = 0p;
49 } // post: empty()
50
51 bool empty( Collection & collection ) with( collection ) { // 0 <=> *this contains no elements
52 return root == 0p;
53 }
54
55 void * head( Collection & collection ) with( collection ) {
56 return root;
57 } // post: empty() & head() == 0 | !empty() & head() in *this
58} // distribution
59
60
61struct ColIter {
62 void * curr; // element to be returned by >>
63};
64
65inline {
66 void ?{}( ColIter & colIter ) with( colIter ) {
67 curr = 0p;
68 } // post: elts = null
69
70 forall( dtype T ) {
71 T * Curr( ColIter & ci ) with( ci ) {
72 return (T *)curr;
73 }
74 } // distribution
75} // distribution
Note: See TracBrowser for help on using the repository browser.