1 // =================================
  2 // Copyright (c) 2024 Seppo Laakko
  3 // Distributed under the MIT license
  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<TXmlSerializable>
 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>& leftconst XmlPtr<T>& right)
106     {
107         return left.Get() == right.Get();
108     }
109 
110     public bool operator<<T>(const XmlPtr<T>& leftconst XmlPtr<T>& right)
111     {
112         return left.Get() < right.Get();
113     }
114 }