| [86bd7c1f] | 1 | //
 | 
|---|
 | 2 | // Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
 | 
|---|
 | 3 | //
 | 
|---|
 | 4 | // The contents of this file are covered under the licence agreement in the
 | 
|---|
 | 5 | // file "LICENCE" distributed with Cforall.
 | 
|---|
 | 6 | //
 | 
|---|
| [bb82c03] | 7 | // iostream --
 | 
|---|
| [86bd7c1f] | 8 | //
 | 
|---|
| [90c3b1c] | 9 | // Author           : Peter A. Buhr
 | 
|---|
| [86bd7c1f] | 10 | // Created On       : Wed May 27 17:56:53 2015
 | 
|---|
 | 11 | // Last Modified By : Peter A. Buhr
 | 
|---|
| [6de9f4a] | 12 | // Last Modified On : Mon Sep 11 09:17:07 2017
 | 
|---|
 | 13 | // Update Count     : 137
 | 
|---|
| [86bd7c1f] | 14 | //
 | 
|---|
 | 15 | 
 | 
|---|
| [53a6c2a] | 16 | #pragma once
 | 
|---|
| [51b73452] | 17 | 
 | 
|---|
| [6de9f4a] | 18 | #include <uchar.h>
 | 
|---|
 | 19 | #include <wchar.h>
 | 
|---|
| [d3b7937] | 20 | #include "iterator"
 | 
|---|
| [e56cfdb0] | 21 | 
 | 
|---|
| [4040425] | 22 | trait ostream( dtype ostype ) {
 | 
|---|
| [9ebd778] | 23 |         // private
 | 
|---|
| [3849857] | 24 |         _Bool sepPrt( ostype * );                                                       // return separator state (on/off)
 | 
|---|
 | 25 |         void sepReset( ostype * );                                                      // set separator state to default state
 | 
|---|
 | 26 |         void sepReset( ostype *, _Bool );                                       // set separator and default state
 | 
|---|
| [829c907] | 27 |         const char * sepGetCur( ostype * );                                     // get current separator string
 | 
|---|
 | 28 |         void sepSetCur( ostype *, const char * );                       // set current separator string
 | 
|---|
| [53a6c2a] | 29 |         _Bool getNL( ostype * );                                                        // check newline
 | 
|---|
 | 30 |         void setNL( ostype *, _Bool );                                          // saw newline
 | 
|---|
| [9ebd778] | 31 |         // public
 | 
|---|
 | 32 |         void sepOn( ostype * );                                                         // turn separator state on
 | 
|---|
 | 33 |         void sepOff( ostype * );                                                        // turn separator state off
 | 
|---|
 | 34 |         _Bool sepDisable( ostype * );                                           // set default state to off, and return previous state
 | 
|---|
 | 35 |         _Bool sepEnable( ostype * );                                            // set default state to on, and return previous state
 | 
|---|
 | 36 | 
 | 
|---|
| [bb82c03] | 37 |         const char * sepGet( ostype * );                                        // get separator string
 | 
|---|
| [829c907] | 38 |         void sepSet( ostype *, const char * );                          // set separator to string (15 character maximum)
 | 
|---|
 | 39 |         const char * sepGetTuple( ostype * );                           // get tuple separator string
 | 
|---|
 | 40 |         void sepSetTuple( ostype *, const char * );                     // set tuple separator to string (15 character maximum)
 | 
|---|
| [3849857] | 41 | 
 | 
|---|
| [86bd7c1f] | 42 |         int fail( ostype * );
 | 
|---|
| [6ba0659] | 43 |         int flush( ostype * );
 | 
|---|
| [90c3b1c] | 44 |         void open( ostype * os, const char * name, const char * mode );
 | 
|---|
 | 45 |         void close( ostype * os );
 | 
|---|
 | 46 |         ostype * write( ostype *, const char *, unsigned long int );
 | 
|---|
| [829c907] | 47 |         int fmt( ostype *, const char fmt[], ... );
 | 
|---|
| [86f384b] | 48 | }; // ostream
 | 
