Remove build binaries that have been accidentally committed
[charm.git] / examples / multiphaseSharedArrays / simpleTestVarsize / testV.C
1 #include<iostream>
2 #include<stdio.h>
3 #include<assert.h>
4
5 using namespace std;
6
7 class Double {
8     int getNumElements() {
9         int i=0;
10         Double *iter = this;
11         while(iter!=0) {
12             i++;
13             iter = iter->next;
14         }
15         return i;
16     }
17
18 public:
19     double data;
20     Double *next;
21
22     Double()
23     {
24         data = 0.0;
25         next = 0;
26     }
27
28     // copy constructor
29     //
30         // Differs from copy assignment because cc deals with
31         // unallocated memory, but ca deals with a constructed object.
32     Double(const Double &rhs)
33     {
34         data = rhs.data;
35         next = 0;
36
37         // call assignment operator
38         *this = rhs;
39     }
40
41     ~Double()
42     {
43 //         cout << "reached destructor" << endl;
44         delete next;
45     }
46
47     // assignment operator
48     Double& operator= (const Double& rhs)
49     {
50         if (this == &rhs) return *this;  // self-assignment
51
52         if (next != 0) {
53             delete next;
54             next = 0;
55         }
56
57         Double *iter1 = this;
58         const Double *iter2 = &rhs;
59         while (iter2 != 0) {
60             iter1->data = iter2->data;
61             if (iter2->next != 0)
62                 iter1->next = new Double();
63             iter2 = iter2->next;
64             iter1 = iter1->next;
65         }
66
67         return *this;
68     }
69
70     // += operator
71     // @@ what if rhs is a sequence.  Do we want to prepend the entire sequence to this Double?
72     Double& operator+= (const Double& rhs)
73     {
74         Double *tmp = new Double(data);
75         tmp->next = next;
76         data = rhs.data;
77         next = tmp;
78
79         return *this;
80     }
81
82     // typecast from int
83     Double(const int rhs) : data(rhs), next(0)
84     {
85 //         cout << "reached typecast from int" << endl;
86     }
87
88     // pup
89 //     virtual void pup(PUP::er &p){
90 //         int n = getNumElements();
91 //         p|n;
92
93 //         Double *iter = this;
94 //         if (p.isUnpacking()) {
95 //             while (n>0) {
96 //                 p|(iter->data);
97 //                 n--;
98 //                 if (n>0)
99 //                     iter->next = new Double();
100 //                 iter = iter->next;
101 //             }
102 //         } else {
103 //             while(iter!=0) {
104 //                 p|(iter->data);
105 //                 iter = iter->next;
106 //             }
107 //         }
108 //     }
109
110     // typecast Double from/to double, for convenience
111     Double(const double &rhs) : data(rhs), next(0) {}
112 //     operator double() { return data; }
113 //     operator double const () { return (const double) data; }
114 };
115
116 // convenience function
117 ostream& operator << (ostream& os, const Double& s) {
118     os << s.data;
119     if (s.next!=0)
120         os << " " << *(s.next);
121     return os;
122 }
123
124 int
125 main()
126 {
127     Double d;  // default constructor
128     cout << d << endl;
129     Double e(1); // typecast from int
130     d += e; // +=
131     cout << d << endl;
132     d += d; // prepends only the head
133     cout << "d=" << d << endl;
134     Double *f = new Double(d); // =
135     cout << "f=" << *f << endl;  // destructor
136     delete f;
137     for(int i=3; i<200; i++)
138         d += i;
139     cout << d << endl;
140     cout << "the end" << endl;
141 }