Differences From Artifact [3f9e2911ee63dc4e]:
- File        
src/output.d
- 2012-07-14 14:22:32 - part of checkin [a0c3529225] on branch trunk - code cleanup (user: kinaba) [annotate]
 
 
To Artifact [62e6040714438eff]:
- File        
src/output.d
- 2012-07-14 14:41:22 - part of checkin [95915ac93f] on branch trunk - n*m limitter. (user: kinaba) [annotate]
 
 
    21     21   
    22     22   class GuardedOutput : GameObserver
    23     23   {
    24     24    this(in Game g)
    25     25    {
    26     26     setup_sigint_handling();
    27     27     ideal_log ~= g.score_if_abort_now;
           28  +  flushed = false;
    28     29    }
    29     30   
    30     31    override void on_game_changed(char c, in Game g, bool finished)
    31     32    {
           33  +  if(flushed)
           34  +   return;
           35  +
    32     36     log ~= c;
    33     37     score_log ~= g.score;
    34     38     ideal_log ~= g.score_if_abort_now;
    35         -  if(finished)
           39  +  if(finished || log.length+1==g.map.W*g.map.H)
    36     40      flush();
    37     41    }
    38     42   
    39     43   private:
    40     44    string log;
    41     45    long[] score_log;
    42     46    long[] ideal_log;
           47  + bool   flushed;
    43     48   
    44     49    void flush()
    45     50    {
    46     51     Tuple!(long, int, int) cand;
    47     52     cand[0] = long.min;
    48     53   
    49     54     for(int i=0; i<score_log.length; ++i)
................................................................................
    57     62      string str = log[0..cand[1]+1];
    58     63      std.c.stdio.printf("%.*s\n", str.length, str.ptr);
    59     64     } else {
    60     65      string str = log[0..cand[1]];
    61     66      std.c.stdio.printf("%.*sA\n", str.length, str.ptr);
    62     67     }
    63     68     std.c.stdio.fflush(std.c.stdio.stdout);
           69  +  flushed = true;
    64     70    }
    65     71   
    66     72   private:
    67     73    static __gshared GuardedOutput g_output;
    68     74   
    69     75    void setup_sigint_handling()
    70     76    {
    71     77     assert(g_output is null);
    72     78     g_output = this;
    73     79     extern(C) static void catch_sigint(int) { g_output.flush(); application_exit(); }
    74     80     core.stdc.signal.signal(SIGINT, &catch_sigint);
    75     81    }
    76     82   }