|---|
| [90c3b1c] | 49 | 
 | 
|---|
| [e1780a2] | 50 | // trait writeable( otype T ) {
 | 
|---|
 | 51 | //      forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, T );
 | 
|---|
 | 52 | // }; // writeable
 | 
|---|
 | 53 | 
 | 
|---|
 | 54 | trait writeable( otype T, dtype ostype | ostream( ostype ) ) {
 | 
|---|
 | 55 |         ostype * ?|?( ostype *, T );
 | 
|---|
| [86f384b] | 56 | }; // writeable
 | 
|---|
| [51b73452] | 57 | 
 | 
|---|
| [4e06c1e] | 58 | // implement writable for intrinsic types
 | 
|---|
| [51b73452] | 59 | 
 | 
|---|
| [cf16f94] | 60 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, char );
 | 
|---|
| [1630f18] | 61 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, signed char );
 | 
|---|
 | 62 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, unsigned char );
 | 
|---|
| [90c3b1c] | 63 | 
 | 
|---|
 | 64 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, short int );
 | 
|---|
 | 65 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, unsigned short int );
 | 
|---|
| [cf16f94] | 66 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, int );
 | 
|---|
| [784deab] | 67 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, unsigned int );
 | 
|---|
 | 68 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, long int );
 | 
|---|
 | 69 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, long long int );
 | 
|---|
 | 70 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, unsigned long int );
 | 
|---|
 | 71 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, unsigned long long int );
 | 
|---|
| [90c3b1c] | 72 | 
 | 
|---|
| [d3b7937] | 73 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, float ); // FIX ME: should not be required
 | 
|---|
| [cf16f94] | 74 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, double );
 | 
|---|
| [784deab] | 75 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, long double );
 | 
|---|
| [90c3b1c] | 76 | 
 | 
|---|
| [d3b7937] | 77 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, float _Complex );
 | 
|---|
 | 78 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, double _Complex );
 | 
|---|
 | 79 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, long double _Complex );
 | 
|---|
| [90c3b1c] | 80 | 
 | 
|---|
| [cf16f94] | 81 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const char * );
 | 
|---|
| [6de9f4a] | 82 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const char16_t * );
 | 
|---|
 | 83 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const char32_t * );
 | 
|---|
 | 84 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const wchar_t * );
 | 
|---|
| [cf16f94] | 85 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const void * );
 | 
|---|
 | 86 | 
 | 
|---|
| [c443d1d] | 87 | // tuples
 | 
|---|
| [e1780a2] | 88 | forall( dtype ostype, otype T, ttype Params | writeable( T, ostype ) | { ostype * ?|?( ostype *, Params ); } )
 | 
|---|
 | 89 | ostype * ?|?( ostype * os, T arg, Params rest );
 | 
|---|
| [c443d1d] | 90 | 
 | 
|---|
| [4e06c1e] | 91 | // manipulators
 | 
|---|
| [c443d1d] | 92 | forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, ostype * (*)( ostype * ) );
 | 
|---|
| [cf16f94] | 93 | forall( dtype ostype | ostream( ostype ) ) ostype * endl( ostype * );
 | 
|---|
| [53a6c2a] | 94 | forall( dtype ostype | ostream( ostype ) ) ostype * sep( ostype * );
 | 
|---|
 | 95 | forall( dtype ostype | ostream( ostype ) ) ostype * sepTuple( ostype * );
 | 
|---|
| [90c3b1c] | 96 | forall( dtype ostype | ostream( ostype ) ) ostype * sepOn( ostype * );
 | 
|---|
 | 97 | forall( dtype ostype | ostream( ostype ) ) ostype * sepOff( ostype * );
 | 
|---|
| [53ba273] | 98 | forall( dtype ostype | ostream( ostype ) ) ostype * sepDisable( ostype * );
 | 
|---|
 | 99 | forall( dtype ostype | ostream( ostype ) ) ostype * sepEnable( ostype * );
 | 
