Add anna_ to libraries and examples
[anna.git] / example / core / recycler / main.cpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #include <iostream>
10 #include <functional>
11
12 #include <anna/core/core.hpp>
13 #include <anna/timex/MicroMeter.hpp>
14
15 using namespace std;
16
17 static const int N = 10000;
18
19 void print_const (const Recycler<int>& numbers)
20 {
21    string msg;
22
23    const int* c;
24    for (Recycler <int>::const_iterator ii = numbers.begin (), maxii = numbers.end (); ii != maxii; ii ++) {
25       c = Recycler <int>::data (ii);
26       msg = anna::functions::asString ("Number 3 (p=0x%x): %d", c, *c);
27       Logger::debug (msg, ANNA_FILE_LOCATION);
28    }
29 }
30
31 void debug (const char* str, Recycler<int>::iterator ii)
32    throw ()
33 {
34    int* p = Recycler<int>::data (ii);
35
36    string msg (str);
37    msg += " (p=";
38    msg += functions::asHexString (anna_ptrnumber_cast (p));
39    msg += functions::asText ("): ", *p);
40    Logger::debug (msg, ANNA_FILE_LOCATION);
41 }
42
43 void run (const bool randomAccess, const int freeCounter) 
44    throw (RuntimeException)
45 {
46    Recycler <int> numbers (randomAccess);
47    int* p;
48    int i;
49    string msg;
50
51    // Crear N elementos
52    for (i = 0; i < N; i ++) {
53       p = numbers.create ();
54       *p = i;
55    }
56
57    // Los recorre
58    for (Recycler <int>::iterator ii = numbers.begin (), maxii = numbers.end (); ii != maxii; ii ++) 
59       debug ("Number 1", ii);
60
61    // Calcule cuantos objetos tiene que liberar
62    int number;
63    
64    for (int nn = 0; nn < freeCounter; nn ++) {
65       number = rand () % (N * 2);
66
67       for (Recycler <int>::iterator ii = numbers.begin (), maxii = numbers.end (); ii != maxii; ii ++) {
68          p = Recycler <int>::data (ii);
69
70          if (*p == number) {
71             debug ("Release | ", ii);
72             numbers.release (p);
73             break;
74          }
75       }
76    }
77       
78    for (i = 0; i < N; i ++) {
79       p = numbers.create ();
80       *p = (1 + i) * 1000;
81    }
82    for (Recycler <int>::iterator ii = numbers.begin (), maxii = numbers.end (); ii != maxii; ii ++) 
83       debug ("Number 2", ii);
84
85    numbers.clear ();
86    for (i = 0; i < N; i ++) {
87       p = numbers.create ();
88       *p = (10 + i) * 2000;
89    }
90
91    print_const (numbers);
92 }
93
94 void recycling (const bool randomAccess, const int freeCounter)
95    throw (RuntimeException)
96 {
97    Recycler <int> numbers (randomAccess);
98    int** pp;
99    int* p;
100    int i;
101  
102    pp = new int* [N];
103
104    // Creating N items 
105    for (i = 0; i < N; i ++) {
106       p = pp [i] = numbers.create ();
107       *p = i;
108    }
109
110    // How many objects must be released? 
111    int number;
112
113    for (int nn = 0; nn < freeCounter; nn ++) {
114       number = rand () % N;
115       p = pp [number];
116       numbers.release (p);
117    }
118 }
119
120 void reuse (const int freeCounter)
121    throw (RuntimeException)
122 {
123    int** pp;
124    int* p;
125    int i;
126  
127    pp = new int* [N];
128
129    // Creating N items 
130    for (i = 0; i < N; i ++) {
131       p = pp [i] = new int;
132       *p = i;
133    }
134
135    // How many objects must be released? 
136    int number;
137
138    for (int nn = 0; nn < freeCounter; nn ++) {
139       number = rand () % N;
140       p = pp [number];
141       delete p;
142       pp [number] = NULL;
143    }
144 }
145 int main (int argc, const char** argv)
146 {
147    anna::timex::MicroMeter meter;
148
149    try {
150       Logger::setLevel (Logger::Debug); 
151       Logger::initialize ("recycler", new TraceWriter ("file.trace", 2048000));
152  
153       const int freeCounter = rand () % N;
154    
155       Logger::debug (functions::asText ("Nodes to delete: ", freeCounter), ANNA_FILE_LOCATION);
156
157       cout << "Nodes to delete: " << freeCounter << endl << endl;
158
159       run (false, freeCounter);
160       cout << "run (false, freeCounter): " << meter.getDelay () << " us" << endl;
161
162       meter.setControlPoint ();
163       run (true, freeCounter);
164       cout <<  "run (true, freeCounter): " << meter.getDelay () << " us" << endl;
165
166       meter.setControlPoint ();
167       recycling (false, freeCounter);
168       cout << "recycling(false): " << meter.getDelay () << " us" << endl;
169
170       meter.setControlPoint ();
171       recycling (true, freeCounter);
172       cout <<  "recycling(true): " << meter.getDelay () << " us" << endl;
173
174       meter.setControlPoint ();
175       reuse (freeCounter);
176       cout <<  "reuse(): " << meter.getDelay () << " us" << endl;
177    }
178    catch (Exception& ex) {
179       cout << ex.asString () << endl;
180    }
181
182    Recycler <string> rstr;
183    meter.setControlPoint ();
184    
185    
186    return 0;
187 }
188