aboutsummaryrefslogtreecommitdiff
path: root/src/CMI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/CMI.cpp')
-rw-r--r--src/CMI.cpp82
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