1
2
3
4
5
6 using System;
7 using System.Concepts;
8
9 namespace System.Xml.Serialization
10 {
11 public abstract class XmlPtrBase
12 {
13 public XmlPtrBase() : targetObjectId()
14 {
15 }
16 public XmlPtrBase(const Uuid& targetObjectId_) : targetObjectId(targetObjectId_)
17 {
18 }
19 public virtual default ~XmlPtrBase();
20 public const Uuid& TargetObjectId() const
21 {
22 return targetObjectId;
23 }
24 public void SetTargetObjectId(const Uuid& targetObjectId_)
25 {
26 targetObjectId = targetObjectId_;
27 }
28 public abstract void SetPtr(XmlSerializable* s);
29 private Uuid targetObjectId;
30 }
31
32 public class XmlPtr<T> : XmlPtrBase where Derived<T, XmlSerializable>
33 {
34 public XmlPtr() : base(), ptr(null)
35 {
36 }
37 public explicit XmlPtr(T* ptr_) : base(ptr_->ObjectId()), ptr(ptr_)
38 {
39 }
40 public void operator=(T* ptr_)
41 {
42 ptr = ptr_;
43 if (ptr != null)
44 {
45 SetTargetObjectId(ptr->ObjectId());
46 }
47 }
48 public T* Get() const
49 {
50 return ptr;
51 }
52 public void Reset()
53 {
54 ptr = null;
55 }
56 public void Reset(T* ptr_)
57 {
58 ptr = ptr_;
59 if (ptr != null)
60 {
61 SetTargetObjectId(ptr->ObjectId());
62 }
63 }
64 public inline bool IsNull() const
65 {
66 return ptr == null;
67 }
68 public T* operator->()
69 {
70 #assert(ptr != null);
71 return ptr;
72 }
73 public inline const T* operator->() const
74 {
75 #assert(ptr != null);
76 return ptr;
77 }
78 public inline T& operator*()
79 {
80 #assert(ptr != null);
81 return *ptr;
82 }
83 public inline const T& operator*() const
84 {
85 #assert(ptr != null);
86 return *ptr;
87 }
88 public override void SetPtr(XmlSerializable* s)
89 {
90 if (s == null)
91 {
92 ptr = null;
93 }
94 else
95 {
96 if (s is T*)
97 {
98 ptr = cast<T*>(s);
99 }
100 }
101 }
102 private T* ptr;
103 }
104
105 public bool operator==<T>(const XmlPtr<T>& left, const XmlPtr<T>& right)
106 {
107 return left.Get() == right.Get();
108 }
109
110 public bool operator<<T>(const XmlPtr<T>& left, const XmlPtr<T>& right)
111 {
112 return left.Get() < right.Get();
113 }
114 }