1 // traffic_2
  2 
  3 using System;
  4 using System.Collections;
  5 using System.Xml;
  6 using System.Xml.Serialization;
  7 
  8 public enum Color
  9 {
 10     whiteblackredblue
 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 }