00001
00002
00003 #include "osl/checkmate/checkStack.h"
00004 #include "osl/checkmate/checkHashRecord.h"
00005 #include "osl/record/csa.h"
00006 #include <iostream>
00007
00008 osl::checkmate::CheckStackEntry::
00009 CheckStackEntry(const CheckMove *nextMove, const char *name,
00010 const CheckHashRecord *r,
00011 const HashKey& h, const PathEncoding& path,
00012 unsigned int proofLimit, unsigned int disproofLimit)
00013 : move(nextMove ? *nextMove : CheckMove()),
00014 name(name), record(r), hash(h), path(path),
00015 proofLimit(proofLimit), disproofLimit(disproofLimit)
00016 {
00017 }
00018
00019
00020 osl::checkmate::CheckStack::
00021 ~CheckStack()
00022 {
00023 }
00024
00025 osl::checkmate::CheckStack::const_iterator osl::checkmate::CheckStack::
00026 findLoop(const CheckHashRecord *record) const
00027 {
00028 for (const_iterator p=begin(); p!=end(); ++p)
00029 {
00030 if (p->record == record)
00031 return p;
00032 }
00033 return end();
00034 }
00035
00036 osl::checkmate::CheckStack::const_iterator osl::checkmate::CheckStack::
00037 findCover(Player attacker, const HashKey& hash, const CheckHashRecord *record) const
00038 {
00039 for (const_iterator p=begin(); p!=end(); ++p)
00040 {
00041 assert(p->record);
00042 if (! p->hash.isSameBoard(hash))
00043 continue;
00044 if (p->record->stand(BLACK).hasMoreThan(attacker, record->stand(BLACK))
00045 && (p->record->stand(BLACK) != record->stand(BLACK)))
00046 return p;
00047 }
00048 return end();
00049 }
00050
00051 std::ostream& osl::checkmate::
00052 operator<<(std::ostream& os, const CheckStack& s)
00053 {
00054 for (size_t i=0; i<s.size(); ++i)
00055 {
00056 std::cerr << i << " " << s[i] << "\n";
00057 }
00058 return os;
00059 }
00060
00061 std::ostream& osl::checkmate::
00062 operator<<(std::ostream& os, const CheckStackEntry& e)
00063 {
00064 csaShow(os, e.move.move);
00065
00066 os << " " << e.move.flags << " " << e.name << " " << e.record
00067 << " " << e.path;
00068 if (e.proofLimit)
00069 os << " pl" << e.proofLimit;
00070 if (e.disproofLimit)
00071 os << " dl" << e.disproofLimit;
00072 if (e.record)
00073 {
00074 os << " depth " << e.record->distance
00075
00076 << " m " << e.record->moves.size();
00077 #if 0
00078
00079 << " s " << e.record->solvedMoves.size()
00080 << " u " << e.record->upwardMoves.size();
00081 if (e.record->interposeMoves.size())
00082 os << " i " << e.record->interposeMoves.size();
00083 if (e.record->noPromoteMoves.size())
00084 os << " n " << e.record->noPromoteMoves.size();
00085 #endif
00086 os << " p " << e.record->proof()
00087 << " d " << e.record->disproof()
00088 << " " << e.record->filter;
00089 if (e.record->finalByDominance())
00090 os << " dom by " << e.record->finalByDominance();
00091 if (! e.record->twins.empty())
00092 {
00093 os << " twins " << e.record->twins.size();
00094 for (TwinList::const_iterator p=e.record->twins.begin();
00095 p!=e.record->twins.end(); ++p)
00096 {
00097 os << " " << p->path << " ";
00098 csaShow(os, p->move.move);
00099 }
00100 }
00101 }
00102 return os;
00103 }
00104
00105
00106
00107
00108
00109