Differences From Artifact [29c4bbd4331091b4]:
- File        
output.d
- 2012-07-14 07:47:55 - part of checkin [b6daa1efa1] on branch trunk - Modularized version. (user: kinaba) [annotate]
 
 
To Artifact [1b458d7cd25e92dc]:
- File        
output.d
- 2012-07-14 08:31:35 - part of checkin [a5e6c99b3d] on branch trunk - Guarded. (user: kinaba) [annotate]
 
 - File        
src/output.d
- 2012-07-14 09:16:47 - part of checkin [6293256fec] on branch trunk - Preparing for submission... (user: kinaba) [annotate]
 
 
     2      2   import game;
     3      3   import core.stdc.signal;
     4      4   import std.c.stdlib;
     5      5   
     6      6   abstract class Output
     7      7   {
     8      8    void command(char c);
            9  + void flush();
     9     10   }
    10     11   
    11     12   class NilOutput : Output
    12     13   {
    13     14    override void command(char c) {}
           15  + override void flush() {}
    14     16   }
    15     17   
    16     18   class StdOutput : Output
    17     19   {
           20  + override void command(char c)
           21  + {
           22  +  write(c);
           23  +  stdout.flush();
           24  + }
           25  + override void flush() {}
           26  +}
           27  +
           28  +// TODO: clean it up.
           29  +__gshared Output g_output;
           30  +
           31  +class GuardedOutput : StdOutput
           32  +{
    18     33    // Handle SIGINT: force abort and exit.
    19     34    static this()
    20     35    {
    21     36     signal(SIGINT, &sigint);
    22     37    }
    23         - extern(C) static void sigint(int) {
    24         -  write("A");
    25         -  stdout.flush();
           38  +
           39  + extern(C) static void sigint(int)
           40  + {
           41  +  if(g_output !is null)
           42  +   g_output.flush();
           43  +  else {
           44  +   write("A");
           45  +   stdout.flush();
           46  +  }
    26     47     exit(0);
    27     48    }
    28     49   
           50  + Game g;
           51  + this(Game ini) { this.g = ini.clone(); ideal_log ~= g.score_if_abort_now; g_output = this; }
           52  +
           53  + string log;
           54  + long[] score_log;
           55  + long[] ideal_log;
           56  +
    29     57    override void command(char c)
    30     58    {
    31         -  // TODO: optimize redundancy.
    32         -  write(c);
           59  +  g.command(c);
           60  +  log ~= c;
           61  +  score_log ~= g.score;
           62  +  ideal_log ~= g.score_if_abort_now;
           63  + }
           64  + override void flush()
           65  + {
           66  +  Tuple!(long, int, int) cand;
           67  +  cand[0] = long.min;
           68  +  foreach(int i, long s; score_log)
           69  +   if(cand[0] < s)
           70  +    cand = tuple(s,i,0);
           71  +  foreach(int i, long s; ideal_log)
           72  +   if(cand[0] < s)
           73  +    cand = tuple(s,i,1);
           74  +  if(cand[2]==0)
           75  +   writeln(log[0..cand[1]+1]);
           76  +  else
           77  +   writeln(log[0..cand[1]]~"A");
    33     78     stdout.flush();
    34     79    }
    35     80   }