1 // =================================
  2 // Copyright (c) 2024 Seppo Laakko
  3 // Distributed under the MIT license
  4 // =================================
  5 
  6 using System.IO;
  7 
  8 namespace System
  9 {
 10     public static class Console
 11     {
 12         static Console()
 13         {
 14             FileStream* inStream = new FileStream(stdin);
 15             in.SetStream(inStream);
 16             in.Own(inStream);
 17             if (in.Error())
 18             {
 19                 SetErrorId(in.GetErrorId());
 20                 return;
 21             }
 22             FileStream* outStream = new FileStream(stdout);
 23             out.SetStream(outStream);
 24             out.Own(outStream);
 25             if (out.Error())
 26             {
 27                 SetErrorId(out.GetErrorId());
 28                 return;
 29             }
 30             FileStream* errStream = new FileStream(stderr);
 31             err.SetStream(errStream);
 32             err.Own(errStream);
 33             if (err.Error())
 34             {
 35                 SetErrorId(err.GetErrorId());
 36                 return;
 37             }
 38         }
 39         public static void Write(const char* s)
 40         {
 41             auto result = out.Write(s);
 42             if (result.Error())
 43             {
 44                 SetErrorId(result.GetErrorId());
 45                 return;
 46             }
 47         }
 48         public static void Write(const wchar* s)
 49         {
 50             auto result = out.Write(s);
 51             if (result.Error())
 52             {
 53                 SetErrorId(result.GetErrorId());
 54                 return;
 55             }
 56         }
 57         public static void Write(const uchar* s)
 58         {
 59             auto result = out.Write(s);
 60             if (result.Error())
 61             {
 62                 SetErrorId(result.GetErrorId());
 63                 return;
 64             }
 65         }
 66         public static void Write(const string& s)
 67         {
 68             auto result = out.Write(s);
 69             if (result.Error())
 70             {
 71                 SetErrorId(result.GetErrorId());
 72                 return;
 73             }
 74         }
 75         public static void Write(const wstring& s)
 76         {
 77             auto result = out.Write(s);
 78             if (result.Error())
 79             {
 80                 SetErrorId(result.GetErrorId());
 81                 return;
 82             }
 83         }
 84         public static void Write(const ustring& s)
 85         {
 86             auto result = out.Write(s);
 87             if (result.Error())
 88             {
 89                 SetErrorId(result.GetErrorId());
 90                 return;
 91             }
 92         }
 93         public static void Write(bool b)
 94         {
 95             auto result = out.Write(b);
 96             if (result.Error())
 97             {
 98                 SetErrorId(result.GetErrorId());
 99                 return;
100             }
101         }
102         public static void Write(sbyte s)
103         {
104             auto result = out.Write(s);
105             if (result.Error())
106             {
107                 SetErrorId(result.GetErrorId());
108                 return;
109             }
110         }
111         public static void Write(byte b)
112         {
113             auto result = out.Write(b);
114             if (result.Error())
115             {
116                 SetErrorId(result.GetErrorId());
117                 return;
118             }
119         }
120         public static void Write(short s)
121         {
122             auto result = out.Write(s);
123             if (result.Error())
124             {
125                 SetErrorId(result.GetErrorId());
126                 return;
127             }
128         }
129         public static void Write(ushort u)
130         {
131             auto result = out.Write(u);
132             if (result.Error())
133             {
134                 SetErrorId(result.GetErrorId());
135                 return;
136             }
137         }
138         public static void Write(int i)
139         {
140             auto result = out.Write(i);
141             if (result.Error())
142             {
143                 SetErrorId(result.GetErrorId());
144                 return;
145             }
146         }
147         public static void Write(uint u)
148         {
149             auto result = out.Write(u);
150             if (result.Error())
151             {
152                 SetErrorId(result.GetErrorId());
153                 return;
154             }
155         }
156         public static void Write(long l)
157         {
158             auto result = out.Write(l);
159             if (result.Error())
160             {
161                 SetErrorId(result.GetErrorId());
162                 return;
163             }
164         }
165         public static void Write(ulong u)
166         {
167             auto result = out.Write(u);
168             if (result.Error())
169             {
170                 SetErrorId(result.GetErrorId());
171                 return;
172             }
173         }
174         public static void Write(float f)
175         {
176             auto result = out.Write(f);
177             if (result.Error())
178             {
179                 SetErrorId(result.GetErrorId());
180                 return;
181             }
182         }
183         public static void Write(double d)
184         {
185             auto result = out.Write(d);
186             if (result.Error())
187             {
188                 SetErrorId(result.GetErrorId());
189                 return;
190             }
191         }
192         public static void Write(char c)
193         {
194             auto result = out.Write(c);
195             if (result.Error())
196             {
197                 SetErrorId(result.GetErrorId());
198                 return;
199             }
200         }
201         public static void Write(wchar w)
202         {
203             auto result = out.Write(w);
204             if (result.Error())
205             {
206                 SetErrorId(result.GetErrorId());
207                 return;
208             }
209         }
210         public static void Write(uchar u)
211         {
212             auto result = out.Write(u);
213             if (result.Error())
214             {
215                 SetErrorId(result.GetErrorId());
216                 return;
217             }
218         }
219         public static void Write(const Date& date)
220         {
221             auto result = out.Write(date);
222             if (result.Error())
223             {
224                 SetErrorId(result.GetErrorId());
225                 return;
226             }
227         }
228         public static void Write(const DateTime& dateTime)
229         {
230             auto result = out.Write(dateTime);
231             if (result.Error())
232             {
233                 SetErrorId(result.GetErrorId());
234                 return;
235             }
236         }
237         public static void WriteLine()
238         {
239             auto result = out.WriteLine();
240             if (result.Error())
241             {
242                 SetErrorId(result.GetErrorId());
243                 return;
244             }
245         }
246         public static void WriteLine(const char* s)
247         {
248             auto result = out.WriteLine(s);
249             if (result.Error())
250             {
251                 SetErrorId(result.GetErrorId());
252                 return;
253             }
254         }
255         public static void WriteLine(const wchar* s)
256         {
257             auto result = out.WriteLine(s);
258             if (result.Error())
259             {
260                 SetErrorId(result.GetErrorId());
261                 return;
262             }
263         }
264         public static void WriteLine(const uchar* s)
265         {
266             auto result = out.WriteLine(s);
267             if (result.Error())
268             {
269                 SetErrorId(result.GetErrorId());
270                 return;
271             }
272         }
273         public static void WriteLine(const string& s)
274         {
275             auto result = out.WriteLine(s);
276             if (result.Error())
277             {
278                 SetErrorId(result.GetErrorId());
279                 return;
280             }
281         }
282         public static void WriteLine(const wstring& s)
283         {
284             auto result = out.WriteLine(s);
285             if (result.Error())
286             {
287                 SetErrorId(result.GetErrorId());
288                 return;
289             }
290         }
291         public static void WriteLine(const ustring& s)
292         {
293             auto result = out.WriteLine(s);
294             if (result.Error())
295             {
296                 SetErrorId(result.GetErrorId());
297                 return;
298             }
299         }
300         public static void WriteLine(bool b)
301         {
302             auto result = out.WriteLine(b);
303             if (result.Error())
304             {
305                 SetErrorId(result.GetErrorId());
306                 return;
307             }
308         }
309         public static void WriteLine(sbyte s)
310         {
311             auto result = out.WriteLine(s);
312             if (result.Error())
313             {
314                 SetErrorId(result.GetErrorId());
315                 return;
316             }
317         }
318         public static void WriteLine(byte b)
319         {
320             auto result = out.WriteLine(b);
321             if (result.Error())
322             {
323                 SetErrorId(result.GetErrorId());
324                 return;
325             }
326         }
327         public static void WriteLine(short s)
328         {
329             auto result = out.WriteLine(s);
330             if (result.Error())
331             {
332                 SetErrorId(result.GetErrorId());
333                 return;
334             }
335         }
336         public static void WriteLine(ushort u)
337         {
338             auto result = out.WriteLine(u);
339             if (result.Error())
340             {
341                 SetErrorId(result.GetErrorId());
342                 return;
343             }
344         }
345         public static void WriteLine(int i)
346         {
347             auto result = out.WriteLine(i);
348             if (result.Error())
349             {
350                 SetErrorId(result.GetErrorId());
351                 return;
352             }
353         }
354         public static void WriteLine(uint u)
355         {
356             auto result = out.WriteLine(u);
357             if (result.Error())
358             {
359                 SetErrorId(result.GetErrorId());
360                 return;
361             }
362         }
363         public static void WriteLine(long l)
364         {
365             auto result = out.WriteLine(l);
366             if (result.Error())
367             {
368                 SetErrorId(result.GetErrorId());
369                 return;
370             }
371         }
372         public static void WriteLine(ulong u)
373         {
374             auto result = out.WriteLine(u);
375             if (result.Error())
376             {
377                 SetErrorId(result.GetErrorId());
378                 return;
379             }
380         }
381         public static void WriteLine(float f)
382         {
383             auto result = out.WriteLine(f);
384             if (result.Error())
385             {
386                 SetErrorId(result.GetErrorId());
387                 return;
388             }
389         }
390         public static void WriteLine(double d)
391         {
392             auto result = out.WriteLine(d);
393             if (result.Error())
394             {
395                 SetErrorId(result.GetErrorId());
396                 return;
397             }
398         }
399         public static void WriteLine(char c)
400         {
401             auto result = out.WriteLine(c);
402             if (result.Error())
403             {
404                 SetErrorId(result.GetErrorId());
405                 return;
406             }
407         }
408         public static void WriteLine(wchar w)
409         {
410             auto result = out.WriteLine(w);
411             if (result.Error())
412             {
413                 SetErrorId(result.GetErrorId());
414                 return;
415             }
416         }
417         public static void WriteLine(uchar u)
418         {
419             auto result = out.WriteLine(u);
420             if (result.Error())
421             {
422                 SetErrorId(result.GetErrorId());
423                 return;
424             }
425         }
426         public static void WriteLine(const Date& date)
427         {
428             auto result = out.WriteLine(date);
429             if (result.Error())
430             {
431                 SetErrorId(result.GetErrorId());
432                 return;
433             }
434         }
435         public static void WriteLine(const DateTime& dateTime)
436         {
437             auto result = out.WriteLine(dateTime);
438             if (result.Error())
439             {
440                 SetErrorId(result.GetErrorId());
441                 return;
442             }
443         }
444         [nodiscard]
445         public static Result<int> Read()
446         {
447             return in.Read();
448         }
449         [nodiscard]
450         public static Result<string> ReadLine()
451         {
452             return in.ReadLine();
453         }
454         [nodiscard]
455         public static Result<string> ReadToEnd()
456         {
457             return in.ReadToEnd();
458         }
459         public static StreamReader& In()
460         {
461             return in;
462         }
463         public static StreamWriter& Out()
464         {
465             return out;
466         }
467         public static StreamWriter& Error()
468         {
469             return err;
470         }
471         public static void SetIn(StreamReader&& in_)
472         {
473             in = in_;
474         }
475         public static void SetOut(StreamWriter&& out_)
476         {
477             out = out_;
478         }
479         public static void SetError(StreamWriter&& err_)
480         {
481             err = err_;
482         }
483         public static bool HasError()
484         {
485             return errorId != 0;
486         }
487         public static int ErrorId() const
488         {
489             return errorId;
490         }
491         public static void SetErrorId(int errorId_)
492         {
493             errorId = errorId_;
494         }
495         private static StreamReader in;
496         private static StreamWriter out;
497         private static StreamWriter err;
498         private static int errorId;
499     }