root/tests/testUI.cpp @ 152

Revision 151, 5.7 kB (checked in by mido, 16 years ago)

UserInfo?, finalni verze, cas vznaset pripominky ( krom komentaru, ty zatim nejsou hotove, a netreba to pripominat:)

  • Property svn:eol-style set to native
Line 
1#include "userinfo.h"
2
3//////////////////////////////////////////////////////////////////////////////////////////////
4////////////////////////////////////////// BASIC VALUED USER INFOS ///////////////////////////
5//////////////////////////////////////////////////////////////////////////////////////////////
6
7class BoolUI: public ValuedUserInfo<bool>
8{
9private:
10
11        bool* AssemblyInstance()
12        {               
13                if( value == "true" )
14                        return new bool( true );
15                else
16                        return new bool( false );
17        }
18
19        bool DisassemblyInstance(bool &instance)
20        {
21                if( instance )
22                        value = "true";
23                else
24                        value = "false";
25                return true; 
26        }
27
28public:
29
30        BoolUI()
31                : ValuedUserInfo<bool>("bool")
32        {
33        }
34};
35
36const TypedUserInfo<bool>& TypedUserInfo<bool>::instance = BoolUI();
37
38
39class IntUI: public ValuedUserInfo<int>
40{
41private:
42
43        int* AssemblyInstance()
44        {
45                return new int( atoi( value.c_str()) );
46        }
47
48        bool DisassemblyInstance(int &instance)
49        {
50                char buff[30];
51                sprintf(buff, "%d", instance );
52                value = buff;
53                return true; 
54        }
55
56public:
57        IntUI():ValuedUserInfo<int>("int")
58        {
59        }
60};
61
62const TypedUserInfo<int>& TypedUserInfo<int>::instance = IntUI();
63
64
65class DoubleUI: public ValuedUserInfo<double>
66{
67private:
68
69        double* AssemblyInstance()
70        {
71                return new double( atof( value.c_str()) );
72        }
73
74        bool DisassemblyInstance(double &instance)
75        {
76                char buff[30];
77                sprintf(buff, "%f", instance );
78                value = buff;
79                return true; 
80        }
81
82public:
83        DoubleUI():ValuedUserInfo<double>("double")
84        {
85        }
86};
87
88const TypedUserInfo<double>& TypedUserInfo<double>::instance = DoubleUI();
89
90
91class StringUI: public ValuedUserInfo<string>
92{
93private:
94        string* AssemblyInstance()
95        {
96                return new string( value );
97        }
98
99        bool DisassemblyInstance(string &instance)
100        {
101                value = instance;
102                return true;
103        }
104
105public:
106        StringUI():ValuedUserInfo<string>("string")
107        {
108        }
109};
110
111const TypedUserInfo<string>& TypedUserInfo<string>::instance = StringUI();
112
113//////////////////////////////////////////////////////////////////////////////////////////////
114////////////////////////////////////////// EXAMPLE CLASSES DEFINITION ////////////////////////
115//////////////////////////////////////////////////////////////////////////////////////////////
116class Transport
117{
118public:
119        const int year;
120        const string manufacturer;
121
122        Transport( int year, string manufacturer )
123                : year( year ), manufacturer( manufacturer )
124        {
125        }
126
127        virtual public void ToString() = 0;
128};
129
130class Car : public Transport
131{
132public:
133        const int kilometers;
134
135        Car( int year, string manufacturer, int kilometers )
136                : Transport( year, manufacturer ), kilometers( kilometers )
137        {
138        }
139
140        void ToString()
141        {
142                cout << "a car made in " << year << " by " << manufacturer << ", having " << kilometers << " kilometers on the clock." << endl;
143        }
144};
145
146class Bike : public Transport
147{
148public:
149        const bool electricLights;
150
151        Bike( int age, string manufacturer, bool electricLights )
152                : Transport( age, manufacturer ), electricLights( electricLights )
153        {
154        }
155
156        void ToString()
157        {
158                cout << "a bike made in " << year << " by " << manufacturer;
159                if( electricLights ) cout << " with electric lights included";                                         
160                cout << endl;           
161        }
162};
163
164//////////////////////////////////////////////////////////////////////////////////////////////
165////////////////////////////////////////// AND RELATED USER INFOS ////////////////////////////
166//////////////////////////////////////////////////////////////////////////////////////////////
167
168
169class CarUI: public CompoundUserInfo<Car>
170{
171private:
172        BindedElement<int> year; 
173        BindedElement<int> kilometers; 
174        BindedElement<string> manufacturer; 
175public:
176        CarUI()
177                :CompoundUserInfo<Car>("car"),
178                year( this, "year", 0 ),
179                kilometers( this, "kilometers", 0 ),
180                manufacturer( this, "manufacturer", "unknown")
181        {
182        }
183private:
184
185        Car* AssemblyInstance()
186        {
187                // assembly new instance
188                return new Car( year.value, manufacturer.value, kilometers.value );
189        }
190
191        bool DisassemblyInstance(Car& instance)
192        {
193                year.value = instance.year;
194                manufacturer.value = instance.manufacturer;
195                kilometers.value = instance.kilometers;
196                return true;
197        }
198};
199
200const TypedUserInfo<Car>& TypedUserInfo<Car>::instance = CarUI( );
201
202
203class BikeUI: public CompoundUserInfo<Bike>
204{
205private:
206        BindedElement<int> year; 
207        BindedElement<bool> lights; 
208        BindedElement<string> manufacturer; 
209public:
210        BikeUI()
211                :CompoundUserInfo<Bike>("bike"),
212                year( this, "year", 0 ),
213                lights( this, "electric_lights", false ), // jen jedno slovo!
214                manufacturer( this, "manufacturer", "unknown")
215        {
216        }
217private:
218
219        Bike* AssemblyInstance()
220        {
221                // assembly new instance
222                return new Bike( year.value, manufacturer.value, lights.value );
223        }
224
225        bool DisassemblyInstance(Bike& instance)
226        {
227                year.value = instance.year;
228                manufacturer.value = instance.manufacturer;
229                lights.value = instance.electricLights;
230                return true;
231        }
232};
233
234const TypedUserInfo<Bike>& TypedUserInfo<Bike>::instance = BikeUI( );
235
236
237int main()
238{
239        Car audi( 1998, "audi", 25000);
240        Car liaz( 1992, "liaz", 1555000);
241        Bike author( 1996, "author", true );
242
243        /////////////////////////////////// SAVING ///////////////////////////
244
245        RootElement root("transport.xml");
246
247        if( !UserInfo::Disassembly( audi, root, "pepikovo") 
248                || !UserInfo::Disassembly( liaz, root, "jardovo") 
249                || !UserInfo::Disassembly( author, root, "ondrejovo")  )
250        {
251                cout << "there was some error!" << endl;
252                getchar();
253                return 0;                       
254        }
255
256        root.Save();
257        cout << "all the transport means were saved correctly" << endl;                         
258        getchar();
259
260        //////////////////////////////////// LOADING ////////////////////////////////
261
262        string whichone = "pepikovo";
263//      whichone = "jardovo";
264        whichone = "ondrejovo";
265
266        root.Load();
267        Transport *loaded = UserInfo::Assembly<Transport>( root,whichone);
268       
269        if( loaded )
270                loaded->ToString();
271        else
272                cout << "there was some error during loading!" << endl;
273               
274        getchar(); 
275        return 0;
276}
Note: See TracBrowser for help on using the browser.