First commit
[anna.git] / example / core / sortName / main.cpp
1 // ANNA - Anna is Not 'N' Anymore
2 //
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
4 //
5 // https://bitbucket.org/testillano/anna
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
9 // are met:
10 //
11 //     * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 //     * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 //     * Neither the name of Google Inc. nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 // Authors: eduardo.ramos.testillano@gmail.com
34 //          cisco.tierra@gmail.com
35
36
37 #include <iostream>
38
39 #include <functional>
40
41 #include <anna/core/core.hpp>
42
43 using namespace std;
44
45 class Object {
46 public:
47    Object ();
48
49    const std::string& getName () const throw () { return a_name; }
50
51 private:
52    std::string a_name;
53 };
54
55 struct SortByName {
56    static const std::string& value (const Object* oo) throw () { return oo->getName (); }
57 };
58
59 string generate ()
60 {
61    string result;
62    char aux [34];
63
64    int len = 1 + rand () % 32;
65
66    int ii;
67    for (ii = 0; ii < len; ii ++)
68       aux [ii] = char (rand () % 28 + 'A');
69    aux [ii] = 0;
70
71    return result = aux;
72 }
73
74 Object::Object ()
75 {
76    a_name = generate ();
77 }
78
79 void run () 
80    throw (RuntimeException)
81 {
82    typedef SortedVector <Object, SortByName, std::string> container;
83    typedef container::iterator iterator;
84    container sorted;
85
86    static const int MaxIndex = 64;
87
88    Object** object;
89
90    object = new Object* [MaxIndex];
91
92    for (int ii = 0; ii < MaxIndex; ii ++) {
93       object [ii] = new Object;
94       sorted.add (object [ii]);
95    }
96
97    for (iterator ii = sorted.begin (), maxii = sorted.end (); ii != maxii; ii ++) 
98        cout << container::data (ii)->getName () << endl;
99    cout << endl << endl;
100
101    string value;
102    int counter;
103    int found;
104
105    counter = found = 0;
106
107    for (int loop = 0; loop < 1000; loop ++) {
108       for (int ii = 0; ii < MaxIndex; ii ++, counter ++) {
109         value = ((rand () % 100) > 50) ? object [ii]->getName (): generate ();
110         if (sorted.find (value) != NULL)
111            found ++;
112       }
113    }
114
115    cout << "Counter: " << counter << " | Found: " << found << endl << endl;
116 }
117
118 int main (int argc, const char** argv)
119 {
120    try {
121       Logger::setLevel (Logger::Debug); 
122       Logger::initialize ("testfunctions", new TraceWriter ("file.trace", 2048000));
123   
124       run ();
125    }
126    catch (Exception& ex) {
127       cout << ex.asString () << endl;
128    }
129    
130    return 0;
131 }
132