#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 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); } }