1 // =================================
  2 // Copyright (c) 2022 Seppo Laakko
  3 // Distributed under the MIT license
  4 // =================================
  5 
  6 using System;
  7 
  8 namespace System.IO
  9 {
 10     public class StreamWriter : TextWriter
 11     {
 12         public nothrow StreamWriter(const SharedPtr<Stream>& stream_) : this(stream_stream_->IsHostTextFile())
 13         {
 14         }
 15         public nothrow StreamWriter(const SharedPtr<Stream>& stream_bool expandLineEndings_) : 
 16             stream(stream_)expandLineEndings(expandLineEndings_)
 17         {
 18         }
 19         public void Write(const char* xlong length)
 20         {
 21             if (expandLineEndings)
 22             {
 23                 long start = 0;
 24                 for (long i = 0; i < length; ++i;)
 25                 {
 26                     if (x[i] == '\n')
 27                     {
 28                         if (i > start)
 29                         {
 30                             stream->Write(cast<byte*>(cast<void*>(x)) + starti - start);
 31                         }
 32                         stream->Write(cast<byte*>(cast<void*>("\r\n"))2);
 33                         start = i + 1;
 34                     }
 35                 }
 36                 if (length > start)
 37                 {
 38                     stream->Write(cast<byte*>(cast<void*>(x)) + startlength - start);
 39                 }
 40             }
 41             else
 42             {
 43                 stream->Write(cast<byte*>(cast<void*>(x))length);
 44             }
 45         }
 46         public override void Write(const string& x)
 47         {
 48             Write(x.Chars()x.Length());
 49         }
 50         public override void Write(const wstring& x)
 51         {
 52             Write(ToUtf8(x));
 53         }
 54         public override void Write(const ustring& x)
 55         {
 56             Write(ToUtf8(x));
 57         }
 58         public override void Write(bool x)
 59         {
 60             Write(ToString(x));
 61         }
 62         public override void Write(char x)
 63         {
 64             Write(ToString(x));
 65         }
 66         public override void Write(wchar x)
 67         {
 68             Write(ToString(x));
 69         }
 70         public override void Write(uchar x)
 71         {
 72             Write(ToString(x));
 73         }
 74         public override void Write(sbyte x)
 75         {
 76             Write(ToString(x));
 77         }
 78         public override void Write(byte x)
 79         {
 80             Write(ToString(x));
 81         }
 82         public override void Write(short x)
 83         {
 84             Write(ToString(x));
 85         }
 86         public override void Write(ushort x)
 87         {
 88             Write(ToString(x));
 89         }
 90         public override void Write(int x)
 91         {
 92             Write(ToString(x));
 93         }
 94         public override void Write(uint x)
 95         {
 96             Write(ToString(x));
 97         }
 98         public override void Write(long x)
 99         {
100             Write(ToString(x));
101         }
102         public override void Write(ulong x)
103         {
104             Write(ToString(x));
105         }
106         public override void Write(float x)
107         {
108             Write(ToString(x));
109         }
110         public override void Write(double x)
111         {
112             Write(ToString(x));
113         }
114         public override void Write(const Date& date)
115         {
116             Write(date.ToString());
117         }
118         public override void Write(const DateTime& dateTime)
119         {
120             Write(dateTime.ToString());
121         }
122         public override void WriteLine()
123         {
124             Write("\n"1);
125         }
126         public override void WriteLine(const string& x)
127         {
128             Write(x);
129             WriteLine();
130         }
131         public override void WriteLine(const wstring& x)
132         {
133             Write(x);
134             WriteLine();
135         }
136         public override void WriteLine(const ustring& x)
137         {
138             Write(x);
139             WriteLine();
140         }
141         public override void WriteLine(bool x)
142         {
143             Write(x);
144             WriteLine();
145         }
146         public override void WriteLine(char x)
147         {
148             Write(x);
149             WriteLine();
150         }
151         public override void WriteLine(wchar x)
152         {
153             Write(x);
154             WriteLine();
155         }
156         public override void WriteLine(uchar x)
157         {
158             Write(x);
159             WriteLine();
160         }
161         public override void WriteLine(sbyte x)
162         {
163             Write(x);
164             WriteLine();
165         }
166         public override void WriteLine(byte x)
167         {
168             Write(x);
169             WriteLine();
170         }
171         public override void WriteLine(short x)
172         {
173             Write(x);
174             WriteLine();
175         }
176         public override void WriteLine(ushort x)
177         {
178             Write(x);
179             WriteLine();
180         }
181         public override void WriteLine(int x)
182         {
183             Write(x);
184             WriteLine();
185         }
186         public override void WriteLine(uint x)
187         {
188             Write(x);
189             WriteLine();
190         }
191         public override void WriteLine(long x)
192         {
193             Write(x);
194             WriteLine();
195         }
196         public override void WriteLine(ulong x)
197         {
198             Write(x);
199             WriteLine();
200         }
201         public override void WriteLine(float x)
202         {
203             Write(x);
204             WriteLine();
205         }
206         public override void WriteLine(double x)
207         {
208             Write(x);
209             WriteLine();
210         }
211         public override void WriteLine(const Date& date)
212         {
213             Write(date);
214             WriteLine();
215         }
216         public override void WriteLine(const DateTime& dateTime)
217         {
218             Write(dateTime);
219             WriteLine();
220         }
221         public nothrow const SharedPtr<Stream>& GetStream() const
222         {
223             return stream;
224         }
225         public inline nothrow bool ExpandLineEndings() const
226         {
227             return expandLineEndings;
228         }
229         public inline nothrow void SetExpandLineEndings(bool expandLineEndings_)
230         {
231             expandLineEndings = expandLineEndings_;
232         }
233         private SharedPtr<Stream> stream;
234         private bool expandLineEndings;
235     }
236 }