relation change
This commit is contained in:
@@ -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;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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);
|
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -305,62 +307,21 @@ bool Tree::addRelation(const unsigned firstId, const Relation type, const unsign
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!opposite)
|
if (!opposite)
|
||||||
{
|
|
||||||
if (people[secondId].isMale_)
|
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case Father:
|
case Parent:
|
||||||
case Mother:
|
addRelation(secondId, Child, firstId, 1);
|
||||||
addRelation(secondId, Son, firstId, 1);
|
|
||||||
break;
|
break;
|
||||||
case Son:
|
case Child:
|
||||||
case Daughter:
|
addRelation(secondId, Parent, firstId, 1);
|
||||||
addRelation(secondId, Father, firstId, 1);
|
|
||||||
break;
|
break;
|
||||||
case Brother:
|
case Sibling:
|
||||||
case Sister:
|
case HalfSibling:
|
||||||
addRelation(secondId, Brother, firstId, 1);
|
case Spouse:
|
||||||
|
case ExSpouse:
|
||||||
|
addRelation(secondId, type, firstId, 1);
|
||||||
break;
|
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();
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user