1 
  
    2 
  
    3 
  
    4 
  
    5 
  
    6 using System;
  
    7 
  
    8 namespace System.IO
  
    9 {
  
   10     public class MemoryWriter : IOBase
  
   11     {
  
   12         public MemoryWriter(byte* ptr_, long count_) : base(), ptr(ptr_), pos(ptr), count(count_)
  
   13         {
  
   14         }
  
   15         [nodiscard]
  
   16         public Result<bool> Write(bool x)
  
   17         {
  
   18             if (Error())
  
   19             {
  
   20                 return Result<bool>(ErrorId(GetErrorId()));
  
   21             }
  
   22             return Write(cast<byte>(x));
  
   23         }
  
   24         [nodiscard]
  
   25         public Result<bool> Write(byte x)
  
   26         {
  
   27             if (Error())
  
   28             {
  
   29                 return Result<bool>(ErrorId(GetErrorId()));
  
   30             }
  
   31             if (pos - ptr >= count)
  
   32             {
  
   33                 int errorId = AllocateError("memory writer: end of space");
  
   34                 SetErrorId(errorId);
  
   35                 return Result<bool>(ErrorId(errorId));
  
   36             }
  
   37             *pos++ = x;
  
   38             return Result<bool>(true);
  
   39         }
  
   40         [nodiscard]
  
   41         public Result<bool> Write(sbyte x)
  
   42         {
  
   43             if (Error())
  
   44             {
  
   45                 return Result<bool>(ErrorId(GetErrorId()));
  
   46             }
  
   47             return Write(cast<byte>(x));
  
   48         }
  
   49         [nodiscard]
  
   50         public Result<bool> Write(ushort x)
  
   51         {
  
   52             if (Error())
  
   53             {
  
   54                 return Result<bool>(ErrorId(GetErrorId()));
  
   55             }
  
   56             byte b0 = cast<byte>(x >> 8u);
  
   57             byte b1 = cast<byte>(x);
  
   58             auto result = Write(b0);
  
   59             if (result.Error())
  
   60             {
  
   61                 return Result<bool>(ErrorId(result.GetErrorId()));
  
   62             }
  
   63             return Write(b1);
  
   64         }
  
   65         [nodiscard]
  
   66         public Result<bool> Write(short x)
  
   67         {
  
   68             if (Error())
  
   69             {
  
   70                 return Result<bool>(ErrorId(GetErrorId()));
  
   71             }
  
   72             return Write(cast<ushort>(x));
  
   73         }
  
   74         [nodiscard]
  
   75         public Result<bool> Write(uint x)
  
   76         {
  
   77             if (Error())
  
   78             {
  
   79                 return Result<bool>(ErrorId(GetErrorId()));
  
   80             }
  
   81             byte b0 = cast<byte>(x >> 24u);
  
   82             byte b1 = cast<byte>(x >> 16u);
  
   83             byte b2 = cast<byte>(x >> 8u);
  
   84             byte b3 = cast<byte>(x);
  
   85             auto result = Write(b0);
  
   86             if (result.Error())
  
   87             {
  
   88                 return Result<bool>(ErrorId(result.GetErrorId()));
  
   89             }
  
   90             result = Write(b1);
  
   91             if (result.Error())
  
   92             {
  
   93                 return Result<bool>(ErrorId(result.GetErrorId()));
  
   94             }
  
   95             result = Write(b2);
  
   96             if (result.Error())
  
   97             {
  
   98                 return Result<bool>(ErrorId(result.GetErrorId()));
  
   99             }
  
  100             return Write(b3);
  
  101         }
  
  102         [nodiscard]
  
  103         public Result<bool> Write(int x)
  
  104         {
  
  105             if (Error())
  
  106             {
  
  107                 return Result<bool>(ErrorId(GetErrorId()));
  
  108             }
  
  109             return Write(cast<uint>(x));
  
  110         }
  
  111         [nodiscard]
  
  112         public Result<bool> Write(ulong x)
  
  113         {
  
  114             if (Error())
  
  115             {
  
  116                 return Result<bool>(ErrorId(GetErrorId()));
  
  117             }
  
  118             byte b0 = cast<byte>(x >> 56u);
  
  119             byte b1 = cast<byte>(x >> 48u);
  
  120             byte b2 = cast<byte>(x >> 40u);
  
  121             byte b3 = cast<byte>(x >> 32u);
  
  122             byte b4 = cast<byte>(x >> 24u);
  
  123             byte b5 = cast<byte>(x >> 16u);
  
  124             byte b6 = cast<byte>(x >> 8u);
  
  125             byte b7 = cast<byte>(x);
  
  126             auto result = Write(b0);
  
  127             if (result.Error())
  
  128             {
  
  129                 return Result<bool>(ErrorId(result.GetErrorId()));
  
  130             }
  
  131             result = Write(b1);
  
  132             if (result.Error())
  
  133             {
  
  134                 return Result<bool>(ErrorId(result.GetErrorId()));
  
  135             }
  
  136             result = Write(b2);
  
  137             if (result.Error())
  
  138             {
  
  139                 return Result<bool>(ErrorId(result.GetErrorId()));
  
  140             }
  
  141             result = Write(b3);
  
  142             if (result.Error())
  
  143             {
  
  144                 return Result<bool>(ErrorId(result.GetErrorId()));
  
  145             }
  
  146             result = Write(b4);
  
  147             if (result.Error())
  
  148             {
  
  149                 return Result<bool>(ErrorId(result.GetErrorId()));
  
  150             }
  
  151             result = Write(b5);
  
  152             if (result.Error())
  
  153             {
  
  154                 return Result<bool>(ErrorId(result.GetErrorId()));
  
  155             }
  
  156             result = Write(b6);
  
  157             if (result.Error())
  
  158             {
  
  159                 return Result<bool>(ErrorId(result.GetErrorId()));
  
  160             }
  
  161             return Write(b7);
  
  162         }
  
  163         [nodiscard]
  
  164         public Result<bool> Write(long x)
  
  165         {
  
  166             if (Error())
  
  167             {
  
  168                 return Result<bool>(ErrorId(GetErrorId()));
  
  169             }
  
  170             return Write(cast<ulong>(x));
  
  171         }
  
  172         [nodiscard]
  
  173         public Result<bool> Write(float x)
  
  174         {
  
  175             if (Error())
  
  176             {
  
  177                 return Result<bool>(ErrorId(GetErrorId()));
  
  178             }
  
  179             uint* u = cast<uint*>(cast<void*>(&x));
  
  180             return Write(*u);
  
  181         }
  
  182         [nodiscard]
  
  183         public Result<bool> Write(double x)
  
  184         {
  
  185             if (Error())
  
  186             {
  
  187                 return Result<bool>(ErrorId(GetErrorId()));
  
  188             }
  
  189             ulong* u = cast<ulong*>(cast<void*>(&x));
  
  190             return Write(*u);
  
  191         }
  
  192         [nodiscard]
  
  193         public Result<bool> Write(char x)
  
  194         {
  
  195             if (Error())
  
  196             {
  
  197                 return Result<bool>(ErrorId(GetErrorId()));
  
  198             }
  
  199             return Write(cast<byte>(x));
  
  200         }
  
  201         [nodiscard]
  
  202         public Result<bool> Write(wchar x)
  
  203         {
  
  204             if (Error())
  
  205             {
  
  206                 return Result<bool>(ErrorId(GetErrorId()));
  
  207             }
  
  208             return Write(cast<ushort>(x));
  
  209         }
  
  210         [nodiscard]
  
  211         public Result<bool> Write(uchar x)
  
  212         {
  
  213             if (Error())
  
  214             {
  
  215                 return Result<bool>(ErrorId(GetErrorId()));
  
  216             }
  
  217             return Write(cast<uint>(x));
  
  218         }
  
  219         [nodiscard]
  
  220         public Result<bool> Write(const Date& date)
  
  221         {
  
  222             if (Error())
  
  223             {
  
  224                 return Result<bool>(ErrorId(GetErrorId()));
  
  225             }
  
  226             auto result = Write(date.Year());
  
  227             if (result.Error())
  
  228             {
  
  229                 return Result<bool>(ErrorId(result.GetErrorId()));
  
  230             }
  
  231             result = Write(cast<sbyte>(date.GetMonth()));
  
  232             if (result.Error())
  
  233             {
  
  234                 return Result<bool>(ErrorId(result.GetErrorId()));
  
  235             }
  
  236             return Write(date.Day());
  
  237         }
  
  238         [nodiscard]
  
  239         public Result<bool> Write(const DateTime& dt)
  
  240         {
  
  241             if (Error())
  
  242             {
  
  243                 return Result<bool>(ErrorId(GetErrorId()));
  
  244             }
  
  245             Date date = dt.GetDate();
  
  246             auto result = Write(date);
  
  247             if (result.Error())
  
  248             {
  
  249                 return Result<bool>(ErrorId(result.GetErrorId()));
  
  250             }
  
  251             return Write(dt.Seconds());
  
  252         }
  
  253         [nodiscard]
  
  254         public Result<bool> Write(const string& s)
  
  255         {
  
  256             if (Error())
  
  257             {
  
  258                 return Result<bool>(ErrorId(GetErrorId()));
  
  259             }
  
  260             for (char c : s)
  
  261             {
  
  262                 auto result = Write(cast<byte>(c));
  
  263                 if (result.Error())
  
  264                 {
  
  265                     return Result<bool>(ErrorId(result.GetErrorId()));
  
  266                 }
  
  267             }
  
  268             return Write(cast<byte>(0u));
  
  269         }
  
  270         [nodiscard]
  
  271         public Result<bool> Write(const Uuid& x)
  
  272         {
  
  273             if (Error())
  
  274             {
  
  275                 return Result<bool>(ErrorId(GetErrorId()));
  
  276             }
  
  277             for (byte b : x)
  
  278             {
  
  279                 auto result = Write(b);
  
  280                 if (result.Error())
  
  281                 {
  
  282                     return Result<bool>(ErrorId(result.GetErrorId()));
  
  283                 }
  
  284             }
  
  285             return Result<bool>(true);
  
  286         }
  
  287         private byte* ptr;
  
  288         private byte* pos;
  
  289         private long count;
  
  290     }