diff options
Diffstat (limited to 'src/CMI.cpp')
| -rw-r--r-- | src/CMI.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/CMI.cpp b/src/CMI.cpp new file mode 100644 index 0000000..dfca22d --- /dev/null +++ b/src/CMI.cpp @@ -0,0 +1,82 @@ +#include "CMI.hpp" + +namespace CMI{ + void HalfMove::Promote(){ + HalfMove *broot=GetBranchRoot(); + if(broot!=nullptr){ + HalfMove *parent=broot->GetParent(); + if (parent != nullptr) { + if (parent->GetMainline() != broot) { + HalfMove *pparent=parent->GetParent(); + // First update parent of parent: + if (pparent != nullptr) { + if (pparent->GetMainline() == parent) + pparent->SetMainline(broot); + else { + pparent->AddVariation(broot); + pparent->RemoveChild(parent); + } + } + // Now update parent: + parent->RemoveChild(broot); + broot->AddVariation(parent); + } + } + } + } + + void HalfMove::SetAsMainline(){ + HalfMove *broot = GetBranchRoot(); + HalfMove *lastRoot; + // Just promote until we cannot anymore + do { + lastRoot = broot; + broot->Promote(); + broot = GetBranchRoot(); + } while (broot != lastRoot); + } + + HalfMove* HalfMove::GetBranchRoot(){ + HalfMove *m = this; + HalfMove *p = GetParent(); + while (p != nullptr) { + if (p->GetMainline() != m) { + return (m); + } + m = p; + p = m->GetParent(); + } + return m; + } + + void HalfMove::AddVariation(HalfMove* m){ + m->SetIsBlack(IsBlack()); + m->SetNumber(GetNumber()); + m->SetParent(this); + auto vars=GetVariations(); + vars.push_back(m); + SetVariations(vars); + } + + bool HalfMove::RemoveVariation(HalfMove* m){ + std::vector<HalfMove*> vars; + bool removed=false; + for(HalfMove *v: GetVariations()){ + if(m!=v) + vars.push_back(v); + else + removed=true; + } + if(removed) + SetVariations(vars); + return removed; + } + + bool HalfMove::RemoveChild(HalfMove* m){ + if(GetMainline()==m){ + SetMainline(nullptr); + return true; + } + return RemoveVariation(m); + } +}
\ No newline at end of file |