|---|
| [e56cfdb0] | 100 | 
 | 
|---|
 | 101 | // writes the range [begin, end) to the given stream
 | 
|---|
| [e1780a2] | 102 | forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )
 | 
|---|
 | 103 | void write( iterator_type begin, iterator_type end, ostype * os );
 | 
|---|
| [e56cfdb0] | 104 | 
 | 
|---|
| [e1780a2] | 105 | forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )
 | 
|---|
 | 106 | void write_reverse( iterator_type begin, iterator_type end, ostype * os );
 | 
|---|
| [51b73452] | 107 | 
 | 
|---|
| [6ba0659] | 108 | //---------------------------------------
 | 
|---|
| [51b73452] | 109 | 
 | 
|---|
| [4040425] | 110 | trait istream( dtype istype ) {
 | 
|---|
| [86bd7c1f] | 111 |         int fail( istype * );
 | 
|---|
 | 112 |         int eof( istype * );
 | 
|---|
| [90c3b1c] | 113 |         void open( istype * is, const char * name, const char * mode );
 | 
|---|
 | 114 |         void close( istype * is );
 | 
|---|
 | 115 |         istype * read( istype *, char *, unsigned long int );
 | 
|---|
| [6ba0659] | 116 |         istype * ungetc( istype *, char );
 | 
|---|
| [829c907] | 117 |         int fmt( istype *, const char fmt[], ... );
 | 
|---|
| [86f384b] | 118 | }; // istream
 | 
|---|
| [51b73452] | 119 | 
 | 
|---|
| [4040425] | 120 | trait readable( otype T ) {
 | 
|---|
| [cf16f94] | 121 |         forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, T );
 | 
|---|
| [86f384b] | 122 | }; // readable
 | 
|---|
| [51b73452] | 123 | 
 | 
|---|
| [7bc4e6b] | 124 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, char & );
 | 
|---|
| [6de9f4a] | 125 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, signed char & );
 | 
|---|
 | 126 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, unsigned char & );
 | 
|---|
| [90c3b1c] | 127 | 
 | 
|---|
| [7bc4e6b] | 128 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, short int & );
 | 
|---|
 | 129 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, unsigned short int & );
 | 
|---|
 | 130 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, int & );
 | 
|---|
 | 131 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, unsigned int & );
 | 
|---|
 | 132 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, long int & );
 | 
|---|
 | 133 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, long long int & );
 | 
|---|
 | 134 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, unsigned long int & );
 | 
|---|
 | 135 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, unsigned long long int & );
 | 
|---|
| [90c3b1c] | 136 | 
 | 
|---|
| [7bc4e6b] | 137 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, float & );
 | 
|---|
 | 138 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, double & );
 | 
|---|
 | 139 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, long double & );
 | 
|---|
| [90c3b1c] | 140 | 
 | 
|---|
| [7bc4e6b] | 141 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, float _Complex & );
 | 
|---|
 | 142 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, double _Complex & );
 | 
|---|
 | 143 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, long double _Complex & );
 | 
|---|
| [90c3b1c] | 144 | 
 | 
|---|
| [53ba273] | 145 | struct _Istream_cstrUC { char * s; };
 | 
|---|
 | 146 | _Istream_cstrUC cstr( char * );
 | 
|---|
 | 147 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_cstrUC );
 | 
|---|
| [51b73452] | 148 | 
 | 
|---|
| [53ba273] | 149 | struct _Istream_cstrC { char * s; int size; };
 | 
|---|
 | 150 | _Istream_cstrC cstr( char *, int size );
 | 
|---|
 | 151 | forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_cstrC );
 | 
|---|
| [51b73452] | 152 | 
 | 
|---|
| [86bd7c1f] | 153 | // Local Variables: //
 | 
|---|
| [d3b7937] | 154 | // mode: c //
 | 
|---|
| [86bd7c1f] | 155 | // tab-width: 4 //
 | 
|---|
 | 156 | // End: //
 | 
|---|