Changeset c41c2dbe
- Timestamp:
- Apr 21, 2021, 12:42:23 PM (2 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 1d5deea
- Parents:
- 341aa39 (diff), e638266 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/user/user.tex
r341aa39 rc41c2dbe 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Sat Mar 27 09:55:55202114 %% Update Count : 4 79613 %% Last Modified On : Tue Apr 20 23:25:56 2021 14 %% Update Count : 4888 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 66 66 % math escape $...$ (dollar symbol) 67 67 \input{common} % common CFA document macros 68 \setlength{\gcolumnposn}{3in} 68 69 \CFAStyle % use default CFA format-style 69 70 \lstset{language=CFA} % CFA default lnaguage … … 2166 2167 \section{Enumeration} 2167 2168 2168 An \newterm{enumeration} is a compile-time mechanism to give names to constants. 2169 There is no runtime manifestation of an enumeration. 2170 Their purpose is code-readability and maintenance -- changing an enum's value automatically updates all name usages during compilation. 2171 2172 An enumeration defines a type containing a set of names, each called an \newterm{enumeration constant} (shortened to \newterm{enum}) with a fixed (©const©) value. 2173 \begin{cfa} 2174 enum Days { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; // enumeration type definition, set of 7 names 2169 An \newterm{enumeration} is a compile-time mechanism to alias names to constants, like ©typedef© is a mechanism to alias names to types. 2170 Its purpose is to define a restricted-value type providing code-readability and maintenance -- changing an enum's value automatically updates all name usages during compilation. 2171 2172 An enumeration type is a set of names, each called an \newterm{enumeration constant} (shortened to \newterm{enum}) aliased to a fixed value (constant). 2173 \begin{cfa} 2174 enum Days { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; // enumeration type definition, set of 7 names & values 2175 2175 Days days = Mon; // enumeration type declaration and initialization 2176 2176 \end{cfa} 2177 The set of enums are injected into the scope of the definition and use the variable namespace.2177 The set of enums are injected into the variable namespace at the definition scope. 2178 2178 Hence, enums may be overloaded with enum/variable/function names. 2179 2179 \begin{cfa} … … 2183 2183 double Bar; $\C{// overload Foo.Bar, Goo.Bar}\CRT$ 2184 2184 \end{cfa} 2185 An anonymous enumeration i s used to inject enums with specific values into a scope:2185 An anonymous enumeration injects enums with specific values into a scope. 2186 2186 \begin{cfa} 2187 2187 enum { Prime = 103, BufferSize = 1024 }; 2188 2188 \end{cfa} 2189 An enumeration is better than using the C \Index{preprocessor} 2189 An enumeration is better than using C \Index{preprocessor} or constant declarations. 2190 \begin{cquote} 2191 \begin{tabular}{@{}l@{\hspace{4em}}l@{}} 2190 2192 \begin{cfa} 2191 2193 #define Mon 0 … … 2193 2195 #define Sun 6 2194 2196 \end{cfa} 2195 or C constant declarations 2196 \begin{cfa} 2197 const int Mon = 0, ..., Sun = 6; 2198 \end{cfa} 2197 & 2198 \begin{cfa} 2199 const int Mon = 0, 2200 ..., 2201 Sun = 6; 2202 \end{cfa} 2203 \end{tabular} 2204 \end{cquote} 2199 2205 because the enumeration is succinct, has automatic numbering, can appear in ©case© labels, does not use storage, and is part of the language type-system. 2200 2206 Finally, the type of an enum is implicitly or explicitly specified and the constant value can be implicitly or explicitly specified. … … 2204 2210 \subsection{Enum type} 2205 2211 2206 While an enumeration defines a new set-type of names, its underlying enums can be any ©const© type, and an enum's value comes from this type. 2207 \CFA provides an automatic conversion from an enum to its base type, \eg comparing/printing an enum compares/prints its value rather than the enum name. 2212 The type of enums can be any type, and an enum's value comes from this type. 2213 Because an enum is a constant, it cannot appear in a mutable context, \eg ©Mon = Sun© is disallowed, and has no address (it is an rvalue). 2214 Therefore, an enum is automatically converted to its constant's base-type, \eg comparing/printing an enum compares/prints its value rather than the enum name; 2215 there is no mechanism to print the enum name. 2216 2208 2217 The default enum type is ©int©. 2209 2218 Hence, ©Days© is the set type ©Mon©, ©Tue©, ...\,, ©Sun©, while the type of each enum is ©int© and each enum represents a fixed integral value. 2210 2219 If no values are specified for an integral enum type, the enums are automatically numbered by one from left to right starting at zero. 2211 2220 Hence, the value of enum ©Mon© is 0, ©Tue© is 1, ...\,, ©Sun© is 6. 2212 If a value is specified, numbering continues by one from that value.2213 I tan enum value is an expression, the compiler performs constant-folding to obtain a constant value.2214 2215 Other integral types with associated values can be explicitly specified.2221 If an enum value is specified, numbering continues by one from that value for subsequent unnumbered enums. 2222 If an enum value is an expression, the compiler performs constant-folding to obtain a constant value. 2223 2224 \CFA allows other integral types with associated values. 2216 2225 \begin{cfa} 2217 2226 enum( @char@ ) Letter { A @= 'A'@, B, C, I @= 'I'@, J, K }; … … 2219 2228 \end{cfa} 2220 2229 For enumeration ©Letter©, enum ©A©'s value is explicitly set to ©'A'©, with ©B© and ©C© implicitly numbered with increasing values from ©'A'©, and similarly for enums ©I©, ©J©, and ©K©. 2221 Note, an enum is an immutable constant, \ie ©A = B© is disallowed; 2222 by transitivity, an enum's type is implicitly ©const©. 2223 Hence, a constant/enum cannot appear in a mutuable context nor is a constant/enum addressable (rvalue). 2224 2225 Non-integral enum types have the restriction that all enums \emph{must} be explicitly specified, \ie incrementing by one for the next enum is not done even if supported by the enum type, \eg ©double©. 2230 2231 Non-integral enum types must be explicitly initialized, \eg ©double© is not automatically numbered by one. 2226 2232 \begin{cfa} 2227 2233 // non-integral numeric 2228 enum( double) Math { PI_2 = 1.570796, PI = 3.141597, E = 2.718282 }2234 enum( @double@ ) Math { PI_2 = 1.570796, PI = 3.141597, E = 2.718282 } 2229 2235 // pointer 2230 enum( char *) Name { Fred = "Fred", Mary = "Mary", Jane = "Jane" };2236 enum( @char *@ ) Name { Fred = "Fred", Mary = "Mary", Jane = "Jane" }; 2231 2237 int i, j, k; 2232 enum( int *) ptr { I = &i, J = &j, K = &k };2233 enum( int &) ref { I = i, J = j, K = k };2238 enum( @int *@ ) ptr { I = &i, J = &j, K = &k }; 2239 enum( @int &@ ) ref { I = i, J = j, K = k }; 2234 2240 // tuple 2235 enum( [int, int]) { T = [ 1, 2 ] };2241 enum( @[int, int]@ ) { T = [ 1, 2 ] }; 2236 2242 // function 2237 2243 void f() {...} void g() {...} 2238 enum( void (*)()) funs { F = f, F = g };2244 enum( @void (*)()@ ) funs { F = f, F = g }; 2239 2245 // aggregate 2240 2246 struct S { int i, j; }; 2241 enum( S) s { A = { 3, 4 }, B = { 7, 8 } };2247 enum( @S@ ) s { A = { 3, 4 }, B = { 7, 8 } }; 2242 2248 // enumeration 2243 enum( Letter) Greek { Alph = A, Beta = B, /* more enums */ }; // alphabet intersection2249 enum( @Letter@ ) Greek { Alph = A, Beta = B, /* more enums */ }; // alphabet intersection 2244 2250 \end{cfa} 2245 2251 Enumeration ©Greek© may have more or less enums than ©Letter©, but the enum values \emph{must} be from ©Letter©. … … 2253 2259 m = Alph; $\C{// {\color{red}disallowed}}$ 2254 2260 m = 3.141597; $\C{// {\color{red}disallowed}}$ 2255 d = E; $\C{// allowed, conversion to base type}$ 2256 d = m; $\C{// {\color{red}disallowed}}$ 2261 d = m; $\C{// allowed}$ 2257 2262 d = Alph; $\C{// {\color{red}disallowed}}$ 2258 2263 Letter l = A; $\C{// allowed}$ … … 2263 2268 2264 2269 A constructor \emph{cannot} be used to initialize enums because a constructor executes at runtime. 2265 A fallback is to substitute C-style initialization overriding the constructor with©@=©.2266 \begin{cfa} 2267 enum( struct vec3 ) Axis { Up $@$= { 1, 0, 0 }, Left $@$= ..., Front $@$= ...}2270 A fallback is explicit C-style initialization using ©@=©. 2271 \begin{cfa} 2272 enum( struct vec3 ) Axis { Up $@$= { 1, 0, 0 }, Left $@$= { 0, 1, 0 }, Front $@$= { 0, 0, 1 } } 2268 2273 \end{cfa} 2269 2274 Finally, enumeration variables are assignable and comparable only if the appropriate operators are defined for its enum type. … … 2274 2279 \Index{Plan-9}\index{inheritance!enumeration} inheritance may be used with enumerations. 2275 2280 \begin{cfa} 2276 enum( c onst char * ) Name2 { @inline Name@, Jack = "Jack", Jill = "Jill" };2277 enum @/* inferred */@ Name3 { @inline Name @, @inline Name2@, Sue = "Sue", Tom = "Tom" };2281 enum( char * ) Name2 { @inline Name@, Jack = "Jack", Jill = "Jill" }; 2282 enum @/* inferred */@ Name3 { @inline Name2@, Sue = "Sue", Tom = "Tom" }; 2278 2283 \end{cfa} 2279 2284 Enumeration ©Name2© inherits all the enums and their values from enumeration ©Name© by containment, and a ©Name© enumeration is a subtype of enumeration ©Name2©. … … 2281 2286 The enum type for the inheriting type must be the same as the inherited type; 2282 2287 hence the enum type may be omitted for the inheriting enumeration and it is inferred from the inherited enumeration, as for ©Name3©. 2283 When inheriting from integral types, automatic numbering may be used, so the inheritance placement left to right is important .2288 When inheriting from integral types, automatic numbering may be used, so the inheritance placement left to right is important, \eg the placement of ©Sue© and ©Tom© before or after ©inline Name2©. 2284 2289 2285 2290 Specifically, the inheritance relationship for ©Name©s is: … … 2301 2306 j( Fred ); j( Jill ); j( Sue ); j( 'W' ); 2302 2307 \end{cfa} 2303 Note, the validity of calls is the same for call by reference as for call byvalue, and ©const© restrictions are the same as for other types.2308 Note, the validity of calls is the same for call-by-reference as for call-by-value, and ©const© restrictions are the same as for other types. 2304 2309 2305 2310 Enums cannot be created at runtime, so inheritence problems, such as contra-variance do not apply. … … 2313 2318 \begin{cfa} 2314 2319 // Fred is a subset of char * 2315 enum char *Fred { A = "A", B = "B", C = "C" };2320 enum( char *) Fred { A = "A", B = "B", C = "C" }; 2316 2321 // Jack is a subset of Fred 2317 enum enum FredJack { W = A, Y = C};2322 enum( enum Fred ) Jack { W = A, Y = C}; 2318 2323 // Mary is a superset of Fred 2319 2324 enum Mary { inline Fred, D = "hello" }; … … 4168 4173 4169 4174 The format of numeric input values in the same as C constants without a trailing type suffix, as the input value-type is denoted by the input variable. 4170 For © _Bool© type, the constants are ©true© and ©false©.4175 For ©bool© type, the constants are ©true© and ©false©. 4171 4176 For integral types, any number of digits, optionally preceded by a sign (©+© or ©-©), where a 4172 4177 \begin{itemize} … … 4580 4585 In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to any arithmetic type, and the rules for pointer expressions treat constant expressions evaluating to 0 as a special case. 4581 4586 However, user-defined arithmetic types often need the equivalent of a 1 or 0 for their functions or operators, polymorphic functions often need 0 and 1 constants of a type matching their polymorphic parameters, and user-defined pointer-like types may need a null value. 4582 Defining special constants for a user-defined type is more efficient than defining a conversion to the type from © _Bool©.4587 Defining special constants for a user-defined type is more efficient than defining a conversion to the type from ©bool©. 4583 4588 4584 4589 Why just 0 and 1? Why not other integers? No other integers have special status in C. … … 5045 5050 \begin{figure} 5046 5051 \begin{cfa} 5047 #include <fstream >5048 #include <coroutine>5049 5050 coroutineFibonacci {5052 #include <fstream.hfa> 5053 #include @<coroutine.hfa>@ 5054 5055 @coroutine@ Fibonacci { 5051 5056 int fn; $\C{// used for communication}$ 5052 5057 }; 5053 void ?{}( Fibonacci * this ) { 5054 this->fn = 0; 5055 } 5056 void main( Fibonacci * this ) { 5058 5059 void main( Fibonacci & fib ) with( fib ) { $\C{// called on first resume}$ 5057 5060 int fn1, fn2; $\C{// retained between resumes}$ 5058 this->fn = 0; $\C{// case 0}$ 5059 fn1 = this->fn; 5060 suspend(); $\C{// return to last resume}$ 5061 5062 this->fn = 1; $\C{// case 1}$ 5063 fn2 = fn1; 5064 fn1 = this->fn; 5065 suspend(); $\C{// return to last resume}$ 5066 5067 for ( ;; ) { $\C{// general case}$ 5068 this->fn = fn1 + fn2; 5069 fn2 = fn1; 5070 fn1 = this->fn; 5071 suspend(); $\C{// return to last resume}$ 5072 } // for 5073 } 5074 int next( Fibonacci * this ) { 5075 resume( this ); $\C{// transfer to last suspend}$ 5076 return this->fn; 5061 fn = 0; fn1 = fn; $\C{// 1st case}$ 5062 @suspend;@ $\C{// restart last resume}$ 5063 fn = 1; fn2 = fn1; fn1 = fn; $\C{// 2nd case}$ 5064 @suspend;@ $\C{// restart last resume}$ 5065 for () { 5066 fn = fn1 + fn2; fn2 = fn1; fn1 = fn; $\C{// general case}$ 5067 @suspend;@ $\C{// restart last resume}$ 5068 } 5069 } 5070 int next( Fibonacci & fib ) with( fib ) { 5071 @resume( fib );@ $\C{// restart last suspend}$ 5072 return fn; 5077 5073 } 5078 5074 int main() { 5079 5075 Fibonacci f1, f2; 5080 for ( int i = 1; i <= 10; i += 1 ) { 5081 sout | next( &f1 ) | ' ' | next( &f2 ); 5082 } // for 5083 } 5084 \end{cfa} 5076 for ( 10 ) { $\C{// print N Fibonacci values}$ 5077 sout | next( f1 ) | next( f2 ); 5078 } 5079 } 5080 \end{cfa} 5081 \vspace*{-5pt} 5085 5082 \caption{Fibonacci Coroutine} 5086 5083 \label{f:FibonacciCoroutine} … … 5108 5105 \begin{figure} 5109 5106 \begin{cfa} 5110 #include <fstream> 5111 #include <kernel> 5112 #include <monitor> 5113 #include <thread> 5114 5115 monitor global_t { 5116 int value; 5117 }; 5118 5119 void ?{}(global_t * this) { 5120 this->value = 0; 5121 } 5122 5123 static global_t global; 5124 5125 void increment3( global_t * mutex this ) { 5126 this->value += 1; 5127 } 5128 void increment2( global_t * mutex this ) { 5129 increment3( this ); 5130 } 5131 void increment( global_t * mutex this ) { 5132 increment2( this ); 5133 } 5107 #include <fstream.hfa> 5108 #include @<thread.hfa>@ 5109 5110 @monitor@ AtomicCnt { int counter; }; 5111 void ?{}( AtomicCnt & c, int init = 0 ) with(c) { counter = init; } 5112 int inc( AtomicCnt & @mutex@ c, int inc = 1 ) with(c) { return counter += inc; } 5113 int dec( AtomicCnt & @mutex@ c, int dec = 1 ) with(c) { return counter -= dec; } 5114 forall( ostype & | ostream( ostype ) ) { $\C{// print any stream}$ 5115 ostype & ?|?( ostype & os, AtomicCnt c ) { return os | c.counter; } 5116 void ?|?( ostype & os, AtomicCnt c ) { (ostype &)(os | c.counter); ends( os ); } 5117 } 5118 5119 AtomicCnt global; $\C{// shared}$ 5134 5120 5135 5121 thread MyThread {}; 5136 5137 void main( MyThread* this) {5138 for(int i = 0; i < 1_000_000; i++) {5139 increment( &global );5122 void main( MyThread & ) { 5123 for ( i; 100_000 ) { 5124 inc( global ); 5125 dec( global ); 5140 5126 } 5141 5127 } 5142 int main(int argc, char* argv[]) { 5143 processor p; 5128 int main() { 5129 enum { Threads = 4 }; 5130 processor p[Threads - 1]; $\C{// + starting processor}$ 5144 5131 { 5145 MyThread f[4];5132 MyThread t[Threads]; 5146 5133 } 5147 sout | global .value;5134 sout | global; $\C{// print 0}$ 5148 5135 } 5149 5136 \end{cfa} 5150 5137 \caption{Atomic-Counter Monitor} 5151 \ caption{f:AtomicCounterMonitor}5138 \label{f:AtomicCounterMonitor} 5152 5139 \end{figure} 5153 5140 … … 7320 7307 [ int, long double ] remquo( long double, long double ); 7321 7308 7322 float div( float, float, int * );$\indexc{div}$ $\C{// alternative name for remquo}$7323 double div( double, double, int * );7324 long double div( long double, long double, int * );7325 7309 [ int, float ] div( float, float ); 7326 7310 [ int, double ] div( double, double ); … … 7383 7367 long double _Complex log( long double _Complex ); 7384 7368 7385 float log2( float );$\indexc{log2}$ 7369 int log2( unsigned int );$\indexc{log2}$ 7370 long int log2( unsigned long int ); 7371 long long int log2( unsigned long long int ) 7372 float log2( float ); 7386 7373 double log2( double ); 7387 7374 long double log2( long double ); … … 7565 7552 \leavevmode 7566 7553 \begin{cfa}[aboveskip=0pt,belowskip=0pt] 7554 // n / align * align 7555 signed char floor( signed char n, signed char align ); 7556 unsigned char floor( unsigned char n, unsigned char align ); 7557 short int floor( short int n, short int align ); 7558 unsigned short int floor( unsigned short int n, unsigned short int align ); 7559 int floor( int n, int align ); 7560 unsigned int floor( unsigned int n, unsigned int align ); 7561 long int floor( long int n, long int align ); 7562 unsigned long int floor( unsigned long int n, unsigned long int align ); 7563 long long int floor( long long int n, long long int align ); 7564 unsigned long long int floor( unsigned long long int n, unsigned long long int align ); 7565 7566 // (n + (align - 1)) / align 7567 signed char ceiling_div( signed char n, char align ); 7568 unsigned char ceiling_div( unsigned char n, unsigned char align ); 7569 short int ceiling_div( short int n, short int align ); 7570 unsigned short int ceiling_div( unsigned short int n, unsigned short int align ); 7571 int ceiling_div( int n, int align ); 7572 unsigned int ceiling_div( unsigned int n, unsigned int align ); 7573 long int ceiling_div( long int n, long int align ); 7574 unsigned long int ceiling_div( unsigned long int n, unsigned long int align ); 7575 long long int ceiling_div( long long int n, long long int align ); 7576 unsigned long long int ceiling_div( unsigned long long int n, unsigned long long int align ); 7577 7578 // floor( n + (n % align != 0 ? align - 1 : 0), align ) 7579 signed char ceiling( signed char n, signed char align ); 7580 unsigned char ceiling( unsigned char n, unsigned char align ); 7581 short int ceiling( short int n, short int align ); 7582 unsigned short int ceiling( unsigned short int n, unsigned short int align ); 7583 int ceiling( int n, int align ); 7584 unsigned int ceiling( unsigned int n, unsigned int align ); 7585 long int ceiling( long int n, long int align ); 7586 unsigned long int ceiling( unsigned long int n, unsigned long int align ); 7587 long long int ceiling( long long int n, long long int align ); 7588 unsigned long long int ceiling( unsigned long long int n, unsigned long long int align ); 7589 7567 7590 float floor( float );$\indexc{floor}$ 7568 7591 double floor( double ); … … 7667 7690 \begin{cfa}[aboveskip=0pt,belowskip=0pt] 7668 7691 struct Duration { 7669 int64_t t v; $\C{// nanoseconds}$7692 int64_t tn; $\C{// nanoseconds}$ 7670 7693 }; 7671 7694 7672 7695 void ?{}( Duration & dur ); 7673 7696 void ?{}( Duration & dur, zero_t ); 7697 void ?{}( Duration & dur, timeval t ) 7698 void ?{}( Duration & dur, timespec t ) 7674 7699 7675 7700 Duration ?=?( Duration & dur, zero_t ); 7701 Duration ?=?( Duration & dur, timeval t ) 7702 Duration ?=?( Duration & dur, timespec t ) 7676 7703 7677 7704 Duration +?( Duration rhs ); … … 7695 7722 Duration ?%=?( Duration & lhs, Duration rhs ); 7696 7723 7697 _Bool ?==?( Duration lhs, Duration rhs);7698 _Bool ?!=?( Duration lhs, Duration rhs);7699 _Bool ?<? ( Duration lhs, Duration rhs);7700 _Bool ?<=?( Duration lhs, Duration rhs);7701 _Bool ?>? ( Duration lhs, Duration rhs);7702 _Bool ?>=?( Duration lhs, Duration rhs);7703 7704 _Bool ?==?( Duration lhs, zero_t);7705 _Bool ?!=?( Duration lhs, zero_t);7706 _Bool ?<? ( Duration lhs, zero_t);7707 _Bool ?<=?( Duration lhs, zero_t);7708 _Bool ?>? ( Duration lhs, zero_t);7709 _Bool ?>=?( Duration lhs, zero_t);7724 bool ?==?( Duration lhs, zero_t ); 7725 bool ?!=?( Duration lhs, zero_t ); 7726 bool ?<? ( Duration lhs, zero_t ); 7727 bool ?<=?( Duration lhs, zero_t ); 7728 bool ?>? ( Duration lhs, zero_t ); 7729 bool ?>=?( Duration lhs, zero_t ); 7730 7731 bool ?==?( Duration lhs, Duration rhs ); 7732 bool ?!=?( Duration lhs, Duration rhs ); 7733 bool ?<? ( Duration lhs, Duration rhs ); 7734 bool ?<=?( Duration lhs, Duration rhs ); 7735 bool ?>? ( Duration lhs, Duration rhs ); 7736 bool ?>=?( Duration lhs, Duration rhs ); 7710 7737 7711 7738 Duration abs( Duration rhs ); … … 7734 7761 int64_t ?`w( Duration dur ); 7735 7762 7763 double ?`dns( Duration dur ); 7764 double ?`dus( Duration dur ); 7765 double ?`dms( Duration dur ); 7766 double ?`ds( Duration dur ); 7767 double ?`dm( Duration dur ); 7768 double ?`dh( Duration dur ); 7769 double ?`dd( Duration dur ); 7770 double ?`dw( Duration dur ); 7771 7736 7772 Duration max( Duration lhs, Duration rhs ); 7737 7773 Duration min( Duration lhs, Duration rhs ); 7774 7775 forall( ostype & | ostream( ostype ) ) ostype & ?|?( ostype & os, Duration dur ); 7738 7776 \end{cfa} 7739 7777 … … 7746 7784 \begin{cfa}[aboveskip=0pt,belowskip=0pt] 7747 7785 void ?{}( timeval & t ); 7786 void ?{}( timeval & t, zero_t ); 7748 7787 void ?{}( timeval & t, time_t sec, suseconds_t usec ); 7749 7788 void ?{}( timeval & t, time_t sec ); 7750 void ?{}( timeval & t, zero_t );7751 7789 void ?{}( timeval & t, Time time ); 7752 7790 … … 7754 7792 timeval ?+?( timeval & lhs, timeval rhs ); 7755 7793 timeval ?-?( timeval & lhs, timeval rhs ); 7756 _Bool ?==?( timeval lhs, timeval rhs );7757 _Bool ?!=?( timeval lhs, timeval rhs );7794 bool ?==?( timeval lhs, timeval rhs ); 7795 bool ?!=?( timeval lhs, timeval rhs ); 7758 7796 \end{cfa} 7759 7797 … … 7766 7804 \begin{cfa}[aboveskip=0pt,belowskip=0pt] 7767 7805 void ?{}( timespec & t ); 7806 void ?{}( timespec & t, zero_t ); 7768 7807 void ?{}( timespec & t, time_t sec, __syscall_slong_t nsec ); 7769 7808 void ?{}( timespec & t, time_t sec ); 7770 void ?{}( timespec & t, zero_t );7771 7809 void ?{}( timespec & t, Time time ); 7772 7810 … … 7774 7812 timespec ?+?( timespec & lhs, timespec rhs ); 7775 7813 timespec ?-?( timespec & lhs, timespec rhs ); 7776 _Bool ?==?( timespec lhs, timespec rhs );7777 _Bool ?!=?( timespec lhs, timespec rhs );7814 bool ?==?( timespec lhs, timespec rhs ); 7815 bool ?!=?( timespec lhs, timespec rhs ); 7778 7816 \end{cfa} 7779 7817 … … 7797 7835 \begin{cfa}[aboveskip=0pt,belowskip=0pt] 7798 7836 struct Time { 7799 uint64_t t v; $\C{// nanoseconds since UNIX epoch}$7837 uint64_t tn; $\C{// nanoseconds since UNIX epoch}$ 7800 7838 }; 7801 7839 7802 7840 void ?{}( Time & time ); 7803 7841 void ?{}( Time & time, zero_t ); 7842 void ?{}( Time & time, timeval t ); 7843 void ?{}( Time & time, timespec t ); 7804 7844 7805 7845 Time ?=?( Time & time, zero_t ); 7806 7807 void ?{}( Time & time, timeval t );7808 7846 Time ?=?( Time & time, timeval t ); 7809 7810 void ?{}( Time & time, timespec t );7811 7847 Time ?=?( Time & time, timespec t ); 7812 7848 … … 7818 7854 Time ?-?( Time lhs, Duration rhs ); 7819 7855 Time ?-=?( Time & lhs, Duration rhs ); 7820 _Bool ?==?( Time lhs, Time rhs ); 7821 _Bool ?!=?( Time lhs, Time rhs ); 7822 _Bool ?<?( Time lhs, Time rhs ); 7823 _Bool ?<=?( Time lhs, Time rhs ); 7824 _Bool ?>?( Time lhs, Time rhs ); 7825 _Bool ?>=?( Time lhs, Time rhs ); 7856 bool ?==?( Time lhs, Time rhs ); 7857 bool ?!=?( Time lhs, Time rhs ); 7858 bool ?<?( Time lhs, Time rhs ); 7859 bool ?<=?( Time lhs, Time rhs ); 7860 bool ?>?( Time lhs, Time rhs ); 7861 bool ?>=?( Time lhs, Time rhs ); 7862 7863 int64_t ?`ns( Time t ); 7826 7864 7827 7865 char * yy_mm_dd( Time time, char * buf ); 7828 char * ?`ymd( Time time, char * buf ) { // short form 7829 return yy_mm_dd( time, buf ); 7830 } // ymd 7866 char * ?`ymd( Time time, char * buf ); // short form 7831 7867 7832 7868 char * mm_dd_yy( Time time, char * buf ); 7833 char * ?`mdy( Time time, char * buf ) { // short form 7834 return mm_dd_yy( time, buf ); 7835 } // mdy 7869 char * ?`mdy( Time time, char * buf ); // short form 7836 7870 7837 7871 char * dd_mm_yy( Time time, char * buf ); 7838 char * ?`dmy( Time time, char * buf ) { // short form 7839 return dd_mm_yy( time, buf );; 7840 } // dmy 7872 char * ?`dmy( Time time, char * buf ); // short form 7841 7873 7842 7874 size_t strftime( char * buf, size_t size, const char * fmt, Time time ); 7843 forall( dtype ostype | ostream( ostype ) ) ostype & ?|?( ostype & os, Time time ); 7875 7876 forall( ostype & | ostream( ostype ) ) ostype & ?|?( ostype & os, Time time ); 7844 7877 \end{cfa} 7845 7878 … … 7867 7900 \leavevmode 7868 7901 \begin{cfa}[aboveskip=0pt,belowskip=0pt] 7869 struct Clock { 7870 Duration offset; $\C{// for virtual clock: contains offset from real-time}$ 7871 int clocktype; $\C{// implementation only -1 (virtual), CLOCK\_REALTIME}$ 7902 struct Clock { $\C{// virtual clock}$ 7903 Duration offset; $\C{// offset from computer real-time}$ 7872 7904 }; 7873 7905 7874 void resetClock( Clock & clk ); 7875 void resetClock( Clock & clk, Duration adj ); 7876 void ?{}( Clock & clk ); 7877 void ?{}( Clock & clk, Duration adj ); 7878 7879 Duration getResNsec(); $\C{// with nanoseconds}$ 7880 Duration getRes(); $\C{// without nanoseconds}$ 7881 7882 Time getTimeNsec(); $\C{// with nanoseconds}$ 7883 Time getTime(); $\C{// without nanoseconds}$ 7884 Time getTime( Clock & clk ); 7885 Time ?()( Clock & clk ); 7886 timeval getTime( Clock & clk ); 7887 tm getTime( Clock & clk ); 7906 void ?{}( Clock & clk ); $\C{// create no offset}$ 7907 void ?{}( Clock & clk, Duration adj ); $\C{// create with offset}$ 7908 void reset( Clock & clk, Duration adj ); $\C{// change offset}$ 7909 7910 Duration resolutionHi(); $\C{// clock resolution in nanoseconds (fine)}$ 7911 Duration resolution(); $\C{// clock resolution without nanoseconds (coarse)}$ 7912 7913 Time timeHiRes(); $\C{// real time with nanoseconds}$ 7914 Time time(); $\C{// real time without nanoseconds}$ 7915 Time time( Clock & clk ); $\C{// real time for given clock}$ 7916 Time ?()( Clock & clk ); $\C{//\ \ \ \ alternative syntax}$ 7917 timeval time( Clock & clk ); $\C{// convert to C time format}$ 7918 tm time( Clock & clk ); 7919 Duration processor(); $\C{// non-monotonic duration of kernel thread}$ 7920 Duration program(); $\C{// non-monotonic duration of program CPU}$ 7921 Duration boot(); $\C{// monotonic duration since computer boot}$ 7888 7922 \end{cfa} 7889 7923 … … 8056 8090 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype * os, Int mp ); 8057 8091 \end{cfa} 8058 8059 The following factorial programs contrast using GMP with the \CFA and C interfaces, where the output from these programs appears in \VRef[Figure]{f:MultiPrecisionFactorials}. 8092 \VRef[Figure]{f:MultiPrecisionFactorials} shows \CFA and C factorial programs using the GMP interfaces. 8060 8093 (Compile with flag \Indexc{-lgmp} to link with the GMP library.) 8094 8095 \begin{figure} 8061 8096 \begin{cquote} 8062 8097 \begin{tabular}{@{}l@{\hspace{\parindentlnth}}|@{\hspace{\parindentlnth}}l@{}} 8063 \multicolumn{1}{ c|@{\hspace{\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{@{\hspace{\parindentlnth}}c}{\textbf{C}} \\8098 \multicolumn{1}{@{}c|@{\hspace{\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{@{\hspace{\parindentlnth}}c}{\textbf{C}@{}} \\ 8064 8099 \hline 8065 8100 \begin{cfa} … … 8070 8105 8071 8106 sout | 0 | fact; 8072 for ( unsigned int i = 1; i <= 40; i += 1) {8107 for ( i; 40 ) { 8073 8108 fact *= i; 8074 8109 sout | i | fact; … … 8092 8127 \end{tabular} 8093 8128 \end{cquote} 8094 8095 \begin{figure} 8129 \small 8096 8130 \begin{cfa} 8097 8131 Factorial Numbers -
libcfa/src/fstream.cfa
r341aa39 rc41c2dbe 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Mar 1 21:12:15202113 // Update Count : 42 412 // Last Modified On : Tue Apr 20 19:04:46 2021 13 // Update Count : 425 14 14 // 15 15 … … 31 31 32 32 void ?{}( ofstream & os, void * file ) { 33 os. $file= file;34 os. $sepDefault= true;35 os. $sepOnOff= false;36 os. $nlOnOff= true;37 os. $prt= false;38 os. $sawNL= false;39 os. $acquired= false;40 $sepSetCur( os, sepGet( os ) );33 os.file$ = file; 34 os.sepDefault$ = true; 35 os.sepOnOff$ = false; 36 os.nlOnOff$ = true; 37 os.prt$ = false; 38 os.sawNL$ = false; 39 os.acquired$ = false; 40 sepSetCur$( os, sepGet( os ) ); 41 41 sepSet( os, " " ); 42 42 sepSetTuple( os, ", " ); … … 44 44 45 45 // private 46 bool $sepPrt( ofstream & os ) { $setNL( os, false ); return os.$sepOnOff; }47 void $sepReset( ofstream & os ) { os.$sepOnOff = os.$sepDefault; }48 void $sepReset( ofstream & os, bool reset ) { os.$sepDefault = reset; os.$sepOnOff = os.$sepDefault; }49 const char * $sepGetCur( ofstream & os ) { return os.$sepCur; }50 void $sepSetCur( ofstream & os, const char sepCur[] ) { os.$sepCur= sepCur; }51 bool $getNL( ofstream & os ) { return os.$sawNL; }52 void $setNL( ofstream & os, bool state ) { os.$sawNL= state; }53 bool $getANL( ofstream & os ) { return os.$nlOnOff; }54 bool $getPrt( ofstream & os ) { return os.$prt; }55 void $setPrt( ofstream & os, bool state ) { os.$prt= state; }46 bool sepPrt$( ofstream & os ) { setNL$( os, false ); return os.sepOnOff$; } 47 void sepReset$( ofstream & os ) { os.sepOnOff$ = os.sepDefault$; } 48 void sepReset$( ofstream & os, bool reset ) { os.sepDefault$ = reset; os.sepOnOff$ = os.sepDefault$; } 49 const char * sepGetCur$( ofstream & os ) { return os.sepCur$; } 50 void sepSetCur$( ofstream & os, const char sepCur[] ) { os.sepCur$ = sepCur; } 51 bool getNL$( ofstream & os ) { return os.sawNL$; } 52 void setNL$( ofstream & os, bool state ) { os.sawNL$ = state; } 53 bool getANL$( ofstream & os ) { return os.nlOnOff$; } 54 bool getPrt$( ofstream & os ) { return os.prt$; } 55 void setPrt$( ofstream & os, bool state ) { os.prt$ = state; } 56 56 57 57 // public 58 void ?{}( ofstream & os ) { os. $file= 0p; }58 void ?{}( ofstream & os ) { os.file$ = 0p; } 59 59 60 60 void ?{}( ofstream & os, const char name[], const char mode[] ) { … … 70 70 } // ^?{} 71 71 72 void sepOn( ofstream & os ) { os. $sepOnOff = ! $getNL( os ); }73 void sepOff( ofstream & os ) { os. $sepOnOff= false; }72 void sepOn( ofstream & os ) { os.sepOnOff$ = ! getNL$( os ); } 73 void sepOff( ofstream & os ) { os.sepOnOff$ = false; } 74 74 75 75 bool sepDisable( ofstream & os ) { 76 bool temp = os. $sepDefault;77 os. $sepDefault= false;78 $sepReset( os );76 bool temp = os.sepDefault$; 77 os.sepDefault$ = false; 78 sepReset$( os ); 79 79 return temp; 80 80 } // sepDisable 81 81 82 82 bool sepEnable( ofstream & os ) { 83 bool temp = os. $sepDefault;84 os. $sepDefault= true;85 if ( os. $sepOnOff ) $sepReset( os ); // start of line ?83 bool temp = os.sepDefault$; 84 os.sepDefault$ = true; 85 if ( os.sepOnOff$ ) sepReset$( os ); // start of line ? 86 86 return temp; 87 87 } // sepEnable 88 88 89 void nlOn( ofstream & os ) { os. $nlOnOff= true; }90 void nlOff( ofstream & os ) { os. $nlOnOff= false; }91 92 const char * sepGet( ofstream & os ) { return os. $separator; }89 void nlOn( ofstream & os ) { os.nlOnOff$ = true; } 90 void nlOff( ofstream & os ) { os.nlOnOff$ = false; } 91 92 const char * sepGet( ofstream & os ) { return os.separator$; } 93 93 void sepSet( ofstream & os, const char s[] ) { 94 94 assert( s ); 95 strncpy( os. $separator, s, sepSize - 1 );96 os. $separator[sepSize - 1] = '\0';95 strncpy( os.separator$, s, sepSize - 1 ); 96 os.separator$[sepSize - 1] = '\0'; 97 97 } // sepSet 98 98 99 const char * sepGetTuple( ofstream & os ) { return os. $tupleSeparator; }99 const char * sepGetTuple( ofstream & os ) { return os.tupleSeparator$; } 100 100 void sepSetTuple( ofstream & os, const char s[] ) { 101 101 assert( s ); 102 strncpy( os. $tupleSeparator, s, sepSize - 1 );103 os. $tupleSeparator[sepSize - 1] = '\0';102 strncpy( os.tupleSeparator$, s, sepSize - 1 ); 103 os.tupleSeparator$[sepSize - 1] = '\0'; 104 104 } // sepSet 105 105 106 106 void ends( ofstream & os ) { 107 if ( $getANL( os ) ) nl( os );108 else $setPrt( os, false ); // turn off107 if ( getANL$( os ) ) nl( os ); 108 else setPrt$( os, false ); // turn off 109 109 if ( &os == &exit ) exit( EXIT_FAILURE ); 110 110 if ( &os == &abort ) abort(); 111 if ( os. $acquired ) { os.$acquired= false; release( os ); }111 if ( os.acquired$ ) { os.acquired$ = false; release( os ); } 112 112 } // ends 113 113 114 114 int fail( ofstream & os ) { 115 return os. $file == 0 || ferror( (FILE *)(os.$file) );115 return os.file$ == 0 || ferror( (FILE *)(os.file$) ); 116 116 } // fail 117 117 118 118 int flush( ofstream & os ) { 119 return fflush( (FILE *)(os. $file) );119 return fflush( (FILE *)(os.file$) ); 120 120 } // flush 121 121 … … 136 136 137 137 void close( ofstream & os ) { 138 if ( (FILE *)(os. $file) == 0p ) return;139 if ( (FILE *)(os. $file) == (FILE *)stdout || (FILE *)(os.$file) == (FILE *)stderr ) return;140 141 if ( fclose( (FILE *)(os. $file) ) == EOF ) {138 if ( (FILE *)(os.file$) == 0p ) return; 139 if ( (FILE *)(os.file$) == (FILE *)stdout || (FILE *)(os.file$) == (FILE *)stderr ) return; 140 141 if ( fclose( (FILE *)(os.file$) ) == EOF ) { 142 142 abort | IO_MSG "close output" | nl | strerror( errno ); 143 143 } // if 144 os. $file= 0p;144 os.file$ = 0p; 145 145 } // close 146 146 … … 150 150 } // if 151 151 152 if ( fwrite( data, 1, size, (FILE *)(os. $file) ) != size ) {152 if ( fwrite( data, 1, size, (FILE *)(os.file$) ) != size ) { 153 153 abort | IO_MSG "write" | nl | strerror( errno ); 154 154 } // if … … 159 159 va_list args; 160 160 va_start( args, format ); 161 int len = vfprintf( (FILE *)(os. $file), format, args );161 int len = vfprintf( (FILE *)(os.file$), format, args ); 162 162 if ( len == EOF ) { 163 if ( ferror( (FILE *)(os. $file) ) ) {163 if ( ferror( (FILE *)(os.file$) ) ) { 164 164 abort | IO_MSG "invalid write"; 165 165 } // if … … 167 167 va_end( args ); 168 168 169 $setPrt( os, true ); // called in output cascade170 $sepReset( os ); // reset separator169 setPrt$( os, true ); // called in output cascade 170 sepReset$( os ); // reset separator 171 171 return len; 172 172 } // fmt 173 173 174 174 inline void acquire( ofstream & os ) { 175 lock( os. $lock);176 if ( ! os. $acquired ) os.$acquired= true;177 else unlock( os. $lock);175 lock( os.lock$ ); 176 if ( ! os.acquired$ ) os.acquired$ = true; 177 else unlock( os.lock$ ); 178 178 } // acquire 179 179 180 180 inline void release( ofstream & os ) { 181 unlock( os. $lock);181 unlock( os.lock$ ); 182 182 } // release 183 183 184 void ?{}( osacquire & acq, ofstream & os ) { &acq.os = &os; lock( os. $lock); }184 void ?{}( osacquire & acq, ofstream & os ) { &acq.os = &os; lock( os.lock$ ); } 185 185 void ^?{}( osacquire & acq ) { release( acq.os ); } 186 186 … … 204 204 // private 205 205 void ?{}( ifstream & is, void * file ) { 206 is. $file= file;207 is. $nlOnOff= false;208 is. $acquired= false;206 is.file$ = file; 207 is.nlOnOff$ = false; 208 is.acquired$ = false; 209 209 } // ?{} 210 210 211 211 // public 212 void ?{}( ifstream & is ) { is. $file= 0p; }212 void ?{}( ifstream & is ) { is.file$ = 0p; } 213 213 214 214 void ?{}( ifstream & is, const char name[], const char mode[] ) { … … 224 224 } // ^?{} 225 225 226 void nlOn( ifstream & os ) { os. $nlOnOff= true; }227 void nlOff( ifstream & os ) { os. $nlOnOff= false; }228 bool getANL( ifstream & os ) { return os. $nlOnOff; }226 void nlOn( ifstream & os ) { os.nlOnOff$ = true; } 227 void nlOff( ifstream & os ) { os.nlOnOff$ = false; } 228 bool getANL( ifstream & os ) { return os.nlOnOff$; } 229 229 230 230 int fail( ifstream & is ) { 231 return is. $file == 0p || ferror( (FILE *)(is.$file) );231 return is.file$ == 0p || ferror( (FILE *)(is.file$) ); 232 232 } // fail 233 233 234 234 void ends( ifstream & is ) { 235 if ( is. $acquired ) { is.$acquired= false; release( is ); }235 if ( is.acquired$ ) { is.acquired$ = false; release( is ); } 236 236 } // ends 237 237 238 238 int eof( ifstream & is ) { 239 return feof( (FILE *)(is. $file) );239 return feof( (FILE *)(is.file$) ); 240 240 } // eof 241 241 … … 248 248 } // if 249 249 #endif // __CFA_DEBUG__ 250 is. $file= file;250 is.file$ = file; 251 251 } // open 252 252 … … 256 256 257 257 void close( ifstream & is ) { 258 if ( (FILE *)(is. $file) == 0p ) return;259 if ( (FILE *)(is. $file) == (FILE *)stdin ) return;260 261 if ( fclose( (FILE *)(is. $file) ) == EOF ) {258 if ( (FILE *)(is.file$) == 0p ) return; 259 if ( (FILE *)(is.file$) == (FILE *)stdin ) return; 260 261 if ( fclose( (FILE *)(is.file$) ) == EOF ) { 262 262 abort | IO_MSG "close input" | nl | strerror( errno ); 263 263 } // if 264 is. $file= 0p;264 is.file$ = 0p; 265 265 } // close 266 266 … … 270 270 } // if 271 271 272 if ( fread( data, size, 1, (FILE *)(is. $file) ) == 0 ) {272 if ( fread( data, size, 1, (FILE *)(is.file$) ) == 0 ) { 273 273 abort | IO_MSG "read" | nl | strerror( errno ); 274 274 } // if … … 281 281 } // if 282 282 283 if ( ungetc( c, (FILE *)(is. $file) ) == EOF ) {283 if ( ungetc( c, (FILE *)(is.file$) ) == EOF ) { 284 284 abort | IO_MSG "ungetc" | nl | strerror( errno ); 285 285 } // if … … 291 291 292 292 va_start( args, format ); 293 int len = vfscanf( (FILE *)(is. $file), format, args );293 int len = vfscanf( (FILE *)(is.file$), format, args ); 294 294 if ( len == EOF ) { 295 if ( ferror( (FILE *)(is. $file) ) ) {295 if ( ferror( (FILE *)(is.file$) ) ) { 296 296 abort | IO_MSG "invalid read"; 297 297 } // if … … 302 302 303 303 inline void acquire( ifstream & is ) { 304 lock( is. $lock);305 if ( ! is. $acquired ) is.$acquired= true;306 else unlock( is. $lock);304 lock( is.lock$ ); 305 if ( ! is.acquired$ ) is.acquired$ = true; 306 else unlock( is.lock$ ); 307 307 } // acquire 308 308 309 309 inline void release( ifstream & is ) { 310 unlock( is. $lock);310 unlock( is.lock$ ); 311 311 } // release 312 312 313 void ?{}( isacquire & acq, ifstream & is ) { &acq.is = &is; lock( is. $lock); }313 void ?{}( isacquire & acq, ifstream & is ) { &acq.is = &is; lock( is.lock$ ); } 314 314 void ^?{}( isacquire & acq ) { release( acq.is ); } 315 315 -
libcfa/src/fstream.hfa
r341aa39 rc41c2dbe 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Mar 1 22:45:08202113 // Update Count : 21 712 // Last Modified On : Tue Apr 20 19:04:12 2021 13 // Update Count : 218 14 14 // 15 15 … … 26 26 enum { sepSize = 16 }; 27 27 struct ofstream { 28 void * $file;29 bool $sepDefault;30 bool $sepOnOff;31 bool $nlOnOff;32 bool $prt; // print text33 bool $sawNL;34 const char * $sepCur;35 char $separator[sepSize];36 char $tupleSeparator[sepSize];37 multiple_acquisition_lock $lock;38 bool $acquired;28 void * file$; 29 bool sepDefault$; 30 bool sepOnOff$; 31 bool nlOnOff$; 32 bool prt$; // print text 33 bool sawNL$; 34 const char * sepCur$; 35 char separator$[sepSize]; 36 char tupleSeparator$[sepSize]; 37 multiple_acquisition_lock lock$; 38 bool acquired$; 39 39 }; // ofstream 40 40 41 41 // private 42 bool $sepPrt( ofstream & );43 void $sepReset( ofstream & );44 void $sepReset( ofstream &, bool );45 const char * $sepGetCur( ofstream & );46 void $sepSetCur( ofstream &, const char [] );47 bool $getNL( ofstream & );48 void $setNL( ofstream &, bool );49 bool $getANL( ofstream & );50 bool $getPrt( ofstream & );51 void $setPrt( ofstream &, bool );42 bool sepPrt$( ofstream & ); 43 void sepReset$( ofstream & ); 44 void sepReset$( ofstream &, bool ); 45 const char * sepGetCur$( ofstream & ); 46 void sepSetCur$( ofstream &, const char [] ); 47 bool getNL$( ofstream & ); 48 void setNL$( ofstream &, bool ); 49 bool getANL$( ofstream & ); 50 bool getPrt$( ofstream & ); 51 void setPrt$( ofstream &, bool ); 52 52 53 53 // public … … 94 94 95 95 struct ifstream { 96 void * $file;97 bool $nlOnOff;98 multiple_acquisition_lock $lock;99 bool $acquired;96 void * file$; 97 bool nlOnOff$; 98 multiple_acquisition_lock lock$; 99 bool acquired$; 100 100 }; // ifstream 101 101 -
libcfa/src/gmp.hfa
r341aa39 rc41c2dbe 10 10 // Created On : Tue Apr 19 08:43:43 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Feb 9 09:56:54 202013 // Update Count : 3 112 // Last Modified On : Tue Apr 20 20:59:21 2021 13 // Update Count : 32 14 14 // 15 15 … … 263 263 forall( ostype & | ostream( ostype ) ) { 264 264 ostype & ?|?( ostype & os, Int mp ) { 265 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );265 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 266 266 gmp_printf( "%Zd", mp.mpz ); 267 267 sepOn( os ); -
libcfa/src/heap.cfa
r341aa39 rc41c2dbe 10 10 // Created On : Tue Dec 19 21:58:35 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Mar 14 10:39:24202113 // Update Count : 103 212 // Last Modified On : Tue Apr 20 21:20:48 2021 13 // Update Count : 1033 14 14 // 15 15 … … 1128 1128 1129 1129 // Set the alignment for an the allocation and return previous alignment or 0 if no alignment. 1130 size_t $malloc_alignment_set( void * addr, size_t alignment ) {1130 size_t malloc_alignment_set$( void * addr, size_t alignment ) { 1131 1131 if ( unlikely( addr == 0p ) ) return libAlign(); // minimum alignment 1132 1132 size_t ret; … … 1139 1139 } // if 1140 1140 return ret; 1141 } // $malloc_alignment_set1141 } // malloc_alignment_set$ 1142 1142 1143 1143 … … 1153 1153 1154 1154 // Set allocation is zero filled and return previous zero filled. 1155 bool $malloc_zero_fill_set( void * addr ) {1155 bool malloc_zero_fill_set$( void * addr ) { 1156 1156 if ( unlikely( addr == 0p ) ) return false; // null allocation is not zero fill 1157 1157 HeapManager.Storage.Header * header = headerAddr( addr ); … … 1162 1162 header->kind.real.blockSize |= 2; // mark as zero filled 1163 1163 return ret; 1164 } // $malloc_zero_fill_set1164 } // malloc_zero_fill_set$ 1165 1165 1166 1166 … … 1176 1176 1177 1177 // Set allocation size and return previous size. 1178 size_t $malloc_size_set( void * addr, size_t size ) {1178 size_t malloc_size_set$( void * addr, size_t size ) { 1179 1179 if ( unlikely( addr == 0p ) ) return 0; // null allocation has 0 size 1180 1180 HeapManager.Storage.Header * header = headerAddr( addr ); … … 1185 1185 header->kind.real.size = size; 1186 1186 return ret; 1187 } // $malloc_size_set1187 } // malloc_size_set$ 1188 1188 1189 1189 -
libcfa/src/iostream.cfa
r341aa39 rc41c2dbe 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Apr 13 13:05:24202113 // Update Count : 132 412 // Last Modified On : Tue Apr 20 19:09:41 2021 13 // Update Count : 1325 14 14 // 15 15 … … 38 38 forall( ostype & | ostream( ostype ) ) { 39 39 ostype & ?|?( ostype & os, bool b ) { 40 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );40 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 41 41 fmt( os, "%s", b ? "true" : "false" ); 42 42 return os; … … 48 48 ostype & ?|?( ostype & os, char c ) { 49 49 fmt( os, "%c", c ); 50 if ( c == '\n' ) $setNL( os, true );50 if ( c == '\n' ) setNL$( os, true ); 51 51 return sepOff( os ); 52 52 } // ?|? … … 56 56 57 57 ostype & ?|?( ostype & os, signed char sc ) { 58 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );58 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 59 59 fmt( os, "%hhd", sc ); 60 60 return os; … … 65 65 66 66 ostype & ?|?( ostype & os, unsigned char usc ) { 67 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );67 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 68 68 fmt( os, "%hhu", usc ); 69 69 return os; … … 74 74 75 75 ostype & ?|?( ostype & os, short int si ) { 76 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );76 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 77 77 fmt( os, "%hd", si ); 78 78 return os; … … 83 83 84 84 ostype & ?|?( ostype & os, unsigned short int usi ) { 85 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );85 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 86 86 fmt( os, "%hu", usi ); 87 87 return os; … … 92 92 93 93 ostype & ?|?( ostype & os, int i ) { 94 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );94 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 95 95 fmt( os, "%d", i ); 96 96 return os; … … 101 101 102 102 ostype & ?|?( ostype & os, unsigned int ui ) { 103 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );103 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 104 104 fmt( os, "%u", ui ); 105 105 return os; … … 110 110 111 111 ostype & ?|?( ostype & os, long int li ) { 112 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );112 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 113 113 fmt( os, "%ld", li ); 114 114 return os; … … 119 119 120 120 ostype & ?|?( ostype & os, unsigned long int uli ) { 121 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );121 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 122 122 fmt( os, "%lu", uli ); 123 123 return os; … … 128 128 129 129 ostype & ?|?( ostype & os, long long int lli ) { 130 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );130 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 131 131 fmt( os, "%lld", lli ); 132 132 return os; … … 137 137 138 138 ostype & ?|?( ostype & os, unsigned long long int ulli ) { 139 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );139 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 140 140 fmt( os, "%llu", ulli ); 141 141 return os; … … 171 171 172 172 ostype & ?|?( ostype & os, int128 llli ) { 173 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );173 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 174 174 base10_128( os, llli ); 175 175 return os; … … 180 180 181 181 ostype & ?|?( ostype & os, unsigned int128 ullli ) { 182 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );182 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 183 183 base10_128( os, ullli ); 184 184 return os; … … 204 204 205 205 ostype & ?|?( ostype & os, float f ) { 206 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );206 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 207 207 PrintWithDP( os, "%g", f ); 208 208 return os; … … 213 213 214 214 ostype & ?|?( ostype & os, double d ) { 215 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );215 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 216 216 PrintWithDP( os, "%.*lg", d, DBL_DIG ); 217 217 return os; … … 222 222 223 223 ostype & ?|?( ostype & os, long double ld ) { 224 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );224 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 225 225 PrintWithDP( os, "%.*Lg", ld, LDBL_DIG ); 226 226 return os; … … 231 231 232 232 ostype & ?|?( ostype & os, float _Complex fc ) { 233 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );233 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 234 234 // os | crealf( fc ) | nonl; 235 235 PrintWithDP( os, "%g", crealf( fc ) ); … … 243 243 244 244 ostype & ?|?( ostype & os, double _Complex dc ) { 245 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );245 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 246 246 // os | creal( dc ) | nonl; 247 247 PrintWithDP( os, "%.*lg", creal( dc ), DBL_DIG ); … … 255 255 256 256 ostype & ?|?( ostype & os, long double _Complex ldc ) { 257 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );257 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 258 258 // os | creall( ldc ) || nonl; 259 259 PrintWithDP( os, "%.*Lg", creall( ldc ), LDBL_DIG ); … … 286 286 // first character IS NOT spacing or closing punctuation => add left separator 287 287 unsigned char ch = s[0]; // must make unsigned 288 if ( $sepPrt( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) {289 fmt( os, "%s", $sepGetCur( os ) );288 if ( sepPrt$( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) { 289 fmt( os, "%s", sepGetCur$( os ) ); 290 290 } // if 291 291 292 292 // if string starts line, must reset to determine open state because separator is off 293 $sepReset( os ); // reset separator293 sepReset$( os ); // reset separator 294 294 295 295 // last character IS spacing or opening punctuation => turn off separator for next item 296 296 size_t len = strlen( s ); 297 297 ch = s[len - 1]; // must make unsigned 298 if ( $sepPrt( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) {298 if ( sepPrt$( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) { 299 299 sepOn( os ); 300 300 } else { 301 301 sepOff( os ); 302 302 } // if 303 if ( ch == '\n' ) $setNL( os, true ); // check *AFTER* $sepPrtcall above as it resets NL flag303 if ( ch == '\n' ) setNL$( os, true ); // check *AFTER* sepPrt$ call above as it resets NL flag 304 304 return write( os, s, len ); 305 305 } // ?|? … … 309 309 310 310 // ostype & ?|?( ostype & os, const char16_t * s ) { 311 // if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );311 // if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 312 312 // fmt( os, "%ls", s ); 313 313 // return os; … … 316 316 // #if ! ( __ARM_ARCH_ISA_ARM == 1 && __ARM_32BIT_STATE == 1 ) // char32_t == wchar_t => ambiguous 317 317 // ostype & ?|?( ostype & os, const char32_t * s ) { 318 // if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );318 // if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 319 319 // fmt( os, "%ls", s ); 320 320 // return os; … … 323 323 324 324 // ostype & ?|?( ostype & os, const wchar_t * s ) { 325 // if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );325 // if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 326 326 // fmt( os, "%ls", s ); 327 327 // return os; … … 329 329 330 330 ostype & ?|?( ostype & os, const void * p ) { 331 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );331 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 332 332 fmt( os, "%p", p ); 333 333 return os; … … 343 343 void ?|?( ostype & os, ostype & (* manip)( ostype & ) ) { 344 344 manip( os ); 345 if ( $getPrt( os ) ) ends( os ); // something printed ?346 $setPrt( os, false ); // turn off345 if ( getPrt$( os ) ) ends( os ); // something printed ? 346 setPrt$( os, false ); // turn off 347 347 } // ?|? 348 348 … … 357 357 ostype & nl( ostype & os ) { 358 358 (ostype &)(os | '\n'); 359 $setPrt( os, false ); // turn off360 $setNL( os, true );359 setPrt$( os, false ); // turn off 360 setNL$( os, true ); 361 361 flush( os ); 362 362 return sepOff( os ); // prepare for next line … … 364 364 365 365 ostype & nonl( ostype & os ) { 366 $setPrt( os, false ); // turn off366 setPrt$( os, false ); // turn off 367 367 return os; 368 368 } // nonl … … 408 408 ostype & ?|?( ostype & os, T arg, Params rest ) { 409 409 (ostype &)(os | arg); // print first argument 410 $sepSetCur( os, sepGetTuple( os ) ); // switch to tuple separator410 sepSetCur$( os, sepGetTuple( os ) ); // switch to tuple separator 411 411 (ostype &)(os | rest); // print remaining arguments 412 $sepSetCur( os, sepGet( os ) ); // switch to regular separator412 sepSetCur$( os, sepGet( os ) ); // switch to regular separator 413 413 return os; 414 414 } // ?|? … … 416 416 // (ostype &)(?|?( os, arg, rest )); ends( os ); 417 417 (ostype &)(os | arg); // print first argument 418 $sepSetCur( os, sepGetTuple( os ) ); // switch to tuple separator418 sepSetCur$( os, sepGetTuple( os ) ); // switch to tuple separator 419 419 (ostype &)(os | rest); // print remaining arguments 420 $sepSetCur( os, sepGet( os ) ); // switch to regular separator420 sepSetCur$( os, sepGet( os ) ); // switch to regular separator 421 421 ends( os ); 422 422 } // ?|? … … 447 447 forall( ostype & | ostream( ostype ) ) { \ 448 448 ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \ 449 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) ); \449 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); \ 450 450 \ 451 451 if ( f.base == 'b' || f.base == 'B' ) { /* bespoke binary format */ \ … … 691 691 int bufbeg = 0, i, len; \ 692 692 \ 693 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) ); \693 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); \ 694 694 char fmtstr[sizeof(DFMTP) + 8]; /* sizeof includes '\0' */ \ 695 695 if ( ! f.flags.pc ) memcpy( &fmtstr, DFMTNP, sizeof(DFMTNP) ); \ … … 734 734 } // if 735 735 736 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );736 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 737 737 738 738 #define CFMTNP "% * " … … 772 772 } // if 773 773 774 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );774 if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); 775 775 776 776 #define SFMTNP "% * " -
libcfa/src/iostream.hfa
r341aa39 rc41c2dbe 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Apr 13 13:05:11202113 // Update Count : 38 412 // Last Modified On : Tue Apr 20 19:09:44 2021 13 // Update Count : 385 14 14 // 15 15 … … 24 24 trait ostream( ostype & ) { 25 25 // private 26 bool $sepPrt( ostype & ); // get separator state (on/off)27 void $sepReset( ostype & ); // set separator state to default state28 void $sepReset( ostype &, bool ); // set separator and default state29 const char * $sepGetCur( ostype & ); // get current separator string30 void $sepSetCur( ostype &, const char [] ); // set current separator string31 bool $getNL( ostype & ); // check newline32 void $setNL( ostype &, bool ); // saw newline33 bool $getANL( ostype & ); // get auto newline (on/off)34 bool $getPrt( ostype & ); // get fmt called in output cascade35 void $setPrt( ostype &, bool ); // set fmt called in output cascade26 bool sepPrt$( ostype & ); // get separator state (on/off) 27 void sepReset$( ostype & ); // set separator state to default state 28 void sepReset$( ostype &, bool ); // set separator and default state 29 const char * sepGetCur$( ostype & ); // get current separator string 30 void sepSetCur$( ostype &, const char [] ); // set current separator string 31 bool getNL$( ostype & ); // check newline 32 void setNL$( ostype &, bool ); // saw newline 33 bool getANL$( ostype & ); // get auto newline (on/off) 34 bool getPrt$( ostype & ); // get fmt called in output cascade 35 void setPrt$( ostype &, bool ); // set fmt called in output cascade 36 36 // public 37 37 void sepOn( ostype & ); // turn separator state on -
libcfa/src/stdlib.hfa
r341aa39 rc41c2dbe 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T hu Jan 21 22:02:13 202113 // Update Count : 57 412 // Last Modified On : Tue Apr 20 21:20:03 2021 13 // Update Count : 575 14 14 // 15 15 … … 44 44 45 45 // Macro because of returns 46 #define $ARRAY_ALLOC( allocation, alignment, dim ) \46 #define ARRAY_ALLOC$( allocation, alignment, dim ) \ 47 47 if ( _Alignof(T) <= libAlign() ) return (T *)(void *)allocation( dim, (size_t)sizeof(T) ); /* C allocation */ \ 48 48 else return (T *)alignment( _Alignof(T), dim, sizeof(T) ) … … 57 57 58 58 T * aalloc( size_t dim ) { 59 $ARRAY_ALLOC( aalloc, amemalign, dim );59 ARRAY_ALLOC$( aalloc, amemalign, dim ); 60 60 } // aalloc 61 61 62 62 T * calloc( size_t dim ) { 63 $ARRAY_ALLOC( calloc, cmemalign, dim );63 ARRAY_ALLOC$( calloc, cmemalign, dim ); 64 64 } // calloc 65 65 … … 119 119 S_fill(T) ?`fill( T a[], size_t nmemb ) { S_fill(T) ret = {'a', nmemb}; ret.fill.a = a; return ret; } 120 120 121 3. Replace the $alloc_internalfunction which is outside ttype forall-block with following function:122 T * $alloc_internal( void * Resize, T * Realloc, size_t Align, size_t Dim, S_fill(T) Fill) {121 3. Replace the alloc_internal$ function which is outside ttype forall-block with following function: 122 T * alloc_internal$( void * Resize, T * Realloc, size_t Align, size_t Dim, S_fill(T) Fill) { 123 123 T * ptr = NULL; 124 124 size_t size = sizeof(T); … … 145 145 146 146 return ptr; 147 } // $alloc_internal147 } // alloc_internal$ 148 148 */ 149 149 … … 175 175 S_realloc(T) ?`realloc ( T * a ) { return (S_realloc(T)){a}; } 176 176 177 T * $alloc_internal( void * Resize, T * Realloc, size_t Align, size_t Dim, S_fill(T) Fill ) {177 T * alloc_internal$( void * Resize, T * Realloc, size_t Align, size_t Dim, S_fill(T) Fill ) { 178 178 T * ptr = NULL; 179 179 size_t size = sizeof(T); … … 206 206 207 207 return ptr; 208 } // $alloc_internal209 210 forall( TT... | { T * $alloc_internal( void *, T *, size_t, size_t, S_fill(T), TT ); } ) {211 212 T * $alloc_internal( void * , T * Realloc, size_t Align, size_t Dim, S_fill(T) Fill, T_resize Resize, TT rest) {213 return $alloc_internal( Resize, (T*)0p, Align, Dim, Fill, rest);214 } 215 216 T * $alloc_internal( void * Resize, T * , size_t Align, size_t Dim, S_fill(T) Fill, S_realloc(T) Realloc, TT rest) {217 return $alloc_internal( (void*)0p, Realloc, Align, Dim, Fill, rest);218 } 219 220 T * $alloc_internal( void * Resize, T * Realloc, size_t , size_t Dim, S_fill(T) Fill, T_align Align, TT rest) {221 return $alloc_internal( Resize, Realloc, Align, Dim, Fill, rest);222 } 223 224 T * $alloc_internal( void * Resize, T * Realloc, size_t Align, size_t Dim, S_fill(T) , S_fill(T) Fill, TT rest) {225 return $alloc_internal( Resize, Realloc, Align, Dim, Fill, rest);208 } // alloc_internal$ 209 210 forall( TT... | { T * alloc_internal$( void *, T *, size_t, size_t, S_fill(T), TT ); } ) { 211 212 T * alloc_internal$( void * , T * Realloc, size_t Align, size_t Dim, S_fill(T) Fill, T_resize Resize, TT rest) { 213 return alloc_internal$( Resize, (T*)0p, Align, Dim, Fill, rest); 214 } 215 216 T * alloc_internal$( void * Resize, T * , size_t Align, size_t Dim, S_fill(T) Fill, S_realloc(T) Realloc, TT rest) { 217 return alloc_internal$( (void*)0p, Realloc, Align, Dim, Fill, rest); 218 } 219 220 T * alloc_internal$( void * Resize, T * Realloc, size_t , size_t Dim, S_fill(T) Fill, T_align Align, TT rest) { 221 return alloc_internal$( Resize, Realloc, Align, Dim, Fill, rest); 222 } 223 224 T * alloc_internal$( void * Resize, T * Realloc, size_t Align, size_t Dim, S_fill(T) , S_fill(T) Fill, TT rest) { 225 return alloc_internal$( Resize, Realloc, Align, Dim, Fill, rest); 226 226 } 227 227 228 228 T * alloc( TT all ) { 229 return $alloc_internal( (void*)0p, (T*)0p, (_Alignof(T) > libAlign() ? _Alignof(T) : libAlign()), (size_t)1, (S_fill(T)){'0'}, all);229 return alloc_internal$( (void*)0p, (T*)0p, (_Alignof(T) > libAlign() ? _Alignof(T) : libAlign()), (size_t)1, (S_fill(T)){'0'}, all); 230 230 } 231 231 232 232 T * alloc( size_t dim, TT all ) { 233 return $alloc_internal( (void*)0p, (T*)0p, (_Alignof(T) > libAlign() ? _Alignof(T) : libAlign()), dim, (S_fill(T)){'0'}, all);233 return alloc_internal$( (void*)0p, (T*)0p, (_Alignof(T) > libAlign() ? _Alignof(T) : libAlign()), dim, (S_fill(T)){'0'}, all); 234 234 } 235 235 -
libcfa/src/time.hfa
r341aa39 rc41c2dbe 10 10 // Created On : Wed Mar 14 23:18:57 2018 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Apr 14 09:30:30202113 // Update Count : 66 412 // Last Modified On : Wed Apr 21 06:32:31 2021 13 // Update Count : 667 14 14 // 15 15 … … 28 28 29 29 static inline { 30 void ?{}( Duration & dur, timeval t ) with( dur ) { tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000; } 31 void ?{}( Duration & dur, timespec t ) with( dur ) { tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; } 32 30 33 Duration ?=?( Duration & dur, __attribute__((unused)) zero_t ) { return dur{ 0 }; } 31 32 void ?{}( Duration & dur, timeval t ) with( dur ) { tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000; }33 34 Duration ?=?( Duration & dur, timeval t ) with( dur ) { 34 35 tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * (TIMEGRAN / 1_000_000LL); 35 36 return dur; 36 37 } // ?=? 37 38 void ?{}( Duration & dur, timespec t ) with( dur ) { tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; }39 38 Duration ?=?( Duration & dur, timespec t ) with( dur ) { 40 39 tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; … … 61 60 Duration ?%?( Duration lhs, Duration rhs ) { return (Duration)@{ lhs.tn % rhs.tn }; } 62 61 Duration ?%=?( Duration & lhs, Duration rhs ) { lhs = lhs % rhs; return lhs; } 62 63 bool ?==?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn == 0; } 64 bool ?!=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn != 0; } 65 bool ?<? ( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn < 0; } 66 bool ?<=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn <= 0; } 67 bool ?>? ( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn > 0; } 68 bool ?>=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn >= 0; } 63 69 64 70 bool ?==?( Duration lhs, Duration rhs ) { return lhs.tn == rhs.tn; } … … 68 74 bool ?>? ( Duration lhs, Duration rhs ) { return lhs.tn > rhs.tn; } 69 75 bool ?>=?( Duration lhs, Duration rhs ) { return lhs.tn >= rhs.tn; } 70 71 bool ?==?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn == 0; }72 bool ?!=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn != 0; }73 bool ?<? ( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn < 0; }74 bool ?<=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn <= 0; }75 bool ?>? ( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn > 0; }76 bool ?>=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn >= 0; }77 76 78 77 Duration abs( Duration rhs ) { return rhs.tn >= 0 ? rhs : -rhs; } … … 164 163 void ?{}( Time & time, int year, int month = 1, int day = 1, int hour = 0, int min = 0, int sec = 0, int64_t nsec = 0 ); 165 164 static inline { 165 void ?{}( Time & time, timeval t ) with( time ) { tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000; } 166 void ?{}( Time & time, timespec t ) with( time ) { tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; } 167 166 168 Time ?=?( Time & time, __attribute__((unused)) zero_t ) { return time{ 0 }; } 167 168 void ?{}( Time & time, timeval t ) with( time ) { tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000; }169 169 Time ?=?( Time & time, timeval t ) with( time ) { 170 170 tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * (TIMEGRAN / 1_000_000LL); 171 171 return time; 172 172 } // ?=? 173 174 void ?{}( Time & time, timespec t ) with( time ) { tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; }175 173 Time ?=?( Time & time, timespec t ) with( time ) { 176 174 tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec;
Note: See TracChangeset
for help on using the changeset viewer.