Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/user/user.tex

    rdabc428 rb202dc2  
    1111%% Created On       : Wed Apr  6 14:53:29 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Tue Apr 20 23:25:56 2021
    14 %% Update Count     : 4888
     13%% Last Modified On : Sat Mar 27 09:55:55 2021
     14%% Update Count     : 4796
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    6666% math escape $...$ (dollar symbol)
    6767\input{common}                                          % common CFA document macros
    68 \setlength{\gcolumnposn}{3in}
    6968\CFAStyle                                                                                               % use default CFA format-style
    7069\lstset{language=CFA}                                                                   % CFA default lnaguage
     
    21672166\section{Enumeration}
    21682167
    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
     2168An \newterm{enumeration} is a compile-time mechanism to give names to constants.
     2169There is no runtime manifestation of an enumeration.
     2170Their purpose is code-readability and maintenance -- changing an enum's value automatically updates all name usages during compilation.
     2171
     2172An 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}
     2174enum Days { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; // enumeration type definition, set of 7 names
    21752175Days days = Mon; // enumeration type declaration and initialization
    21762176\end{cfa}
    2177 The set of enums are injected into the variable namespace at the definition scope.
     2177The set of enums are injected into the scope of the definition and use the variable namespace.
    21782178Hence, enums may be overloaded with enum/variable/function names.
    21792179\begin{cfa}
     
    21832183double Bar;                     $\C{// overload Foo.Bar, Goo.Bar}\CRT$
    21842184\end{cfa}
    2185 An anonymous enumeration injects enums with specific values into a scope.
     2185An anonymous enumeration is used to inject enums with specific values into a scope:
    21862186\begin{cfa}
    21872187enum { Prime = 103, BufferSize = 1024 };
    21882188\end{cfa}
    2189 An enumeration is better than using C \Index{preprocessor} or constant declarations.
    2190 \begin{cquote}
    2191 \begin{tabular}{@{}l@{\hspace{4em}}l@{}}
     2189An enumeration is better than using the C \Index{preprocessor}
    21922190\begin{cfa}
    21932191#define Mon 0
     
    21952193#define Sun 6
    21962194\end{cfa}
    2197 &
    2198 \begin{cfa}
    2199 const int Mon = 0,
    2200                          ...,
    2201                          Sun = 6;
    2202 \end{cfa}
    2203 \end{tabular}
    2204 \end{cquote}
     2195or C constant declarations
     2196\begin{cfa}
     2197const int Mon = 0, ..., Sun = 6;
     2198\end{cfa}
    22052199because the enumeration is succinct, has automatic numbering, can appear in ©case© labels, does not use storage, and is part of the language type-system.
    22062200Finally, the type of an enum is implicitly or explicitly specified and the constant value can be implicitly or explicitly specified.
     
    22102204\subsection{Enum type}
    22112205
    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 
     2206While 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.
    22172208The default enum type is ©int©.
    22182209Hence, ©Days© is the set type ©Mon©, ©Tue©, ...\,, ©Sun©, while the type of each enum is ©int© and each enum represents a fixed integral value.
    22192210If no values are specified for an integral enum type, the enums are automatically numbered by one from left to right starting at zero.
    22202211Hence, the value of enum ©Mon© is 0, ©Tue© is 1, ...\,, ©Sun© is 6.
    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.
     2212If a value is specified, numbering continues by one from that value.
     2213It an enum value is an expression, the compiler performs constant-folding to obtain a constant value.
     2214
     2215Other integral types with associated values can be explicitly specified.
    22252216\begin{cfa}
    22262217enum( @char@ ) Letter { A @= 'A'@,  B,  C,  I @= 'I'@,  J,  K };
     
    22282219\end{cfa}
    22292220For 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©.
    2230 
    2231 Non-integral enum types must be explicitly initialized, \eg ©double© is not automatically numbered by one.
     2221Note, an enum is an immutable constant, \ie ©A = B© is disallowed;
     2222by transitivity, an enum's type is implicitly ©const©.
     2223Hence, a constant/enum cannot appear in a mutuable context nor is a constant/enum addressable (rvalue).
     2224
     2225Non-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©.
    22322226\begin{cfa}
    22332227// non-integral numeric
    2234 enum( @double@ ) Math { PI_2 = 1.570796, PI = 3.141597,  E = 2.718282 }
     2228enum( double ) Math { PI_2 = 1.570796, PI = 3.141597,  E = 2.718282 }
    22352229// pointer
    2236 enum( @char *@ ) Name { Fred = "Fred",  Mary = "Mary",  Jane = "Jane" };
     2230enum( char * ) Name { Fred = "Fred",  Mary = "Mary",  Jane = "Jane" };
    22372231int i, j, k;
    2238 enum( @int *@ ) ptr { I = &i,  J = &j,  K = &k };
    2239 enum( @int &@ ) ref { I = i,  J = j,  K = k };
     2232enum( int * ) ptr { I = &i,  J = &j,  K = &k };
     2233enum( int & ) ref { I = i,  J = j,  K = k };
    22402234// tuple
    2241 enum( @[int, int]@ ) { T = [ 1, 2 ] };
     2235enum( [int, int] ) { T = [ 1, 2 ] };
    22422236// function
    22432237void f() {...}   void g() {...}
    2244 enum( @void (*)()@ ) funs { F = f,  F = g };
     2238enum( void (*)() ) funs { F = f,  F = g };
    22452239// aggregate
    22462240struct S { int i, j; };
    2247 enum( @S@ ) s { A = { 3,  4 }, B = { 7,  8 } };
     2241enum( S ) s { A = { 3,  4 }, B = { 7,  8 } };
    22482242// enumeration
    2249 enum( @Letter@ ) Greek { Alph = A, Beta = B, /* more enums */  }; // alphabet intersection
     2243enum( Letter ) Greek { Alph = A, Beta = B, /* more enums */  }; // alphabet intersection
    22502244\end{cfa}
    22512245Enumeration ©Greek© may have more or less enums than ©Letter©, but the enum values \emph{must} be from ©Letter©.
     
    22592253m = Alph;               $\C{// {\color{red}disallowed}}$
    22602254m = 3.141597;   $\C{// {\color{red}disallowed}}$
    2261 d = m;                  $\C{// allowed}$
     2255d = E;                  $\C{// allowed, conversion to base type}$
     2256d = m;                  $\C{// {\color{red}disallowed}}$
    22622257d = Alph;               $\C{// {\color{red}disallowed}}$
    22632258Letter l = A;   $\C{// allowed}$
     
    22682263
    22692264A constructor \emph{cannot} be used to initialize enums because a constructor executes at runtime.
    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 } }
     2265A fallback is to substitute C-style initialization overriding the constructor with ©@=©.
     2266\begin{cfa}
     2267enum( struct vec3 ) Axis { Up $@$= { 1, 0, 0 }, Left $@$= ..., Front $@$= ... }
    22732268\end{cfa}
    22742269Finally, enumeration variables are assignable and comparable only if the appropriate operators are defined for its enum type.
     
    22792274\Index{Plan-9}\index{inheritance!enumeration} inheritance may be used with enumerations.
    22802275\begin{cfa}
    2281 enum( char * ) Name2 { @inline Name@, Jack = "Jack", Jill = "Jill" };
    2282 enum @/* inferred */@  Name3 { @inline Name2@, Sue = "Sue", Tom = "Tom" };
     2276enum( const char * ) Name2 { @inline Name@, Jack = "Jack", Jill = "Jill" };
     2277enum @/* inferred */@  Name3 { @inline Name@, @inline Name2@, Sue = "Sue", Tom = "Tom" };
    22832278\end{cfa}
    22842279Enumeration ©Name2© inherits all the enums and their values from enumeration ©Name© by containment, and a ©Name© enumeration is a subtype of enumeration ©Name2©.
     
    22862281The enum type for the inheriting type must be the same as the inherited type;
    22872282hence the enum type may be omitted for the inheriting enumeration and it is inferred from the inherited enumeration, as for ©Name3©.
    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©.
     2283When inheriting from integral types, automatic numbering may be used, so the inheritance placement left to right is important.
    22892284
    22902285Specifically, the inheritance relationship for ©Name©s is:
     
    23062301j( Fred );    j( Jill );    j( Sue );    j( 'W' );
    23072302\end{cfa}
    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.
     2303Note, 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.
    23092304
    23102305Enums cannot be created at runtime, so inheritence problems, such as contra-variance do not apply.
     
    23182313\begin{cfa}
    23192314// Fred is a subset of char *
    2320 enum( char *) Fred { A = "A", B = "B", C = "C" };
     2315enum char * Fred { A = "A", B = "B", C = "C" };
    23212316// Jack is a subset of Fred
    2322 enum( enum Fred ) Jack { W = A, Y = C};
     2317enum enum Fred Jack { W = A, Y = C};
    23232318// Mary is a superset of Fred
    23242319enum Mary { inline Fred, D = "hello" };
     
    41734168
    41744169The 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.
    4175 For ©bool© type, the constants are ©true© and ©false©.
     4170For ©_Bool© type, the constants are ©true© and ©false©.
    41764171For integral types, any number of digits, optionally preceded by a sign (©+© or ©-©), where a
    41774172\begin{itemize}
     
    45854580In 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.
    45864581However, 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.
    4587 Defining special constants for a user-defined type is more efficient than defining a conversion to the type from ©bool©.
     4582Defining special constants for a user-defined type is more efficient than defining a conversion to the type from ©_Bool©.
    45884583
    45894584Why just 0 and 1? Why not other integers? No other integers have special status in C.
     
    50505045\begin{figure}
    50515046\begin{cfa}
    5052 #include <fstream.hfa>
    5053 #include @<coroutine.hfa>@
    5054 
    5055 @coroutine@ Fibonacci {
     5047#include <fstream>
     5048#include <coroutine>
     5049
     5050coroutine Fibonacci {
    50565051        int fn; $\C{// used for communication}$
    50575052};
    5058 
    5059 void main( Fibonacci & fib ) with( fib ) { $\C{// called on first resume}$
     5053void ?{}( Fibonacci * this ) {
     5054        this->fn = 0;
     5055}
     5056void main( Fibonacci * this ) {
    50605057        int fn1, fn2; $\C{// retained between resumes}$
    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;
     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}
     5074int next( Fibonacci * this ) {
     5075        resume( this ); $\C{// transfer to last suspend}$
     5076        return this->fn;
    50735077}
    50745078int main() {
    50755079        Fibonacci f1, f2;
    5076         for ( 10 ) { $\C{// print N Fibonacci values}$
    5077                 sout | next( f1 ) | next( f2 );
    5078         }
    5079 }
    5080 \end{cfa}
    5081 \vspace*{-5pt}
     5080        for ( int i = 1; i <= 10; i += 1 ) {
     5081                sout | next( &f1 ) | ' ' | next( &f2 );
     5082        } // for
     5083}
     5084\end{cfa}
    50825085\caption{Fibonacci Coroutine}
    50835086\label{f:FibonacciCoroutine}
     
    51055108\begin{figure}
    51065109\begin{cfa}
    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}$
     5110#include <fstream>
     5111#include <kernel>
     5112#include <monitor>
     5113#include <thread>
     5114
     5115monitor global_t {
     5116        int value;
     5117};
     5118
     5119void ?{}(global_t * this) {
     5120        this->value = 0;
     5121}
     5122
     5123static global_t global;
     5124
     5125void increment3( global_t * mutex this ) {
     5126        this->value += 1;
     5127}
     5128void increment2( global_t * mutex this ) {
     5129        increment3( this );
     5130}
     5131void increment( global_t * mutex this ) {
     5132        increment2( this );
     5133}
    51205134
    51215135thread MyThread {};
    5122 void main( MyThread & ) {
    5123         for ( i; 100_000 ) {
    5124                 inc( global );
    5125                 dec( global );
     5136
     5137void main( MyThread* this ) {
     5138        for(int i = 0; i < 1_000_000; i++) {
     5139                increment( &global );
    51265140        }
    51275141}
    5128 int main() {
    5129         enum { Threads = 4 };
    5130         processor p[Threads - 1]; $\C{// + starting processor}$
     5142int main(int argc, char* argv[]) {
     5143        processor p;
    51315144        {
    5132                 MyThread t[Threads];
     5145                MyThread f[4];
    51335146        }
    5134         sout | global; $\C{// print 0}$
     5147        sout | global.value;
    51355148}
    51365149\end{cfa}
    51375150\caption{Atomic-Counter Monitor}
    5138 \label{f:AtomicCounterMonitor}
     5151\caption{f:AtomicCounterMonitor}
    51395152\end{figure}
    51405153
     
    73077320[ int, long double ] remquo( long double, long double );
    73087321
     7322float div( float, float, int * );$\indexc{div}$ $\C{// alternative name for remquo}$
     7323double div( double, double, int * );
     7324long double div( long double, long double, int * );
    73097325[ int, float ] div( float, float );
    73107326[ int, double ] div( double, double );
     
    73677383long double _Complex log( long double _Complex );
    73687384
    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 );
     7385float log2( float );$\indexc{log2}$
    73737386double log2( double );
    73747387long double log2( long double );
     
    75527565\leavevmode
    75537566\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 
    75907567float floor( float );$\indexc{floor}$
    75917568double floor( double );
     
    76907667\begin{cfa}[aboveskip=0pt,belowskip=0pt]
    76917668struct Duration {
    7692         int64_t tn; $\C{// nanoseconds}$
     7669        int64_t tv; $\C{// nanoseconds}$
    76937670};
    76947671
    76957672void ?{}( Duration & dur );
    76967673void ?{}( Duration & dur, zero_t );
    7697 void ?{}( Duration & dur, timeval t )
    7698 void ?{}( Duration & dur, timespec t )
    76997674
    77007675Duration ?=?( Duration & dur, zero_t );
    7701 Duration ?=?( Duration & dur, timeval t )
    7702 Duration ?=?( Duration & dur, timespec t )
    77037676
    77047677Duration +?( Duration rhs );
     
    77227695Duration ?%=?( Duration & lhs, Duration rhs );
    77237696
    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 );
     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 );
    77377710
    77387711Duration abs( Duration rhs );
     
    77617734int64_t ?`w( Duration dur );
    77627735
    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 
    77727736Duration max( Duration lhs, Duration rhs );
    77737737Duration min( Duration lhs, Duration rhs );
    7774 
    7775 forall( ostype & | ostream( ostype ) ) ostype & ?|?( ostype & os, Duration dur );
    77767738\end{cfa}
    77777739
     
    77847746\begin{cfa}[aboveskip=0pt,belowskip=0pt]
    77857747void ?{}( timeval & t );
    7786 void ?{}( timeval & t, zero_t );
    77877748void ?{}( timeval & t, time_t sec, suseconds_t usec );
    77887749void ?{}( timeval & t, time_t sec );
     7750void ?{}( timeval & t, zero_t );
    77897751void ?{}( timeval & t, Time time );
    77907752
     
    77927754timeval ?+?( timeval & lhs, timeval rhs );
    77937755timeval ?-?( timeval & lhs, timeval rhs );
    7794 bool ?==?( timeval lhs, timeval rhs );
    7795 bool ?!=?( timeval lhs, timeval rhs );
     7756_Bool ?==?( timeval lhs, timeval rhs );
     7757_Bool ?!=?( timeval lhs, timeval rhs );
    77967758\end{cfa}
    77977759
     
    78047766\begin{cfa}[aboveskip=0pt,belowskip=0pt]
    78057767void ?{}( timespec & t );
    7806 void ?{}( timespec & t, zero_t );
    78077768void ?{}( timespec & t, time_t sec, __syscall_slong_t nsec );
    78087769void ?{}( timespec & t, time_t sec );
     7770void ?{}( timespec & t, zero_t );
    78097771void ?{}( timespec & t, Time time );
    78107772
     
    78127774timespec ?+?( timespec & lhs, timespec rhs );
    78137775timespec ?-?( timespec & lhs, timespec rhs );
    7814 bool ?==?( timespec lhs, timespec rhs );
    7815 bool ?!=?( timespec lhs, timespec rhs );
     7776_Bool ?==?( timespec lhs, timespec rhs );
     7777_Bool ?!=?( timespec lhs, timespec rhs );
    78167778\end{cfa}
    78177779
     
    78357797\begin{cfa}[aboveskip=0pt,belowskip=0pt]
    78367798struct Time {
    7837         uint64_t tn; $\C{// nanoseconds since UNIX epoch}$
     7799        uint64_t tv; $\C{// nanoseconds since UNIX epoch}$
    78387800};
    78397801
    78407802void ?{}( Time & time );
    78417803void ?{}( Time & time, zero_t );
     7804
     7805Time ?=?( Time & time, zero_t );
     7806
    78427807void ?{}( Time & time, timeval t );
     7808Time ?=?( Time & time, timeval t );
     7809
    78437810void ?{}( Time & time, timespec t );
    7844 
    7845 Time ?=?( Time & time, zero_t );
    7846 Time ?=?( Time & time, timeval t );
    78477811Time ?=?( Time & time, timespec t );
    78487812
     
    78547818Time ?-?( Time lhs, Duration rhs );
    78557819Time ?-=?( Time & lhs, Duration 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 );
     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 );
    78647826
    78657827char * yy_mm_dd( Time time, char * buf );
    7866 char * ?`ymd( Time time, char * buf ); // short form
     7828char * ?`ymd( Time time, char * buf ) { // short form
     7829        return yy_mm_dd( time, buf );
     7830} // ymd
    78677831
    78687832char * mm_dd_yy( Time time, char * buf );
    7869 char * ?`mdy( Time time, char * buf ); // short form
     7833char * ?`mdy( Time time, char * buf ) { // short form
     7834        return mm_dd_yy( time, buf );
     7835} // mdy
    78707836
    78717837char * dd_mm_yy( Time time, char * buf );
    7872 char * ?`dmy( Time time, char * buf ); // short form
     7838char * ?`dmy( Time time, char * buf ) { // short form
     7839        return dd_mm_yy( time, buf );;
     7840} // dmy
    78737841
    78747842size_t strftime( char * buf, size_t size, const char * fmt, Time time );
    7875 
    7876 forall( ostype & | ostream( ostype ) ) ostype & ?|?( ostype & os, Time time );
     7843forall( dtype ostype | ostream( ostype ) ) ostype & ?|?( ostype & os, Time time );
    78777844\end{cfa}
    78787845
     
    79007867\leavevmode
    79017868\begin{cfa}[aboveskip=0pt,belowskip=0pt]
    7902 struct Clock { $\C{// virtual clock}$
    7903         Duration offset; $\C{// offset from computer real-time}$
     7869struct Clock {
     7870        Duration offset; $\C{// for virtual clock: contains offset from real-time}$
     7871        int clocktype; $\C{// implementation only -1 (virtual), CLOCK\_REALTIME}$
    79047872};
    79057873
    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}$
     7874void resetClock( Clock & clk );
     7875void resetClock( Clock & clk, Duration adj );
     7876void ?{}( Clock & clk );
     7877void ?{}( Clock & clk, Duration adj );
     7878
     7879Duration getResNsec(); $\C{// with nanoseconds}$
     7880Duration getRes(); $\C{// without nanoseconds}$
     7881
     7882Time getTimeNsec(); $\C{// with nanoseconds}$
     7883Time getTime(); $\C{// without nanoseconds}$
     7884Time getTime( Clock & clk );
     7885Time ?()( Clock & clk );
     7886timeval getTime( Clock & clk );
     7887tm getTime( Clock & clk );
    79227888\end{cfa}
    79237889
     
    80908056forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype * os, Int mp );
    80918057\end{cfa}
    8092 \VRef[Figure]{f:MultiPrecisionFactorials} shows \CFA and C factorial programs using the GMP interfaces.
     8058
     8059The following factorial programs contrast using GMP with the \CFA and C interfaces, where the output from these programs appears in \VRef[Figure]{f:MultiPrecisionFactorials}.
    80938060(Compile with flag \Indexc{-lgmp} to link with the GMP library.)
    8094 
    8095 \begin{figure}
    80968061\begin{cquote}
    80978062\begin{tabular}{@{}l@{\hspace{\parindentlnth}}|@{\hspace{\parindentlnth}}l@{}}
    8098 \multicolumn{1}{@{}c|@{\hspace{\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{@{\hspace{\parindentlnth}}c}{\textbf{C}@{}}   \\
     8063\multicolumn{1}{c|@{\hspace{\parindentlnth}}}{\textbf{\CFA}}    & \multicolumn{1}{@{\hspace{\parindentlnth}}c}{\textbf{C}}      \\
    80998064\hline
    81008065\begin{cfa}
     
    81058070
    81068071        sout | 0 | fact;
    8107         for ( i; 40 ) {
     8072        for ( unsigned int i = 1; i <= 40; i += 1 ) {
    81088073                fact *= i;
    81098074                sout | i | fact;
     
    81278092\end{tabular}
    81288093\end{cquote}
    8129 \small
     8094
     8095\begin{figure}
    81308096\begin{cfa}
    81318097Factorial Numbers
Note: See TracChangeset for help on using the changeset viewer.