1 // =================================
 2 // Copyright (c) 2024 Seppo Laakko
 3 // Distributed under the MIT license
 4 // =================================
 5 
 6 using System;
 7 using System.Collections;
 8 
 9 namespace System.Xml.Serialization
10 {
11     delegate XmlSerializable* FactoryFunction();
12 
13     public class XmlClassRegistry
14     {
15         static XmlClassRegistry() : instance(new XmlClassRegistry())
16         {
17         }
18         public static XmlClassRegistry& Instance()
19         {
20             return *instance;
21         }
22         private XmlClassRegistry()
23         {
24         }
25         public Result<bool> Register(int classIdconst string& classNameFactoryFunction factoryFunction)
26         {
27             auto it = factoryMap.Find(classId);
28             if (it != factoryMap.End())
29             {
30                 int errorId = AllocateError("class id " + ToString(classId) + " of class \'" + 
31                     className + "\' conflicts with previously registered class \'" + classIdNameMap[classId] + 
32                     "\', please change the name of one or the other to have different hash codes");
33                 return Result<bool>(ErrorId(errorId));
34             }
35             classIdNameMap[classId] = className;
36             factoryMap[classId] = factoryFunction;
37             return Result<bool>(true);
38         }
39         public Result<XmlSerializable*> Create(int classId)
40         {
41             auto it = factoryMap.Find(classId);
42             if (it != factoryMap.End())
43             {
44                 FactoryFunction factoryFunction = it->second;
45                 return Result<XmlSerializable*>(factoryFunction());
46             }
47             else
48             {
49                 int errorId = AllocateError("class having id " + ToString(classId) + " not registered");
50                 return Result<XmlSerializable*>(ErrorId(errorId));
51             }
52         }
53         private static UniquePtr<XmlClassRegistry> instance;
54         private Map<intstring> classIdNameMap;
55         private Map<intFactoryFunction> factoryMap;
56     }
57 
58     [nodiscard]
59     public Result<bool> XmlRegister<T>(int classId)
60     {
61         return XmlClassRegistry.Instance().Register(classIdT.StaticClassName()T.Create);
62     }
63 }