relation change

This commit is contained in:
vrd
2022-12-27 20:07:56 +02:00
parent cd221476a5
commit cc9b0ccc21
8 changed files with 515 additions and 497 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ template <typename T>
class Array class Array
{ {
private: private:
unsigned size, num; //Size and number of elements unsigned size, num; //Size and number of elements
T* arr; T* arr;
void copy(const Array &other); void copy(const Array &other);
-29
View File
@@ -38,32 +38,3 @@ char* mergeStr(const char* first, const char* second) //Create new string from 2
result[j] = '\0'; result[j] = '\0';
return result; return result;
} }
Relation strToRel(const char* str)
{
if (strComp(str, "Father"))
return Father;
else if (strComp(str, "Mother"))
return Mother;
else if (strComp(str, "Son"))
return Son;
else if (strComp(str, "Daughter"))
return Daughter;
else if (strComp(str, "Brother"))
return Brother;
else if (strComp(str, "Sister"))
return Sister;
else if (strComp(str, "HalfBrother"))
return HalfBrother;
else if (strComp(str, "HalfSister"))
return HalfSister;
else if (strComp(str, "Wife"))
return Wife;
else if (strComp(str, "Husband"))
return Husband;
else if (strComp(str, "ExWife"))
return ExWife;
else if (strComp(str, "ExHusband"))
return ExHusband;
return Invalid;
}
-1
View File
@@ -8,4 +8,3 @@ unsigned strLen(const char* str);
void strCopy(char *to, const char* from); void strCopy(char *to, const char* from);
bool strComp(const char* firts, const char* second); //0 - diffrent 1 - same bool strComp(const char* firts, const char* second); //0 - diffrent 1 - same
char* mergeStr(const char* first, const char* second); char* mergeStr(const char* first, const char* second);
Relation strToRel(const char* str);
+179 -167
View File
@@ -1,3 +1,4 @@
#include <ncursesw/ncurses.h> #include <ncursesw/ncurses.h>
#include <iostream> #include <iostream>
#include "tree.h" #include "tree.h"
@@ -46,13 +47,24 @@ int main()
firstTree.addPerson("Адам", true, Nobody, Nobody, {0, 1, 6}); firstTree.addPerson("Адам", true, Nobody, Nobody, {0, 1, 6});
firstTree.addPerson("Ева", false, Nobody, Nobody, {0, 1, 6}); firstTree.addPerson("Ева", false, Nobody, Nobody, {0, 1, 6});
firstTree.addRelation(0, Husband, 1); firstTree.addRelation(0, Spouse, 1);
firstTree.addPerson("Кайн", true, 0, 1); firstTree.addPerson("Кайн", true, 0, 1);
firstTree.addPerson("Авел", true, 0, 1); firstTree.addPerson("Авел", true, 0, 1);
firstTree.addRelation(2, Sibling, 3);
firstTree.addPerson("Сит", true, 0, 1, 230); firstTree.addPerson("Сит", true, 0, 1, 230);
firstTree.addRelation(2, Brother, 3); firstTree.addRelation(2, Sibling, 4);
firstTree.addRelation(2, Brother, 4); firstTree.addPerson("Енос", true, 4, Nobody, 435);
firstTree.addPerson("Каинан", true, 5 , Nobody, 605);
firstTree.addPerson("Малелеил", true, 6, Nobody, 605);
firstTree.addPerson("Енох", true, 3 , Nobody);
firstTree.addPerson("Гаидад", true, 8 , Nobody);
firstTree.addPerson("Малелеил", true, 9, Nobody);
/* firstTree.print(); */ /* firstTree.print(); */
firstTree.draw(); firstTree.draw();
@@ -107,173 +119,173 @@ int main()
bool sex; bool sex;
unsigned father, mother; // IDs unsigned father, mother; // IDs
do /* do */
{ /* { */
clear(); /* clear(); */
printw("Enter a command\n"); /* printw("Enter a command\n"); */
refresh(); /* refresh(); */
// getmaxyx(stdscr,row,col); /* get the number of rows and columns */ /* // getmaxyx(stdscr,row,col); /\* get the number of rows and columns *\/ */
std::cin >> input; /* std::cin >> input; */
for (i = 0; i < numCom; ++i) /* for (i = 0; i < numCom; ++i) */
{ /* { */
if (strComp(input, commandList[i])) /* if (strComp(input, commandList[i])) */
break; /* break; */
} /* } */
switch (i) /* switch (i) */
{ /* { */
default: /* default: */
std::cout << "Unknown command, try again\n\n"; /* std::cout << "Unknown command, try again\n\n"; */
break; /* break; */
case 0: //quit /* case 0: //quit */
quit = 1; /* quit = 1; */
break; /* break; */
case 1: //rename /* case 1: //rename */
std::cout << "Enter new name\n\n"; /* std::cout << "Enter new name\n\n"; */
std::cin >> name; /* std::cin >> name; */
trees[curTree].rename(name); /* trees[curTree].rename(name); */
break; /* break; */
case 2: //load /* case 2: //load */
cin >> input; /* cin >> input; */
trees.push(Tree(input)); /* trees.push(Tree(input)); */
if (!trees[trees.gNum() - 1].loadTree()) /* if (!trees[trees.gNum() - 1].loadTree()) */
std::cout << "File doesnt exist or is empty.\n\n"; /* std::cout << "File doesnt exist or is empty.\n\n"; */
break; /* break; */
case 3: //save /* case 3: //save */
trees[curTree].saveTree(); /* trees[curTree].saveTree(); */
break; /* break; */
case 4: //addPerson /* case 4: //addPerson */
std::cin >> name >> day >> month >> year >> sex; /* std::cin >> name >> day >> month >> year >> sex; */
trees[curTree].addPerson(name, sex, Nobody, Nobody, EventTime(year, month, day)); /* trees[curTree].addPerson(name, sex, Nobody, Nobody, EventTime(year, month, day)); */
break; /* break; */
case 5: //addPersonWP /* case 5: //addPersonWP */
std::cin >> name >> day >> month >> year >> sex >> father >> mother; /* std::cin >> name >> day >> month >> year >> sex >> father >> mother; */
trees[curTree].addPerson(name, sex, father, mother, EventTime(year, month, day)); /* trees[curTree].addPerson(name, sex, father, mother, EventTime(year, month, day)); */
break; /* break; */
case 6: //addRelation /* case 6: //addRelation */
std::cin >> name >> input >> secondName; /* std::cin >> name >> input >> secondName; */
while (!strToRel(input)) /* while (!strToRel(input)) */
{ /* { */
std::cout << "Invalid Relation, try again!\n"; /* std::cout << "Invalid Relation, try again!\n"; */
std::cin >> input; /* std::cin >> input; */
} /* } */
if(!trees[curTree].addRelation(name, strToRel(input), secondName)) /* if(!trees[curTree].addRelation(name, strToRel(input), secondName)) */
std::cout << "Failure! One or both of the relatives don't exist.\n\n"; /* std::cout << "Failure! One or both of the relatives don't exist.\n\n"; */
break; /* break; */
case 7: //addRelationID /* case 7: //addRelationID */
std::cin >> id >> input >> secondId; /* std::cin >> id >> input >> secondId; */
while (!strToRel(input)) /* while (!strToRel(input)) */
{ /* { */
std::cout << "Invalid Relation, try again!\n"; /* std::cout << "Invalid Relation, try again!\n"; */
std::cin >> input; /* std::cin >> input; */
} /* } */
if(trees[curTree].addRelation(id, strToRel(input), secondId)) /* if(trees[curTree].addRelation(id, strToRel(input), secondId)) */
std::cout << "Failure! One or both of the relatives don't exist.\n\n"; /* std::cout << "Failure! One or both of the relatives don't exist.\n\n"; */
break; /* break; */
case 8: //findID /* case 8: //findID */
std::cin >> name; /* std::cin >> name; */
id = trees[curTree].findId(name); /* id = trees[curTree].findId(name); */
if (id == Nobody) /* if (id == Nobody) */
std::cout << "No such person in tree " << curTree <<"\n\n"; /* std::cout << "No such person in tree " << curTree <<"\n\n"; */
else /* else */
std::cout << id << "\n\n"; /* std::cout << id << "\n\n"; */
break; /* break; */
case 9: //equate /* case 9: //equate */
std::cin >> id >> secondId; /* std::cin >> id >> secondId; */
trees[id] = trees[secondId]; /* trees[id] = trees[secondId]; */
break; /* break; */
case 10: //combine /* case 10: //combine */
std::cin >> id >> secondId; /* std::cin >> id >> secondId; */
trees[id] += trees[secondId]; /* trees[id] += trees[secondId]; */
break; /* break; */
case 11: //subtract /* case 11: //subtract */
std::cin >> id >> secondId; /* std::cin >> id >> secondId; */
trees[id] -= trees[secondId]; /* trees[id] -= trees[secondId]; */
break; /* break; */
case 12: //removePerson /* case 12: //removePerson */
std::cin >> name; /* std::cin >> name; */
if (trees[curTree].findId(name) != Nobody) /* if (trees[curTree].findId(name) != Nobody) */
trees[curTree].removePerson(name); /* trees[curTree].removePerson(name); */
else /* else */
std::cout << "No such member!\n\n"; /* std::cout << "No such member!\n\n"; */
break; /* break; */
case 13: //removePersonID /* case 13: //removePersonID */
std::cin >> id; /* std::cin >> id; */
if (trees[curTree].gNumP() > id) /* if (trees[curTree].gNumP() > id) */
trees[curTree].removePerson(id); /* trees[curTree].removePerson(id); */
else /* else */
std::cout << "No such member!\n\n"; /* std::cout << "No such member!\n\n"; */
break; /* break; */
case 14: //removeRelation /* case 14: //removeRelation */
std::cin >> name >> secondName; /* std::cin >> name >> secondName; */
if (trees[curTree].gNumP() > trees[curTree].findId(name) && trees[curTree].gNumP() > trees[curTree].findId(secondName)) /* if (trees[curTree].gNumP() > trees[curTree].findId(name) && trees[curTree].gNumP() > trees[curTree].findId(secondName)) */
trees[curTree].removeRelation(name, secondName); /* trees[curTree].removeRelation(name, secondName); */
else /* else */
std::cout << "No such member!\n\n"; /* std::cout << "No such member!\n\n"; */
break; /* break; */
case 15: //removeRelationID /* case 15: //removeRelationID */
std::cin >> id >> secondId; /* std::cin >> id >> secondId; */
if (trees[curTree].gNumP() > id && trees[curTree].gNumP() > secondId) /* if (trees[curTree].gNumP() > id && trees[curTree].gNumP() > secondId) */
trees[curTree].removeRelation(id, secondId); /* trees[curTree].removeRelation(id, secondId); */
else /* else */
std::cout << "No such member\n\n"; /* std::cout << "No such member\n\n"; */
break; /* break; */
case 16: //addTree /* case 16: //addTree */
std::cin >> name; /* std::cin >> name; */
newTree = new Tree(name); /* newTree = new Tree(name); */
trees.push(*newTree); /* trees.push(*newTree); */
delete newTree; /* delete newTree; */
break; /* break; */
case 17: //printRelatives /* case 17: //printRelatives */
std::cin >> id; /* std::cin >> id; */
if (id < trees[curTree].gNumP()) /* if (id < trees[curTree].gNumP()) */
trees[curTree].printRel(id); /* trees[curTree].printRel(id); */
else /* else */
std::cout << "No such member\n\n"; /* std::cout << "No such member\n\n"; */
break; /* break; */
case 18: //printMember /* case 18: //printMember */
std::cin >> id; /* std::cin >> id; */
if (id < trees[curTree].gNumP()) /* if (id < trees[curTree].gNumP()) */
trees[curTree].printMember(id); /* trees[curTree].printMember(id); */
else /* else */
std::cout << "No such member\n\n"; /* std::cout << "No such member\n\n"; */
break; /* break; */
case 19: //printAncestors /* case 19: //printAncestors */
std::cin >> id; /* std::cin >> id; */
/*if (id < trees[curTree].gNumP()) /* /\*if (id < trees[curTree].gNumP()) */
trees[curTree].printAncestors(id); /* trees[curTree].printAncestors(id); */
else /* else */
std::cout << "No such member\n\n";*/ /* std::cout << "No such member\n\n";*\/ */
break; /* break; */
case 20: //chooseTree /* case 20: //chooseTree */
std::cout << "Enter tree ID\n\n"; /* std::cout << "Enter tree ID\n\n"; */
std::cin >> id; /* std::cin >> id; */
if (id < trees.gNum()) /* if (id < trees.gNum()) */
curTree = id; /* curTree = id; */
else /* else */
std::cout << "No such tree\n\n"; /* std::cout << "No such tree\n\n"; */
break; /* break; */
case 21: //prtCommonAncestor /* case 21: //prtCommonAncestor */
std::cin >> id >> secondId; /* std::cin >> id >> secondId; */
if (id < trees[curTree].gNumP() || secondId < trees[curTree].gNumP()) /* if (id < trees[curTree].gNumP() || secondId < trees[curTree].gNumP()) */
trees[curTree].printMember(trees[curTree].findCommonAncestor(id, secondId)); /* trees[curTree].printMember(trees[curTree].findCommonAncestor(id, secondId)); */
else /* else */
std::cout << "No such member\n\n"; /* std::cout << "No such member\n\n"; */
break; /* break; */
case 22: //prtOldestAncestors /* case 22: //prtOldestAncestors */
std::cin >> id; /* std::cin >> id; */
if (id < trees[curTree].gNumP()) /* if (id < trees[curTree].gNumP()) */
trees[curTree].printOldestAncestors(id); /* trees[curTree].printOldestAncestors(id); */
else /* else */
std::cout << "No such member\n\n"; /* std::cout << "No such member\n\n"; */
break; /* break; */
case 23: /* case 23: */
trees[curTree].print(); /* trees[curTree].print(); */
break; /* break; */
} /* } */
} while (!quit); /* } while (!quit); */
endwin(); /* stop ncursers */ endwin(); /* stop ncursers */
+16 -10
View File
@@ -159,20 +159,26 @@ void Person::print()const
/* cout << '\n'; */ /* cout << '\n'; */
} }
WINDOW* Person::createPad()const U16 Person::boxWidth() const
{ {
U16 width = name_.size() + 4; return name_.size() + 4 - 1; /* TODO: get actual lenght */
WINDOW* pad = newpad(5, width);
box(pad, 5, width);
mvwaddstr(pad, 2, 2, name_.data());
return pad;
} }
void Person::draw(U16 drawY, U16 drawX) const
/* WINDOW* Person::createPad()const */
/* { */
/* U16 width = name_.size() + 4; */
/* WINDOW* pad = newpad(5, width); */
/* box(pad, 5, width); */
/* mvwaddstr(pad, 2, 2, name_.data()); */
/* return pad; */
/* } */
void Person::draw(I16 drawY, I16 drawX) const
{ {
U16 width = name_.size() + 4; /* TODO: get actual lenght */ U16 width = boxWidth();
WINDOW* pad = newpad(BOX_HEIGHT, width); WINDOW* pad = newpad(BOX_HEIGHT, width);
box(pad, BOX_HEIGHT, width); box(pad, BOX_HEIGHT, width);
+4 -2
View File
@@ -39,12 +39,14 @@ public:
void print() const; void print() const;
U16 boxWidth() const;
/* Draw a Person's box on the terminal /* Draw a Person's box on the terminal
drawY,drawX - the coordinates where to draw drawY,drawX - the coordinates where to draw
returns the width of the box*/ returns the width of the box*/
void draw(U16 drawY, U16 drawX) const; void draw(I16 drawY, I16 drawX) const;
WINDOW* createPad()const; /* WINDOW* createPad()const; */
/* staitc constexpr U8 BOX_HEIGHT = 5; */ /* staitc constexpr U8 BOX_HEIGHT = 5; */
friend class Tree; friend class Tree;
+145 -114
View File
@@ -1,5 +1,7 @@
#include <iostream> #include <iostream>
#include<fstream> #include <fstream>
#include <vector>
#include <assert.h>
#include"tree.h" #include"tree.h"
#include"person.h" #include"person.h"
#include"help.h" #include"help.h"
@@ -169,7 +171,7 @@ unsigned Tree::findOldestAncestor(const unsigned &id, const bool &isMale)const
{ {
for (unsigned i = 0; i < people[id].numRel_; ++i) for (unsigned i = 0; i < people[id].numRel_; ++i)
{ {
if (relations[id][i] == Son && people[ relatives[id][i] ].isMale_ == isMale) if (relations[id][i] == Child && people[ relatives[id][i] ].isMale_ == isMale)
return findOldestAncestor(relatives[id][i], isMale); return findOldestAncestor(relatives[id][i], isMale);
} }
return id; return id;
@@ -273,8 +275,8 @@ void Tree::addPerson(const char* name, bool isMale, unsigned father, unsigned mo
Array<Relation> newRelation; Array<Relation> newRelation;
relations.push(newRelation); relations.push(newRelation);
++numPeople; ++numPeople;
addRelation(father, Father, numPeople - 1); addRelation(father, Parent, numPeople - 1);
addRelation(mother, Mother, numPeople - 1); addRelation(mother, Parent, numPeople - 1);
} }
bool Tree::addRelation(const char* firstName, const Relation type, const char* secondName) bool Tree::addRelation(const char* firstName, const Relation type, const char* secondName)
@@ -306,61 +308,20 @@ bool Tree::addRelation(const unsigned firstId, const Relation type, const unsign
if (!opposite) if (!opposite)
{ {
if (people[secondId].isMale_) switch (type)
{ {
switch (type) case Parent:
{ addRelation(secondId, Child, firstId, 1);
case Father: break;
case Mother: case Child:
addRelation(secondId, Son, firstId, 1); addRelation(secondId, Parent, firstId, 1);
break; break;
case Son: case Sibling:
case Daughter: case HalfSibling:
addRelation(secondId, Father, firstId, 1); case Spouse:
break; case ExSpouse:
case Brother: addRelation(secondId, type, firstId, 1);
case Sister: break;
addRelation(secondId, Brother, firstId, 1);
break;
case HalfBrother:
case HalfSister:
addRelation(secondId, HalfBrother, firstId, 1);
break;
case Wife:
addRelation(secondId, Husband, firstId, 1);
break;
case ExWife:
addRelation(secondId, ExHusband, firstId, 1);
break;
}
}
else
{
switch (type)
{
case Father:
case Mother:
addRelation(secondId, Daughter, firstId, 1);
break;
case Son:
case Daughter:
addRelation(secondId, Mother, firstId, 1);
break;
case Brother:
case Sister:
addRelation(secondId, Sister, firstId, 1);
break;
case HalfBrother:
case HalfSister:
addRelation(secondId, HalfSister, firstId, 1);
break;
case Husband:
addRelation(secondId, Wife, firstId, 1);
break;
case ExHusband:
addRelation(secondId, ExWife, firstId, 1);
break;
}
} }
} }
return 1; return 1;
@@ -450,14 +411,25 @@ void Tree::draw() const
/* 1, drawX, */ /* 1, drawX, */
/* 1 +fh-1, drawX + fw-1); */ /* 1 +fh-1, drawX + fw-1); */
const U32 numPpl = people.gNum();
std::vector<bool> drawn(numPpl, false);
people[0].draw(0, 0); U16 drawY = 0/* (LINES) / 2 */;
U16 drawX = 0/* (COLS) / 2 */;
drawLineRec(0, drawY, drawX);
/* people[0].draw(drawY, drawY); */
/* for(U32 i=0; i<relations[0].gNum(); ++i) */
/* { */
/* if(relations[0][i] == Relation::Son) */
/* { */
/* drawX = drawLineRec(i, drawY, drawX) + 2; */
/* } */
/* } */
/* pnoutrefresh(mother, 0, 0, 1, d */ /* pnoutrefresh(mother, 0, 0, 1, d */
doupdate(); doupdate();
getch(); getch();
} }
void Tree::print() const void Tree::print() const
@@ -470,53 +442,53 @@ void Tree::print() const
void Tree::printRel(const unsigned id)const void Tree::printRel(const unsigned id)const
{ {
cout << people[id].name_; /* cout << people[id].name_; */
if (people[id].numRel_ == 0) /* if (people[id].numRel_ == 0) */
cout << " has no known relatives"; /* cout << " has no known relatives"; */
else /* else */
{ /* { */
unsigned relId; /* unsigned relId; */
cout << "'s relatives:\n"; /* cout << "'s relatives:\n"; */
for (unsigned i = 0; i < people[id].numRel_; ++i) /* for (unsigned i = 0; i < people[id].numRel_; ++i) */
{ /* { */
relId = relatives[id][i]; /* relId = relatives[id][i]; */
cout << people[relId].name_ << " - "; /* cout << people[relId].name_ << " - "; */
switch (relations[id][i]) /* switch (relations[id][i]) */
{ /* { */
case Father: /* case Father: */
case Mother: /* case Mother: */
cout << (people[relId].isMale_ ? "son" : "daughter"); /* cout << (people[relId].isMale_ ? "son" : "daughter"); */
break; /* break; */
case Son: /* case Son: */
case Daughter: /* case Daughter: */
cout << (people[relId].isMale_ ? "father" : "mother"); /* cout << (people[relId].isMale_ ? "father" : "mother"); */
break; /* break; */
case Brother: /* case Brother: */
case Sister: /* case Sister: */
cout << (people[relId].isMale_ ? "brother" : "sister"); /* cout << (people[relId].isMale_ ? "brother" : "sister"); */
break; /* break; */
case HalfBrother: /* case HalfBrother: */
case HalfSister: /* case HalfSister: */
cout << (people[relId].isMale_ ? "half brother" : "half sister"); /* cout << (people[relId].isMale_ ? "half brother" : "half sister"); */
break; /* break; */
case Husband: /* case Husband: */
cout << "wife"; /* cout << "wife"; */
break; /* break; */
case Wife: /* case Wife: */
cout << "husband"; /* cout << "husband"; */
break; /* break; */
case ExHusband: /* case ExHusband: */
cout << "ex-wife\n"; /* cout << "ex-wife\n"; */
break; /* break; */
case ExWife: /* case ExWife: */
cout << "ex-husband\n"; /* cout << "ex-husband\n"; */
break; /* break; */
} /* } */
cout << '\n'; /* cout << '\n'; */
} /* } */
cout << '\n'; /* cout << '\n'; */
} /* } */
} }
void Tree::printMember(const unsigned id)const void Tree::printMember(const unsigned id)const
@@ -532,21 +504,80 @@ void Tree::printOldestAncestors(const unsigned id)const
unsigned Tree::gNumP()const
{
return numPeople;
}
void Tree::commonAncestorRec(const unsigned &id, const Array<char> &visited)const void Tree::commonAncestorRec(const unsigned &id, const Array<char> &visited)const
{ {
for (unsigned i = 0; i < people[id].numRel_; ++i) for (unsigned i = 0; i < people[id].numRel_; ++i)
{ {
if (relations[id][i] == Son) if (relations[id][i] == Child)
{ {
++visited[relatives[id][i]]; ++visited[relatives[id][i]];
commonAncestorRec(relatives[id][i], visited); commonAncestorRec(relatives[id][i], visited);
} }
} }
} }
static void linkToFirstBorn(I16 startY, I16 startX)
{
if(startY >= -2 && startX >= 0)
{
WINDOW* win = newwin(3, 1, startY, startX); /* TODO: pad */
waddch(win, ACS_VLINE);
mvwaddch(win, 1, 0, ACS_LTEE);
mvwaddch(win, 2, 0, ACS_VLINE);
wnoutrefresh(win);
delwin(win);
}
}
static void linkToChild(I16 startY, I16 startX, I16 endX)
{
assert(endX >= startX);
if(startY >= -1 && endX >= 0)
{
const I16 len = endX - startX;
WINDOW* win = newwin(2, len, startY, startX);
for(U16 i = 0; i < len-1; ++i)
waddch(win, ACS_HLINE);
/* whline(win, '_', len-1); */
waddch(win, ACS_TTEE);
mvwaddch(win, 1, len-1, ACS_VLINE);
wnoutrefresh(win);
delwin(win);
}
}
I16 Tree::drawLineRec(person_id id, I16 drawY, I16 drawX) const
{
people[id].draw(drawY, drawX);
std::vector<person_id> sons;
for(U32 i=0; i<relations[id].gNum(); ++i)
{
if(relations[id][i] == Relation::Parent)
sons.push_back(relatives[id][i]);
}
if(!sons.empty())
{
auto prevX = drawX;
drawY += BOX_HEIGHT;
linkToFirstBorn(drawY, drawX);
drawX = drawLineRec(sons[0], drawY + 3, drawX) + 1;
for(size_t j = 1; j < sons.size(); ++j)
{
linkToChild(drawY + 1, prevX+1, drawX+1);
prevX = drawX;
drawX = drawLineRec(sons[j], drawY + 3, drawX) + 1;
}
return drawX;
}
return drawX + people[id].boxWidth();
}
+11 -14
View File
@@ -7,18 +7,12 @@
enum Relation : U8 enum Relation : U8
{ {
Invalid = 0, Invalid = 0,
Father, Parent,
Mother, Child,
Son, Sibling,
Daughter, HalfSibling,
Brother, Spouse,
Sister, ExSpouse
HalfBrother,
HalfSister,
Wife,
Husband,
ExWife,
ExHusband
}; };
const U32 Nobody = UINT_MAX; //Òîçè íîìåð ùå áúäå çàïàçeí çà ëèïñà íà âðúçêà/÷îâåê const U32 Nobody = UINT_MAX; //Òîçè íîìåð ùå áúäå çàïàçeí çà ëèïñà íà âðúçêà/÷îâåê
@@ -26,6 +20,8 @@ const U32 Nobody = UINT_MAX; //Òîçè íîìåð ùå áúäå çàïàçeí
class Tree class Tree
{ {
public: public:
using person_id = U32;
Tree() = default; Tree() = default;
template <class Str> template <class Str>
Tree(Str&& Name) : treeName(std::forward<Str>(Name)) {} Tree(Str&& Name) : treeName(std::forward<Str>(Name)) {}
@@ -62,10 +58,11 @@ public:
void printMember(const unsigned id)const; void printMember(const unsigned id)const;
void printOldestAncestors(const unsigned id)const;// void printOldestAncestors(const unsigned id)const;//
unsigned gNumP()const;
private: private:
void commonAncestorRec(const unsigned &id, const Array<char> &visited)const; void commonAncestorRec(const unsigned &id, const Array<char> &visited)const;
/* draw a line of people starting from person with id
return the farthest X that will be drawn */
I16 drawLineRec(person_id id, I16 drawY, I16 drawX) const;
std::string treeName = "Unnamed"; std::string treeName = "Unnamed";
unsigned numPeople = 0; unsigned numPeople = 0;