1
2
3 using System;
4 using System.Collections;
5 using System.Xml;
6 using System.Xml.Serialization;
7
8 public enum Color
9 {
10 white, black, red, blue
11 }
12
13 public string ColorStr(Color color)
14 {
15 switch (color)
16 {
17 case Color.white: return "white";
18 case Color.black: return "black";
19 case Color.red: return "red";
20 case Color.blue: return "blue";
21 }
22 return "<unknown color>";
23 }
24
25 [xml]
26 public abstract class Vehicle
27 {
28 public Vehicle()
29 {
30 }
31 public virtual default ~Vehicle();
32 public void SetModel(const string& model_)
33 {
34 model = model_;
35 }
36 public inline const string& Model() const
37 {
38 return model;
39 }
40 public void SetColor(Color color_)
41 {
42 color = color_;
43 }
44 public inline Color GetColor() const
45 {
46 return color;
47 }
48 public virtual void Print()
49 {
50 Console.Out() << ClassName() << "\n";
51 Console.Out() << "model: " << model << "\n";
52 Console.Out() << "color: " << ColorStr(color) << "\n";
53 }
54 private string model;
55 private Color color;
56 }
57
58 [xml]
59 public class Bicycle : Vehicle
60 {
61 public Bicycle()
62 {
63 }
64 public inline int Price()
65 {
66 return price;
67 }
68 public void SetPrice(int price_)
69 {
70 price = price_;
71 }
72 public override void Print()
73 {
74 base->Print();
75 Console.Out() << "price: " << price << "\n";
76 }
77 private int price;
78 }
79
80 [xml]
81 public class Car : Vehicle
82 {
83 public Car()
84 {
85 }
86 public void SetRegistrationNumber(const string& registrationNumber_)
87 {
88 registrationNumber = registrationNumber_;
89 }
90 public inline const string& RegistrationNumber() const
91 {
92 return registrationNumber;
93 }
94 public override void Print()
95 {
96 base->Print();
97 Console.Out() << "registrationNumber: " << registrationNumber << "\n";
98 }
99 private string registrationNumber;
100 }
101
102 [xml]
103 public class Person
104 {
105 public Person()
106 {
107 }
108 public Person(const string& name_) : name(name_)
109 {
110 }
111 public inline const string& Name() const
112 {
113 return name;
114 }
115 public void AddVehicle(Vehicle* vehicle)
116 {
117 vehicles.Add(UniquePtr<Vehicle>(vehicle));
118 }
119 public void Print()
120 {
121 Console.Out() << "Person" << "\n";
122 Console.Out() << "name: " << name << "\n";
123 Console.Out() << "vehicles:" << "\n";
124 for (const auto& vehicle : vehicles)
125 {
126 vehicle->Print();
127 }
128 }
129 private string name;
130 private List<UniquePtr<Vehicle>> vehicles;
131 }
132
133 [nodiscard]
134 Result<bool> Register()
135 {
136 auto result = Person.Register();
137 if (result.Error()) return result;
138 result = Bicycle.Register();
139 if (result.Error()) return result;
140 result = Car.Register();
141 if (result.Error()) return result;
142 return Result<bool>(true);
143 }
144
145 int main()
146 {
147 Result<bool> registerResult = Register();
148 if (registerResult.Error())
149 {
150 Console.Error() << registerResult.GetErrorMessage() << "\n";
151 return 1;
152 }
153 Person joe("Joe Coder");
154 Bicycle* cooper = new Bicycle();
155 cooper->SetModel("Cooper");
156 cooper->SetColor(Color.blue);
157 cooper->SetPrice(1000);
158 joe.AddVehicle(cooper);
159 Car* porsche = new Car();
160 porsche->SetModel("Porsche");
161 porsche->SetColor(Color.red);
162 porsche->SetRegistrationNumber("ABC-123");
163 joe.AddVehicle(porsche);
164 Result<System.Xml.Element*> toXmlResult = joe.ToXml("person");
165 if (toXmlResult.Error())
166 {
167 Console.Error() << toXmlResult.GetErrorMessage() << "\n";
168 return 1;
169 }
170 System.Xml.Element* element = toXmlResult.Value();
171 System.Xml.Document document;
172 document.AppendChild(element);
173 System.Text.CodeFormatter formatter(Console.Out());
174 formatter.SetIndentSize(1);
175 Result<bool> writeResult = document.Write(formatter);
176 if (writeResult.Error())
177 {
178 Console.Error() << writeResult.GetErrorMessage() << "\n";
179 return 1;
180 }
181 Person person;
182 Result<bool> fromXmlResult = person.FromXml(document.DocumentElement());
183 if (fromXmlResult.Error())
184 {
185 Console.Error() << fromXmlResult.GetErrorMessage() << "\n";
186 return 1;
187 }
188 person.Print();
189 return 0;
190 }