From 1bf0a7f6a4df718d6841d6fcbcff003dd7b12f39 Mon Sep 17 00:00:00 2001 From: Venelin Date: Sat, 27 Aug 2022 16:35:40 +0300 Subject: [PATCH] use typedefed types, BirthTime --- compile.sh | 2 +- compile_debug.sh | 2 +- help.h | 6 +- main.cpp | 497 +++++++++++++++++++++++++---------------------- person.cpp | 104 ++++++---- person.h | 26 ++- tree.cpp | 108 ++++------ tree.h | 37 ++-- 8 files changed, 397 insertions(+), 385 deletions(-) diff --git a/compile.sh b/compile.sh index 3023111..020e9bd 100755 --- a/compile.sh +++ b/compile.sh @@ -1 +1 @@ -g++ -Ofast -flto -fipa-pta -s *.cpp\ +g++ -std=gnu++20 -Ofast -flto -fipa-pta -s -DNDEBUG *.cpp\ diff --git a/compile_debug.sh b/compile_debug.sh index 5d0e44d..7f74eb2 100755 --- a/compile_debug.sh +++ b/compile_debug.sh @@ -1 +1 @@ -g++ *.cpp +g++ -std=gnu++20 -g -Og -Wall *.cpp diff --git a/help.h b/help.h index e53773d..7252979 100644 --- a/help.h +++ b/help.h @@ -1,9 +1,11 @@ #pragma once + +#include "common/basicTypes.h" -enum Relation : char; +enum Relation : U8; unsigned strLen(const char* str); void strCopy(char *to, const char* from); bool strComp(const char* firts, const char* second); //0 - diffrent 1 - same char* mergeStr(const char* first, const char* second); -Relation strToRel(const char* str); \ No newline at end of file +Relation strToRel(const char* str); diff --git a/main.cpp b/main.cpp index e97d5da..8560b54 100644 --- a/main.cpp +++ b/main.cpp @@ -1,238 +1,261 @@ -#include -#include "tree.h" -#include "help.h" - -int main() -{ - /*Tree test1("Dechkovi"); //addTree Dechkovi addTree Karamanovi load 0 load 1 (to work with these example trees) - Tree test2("Karamanovi"); - - test1.addPerson("Rumen", 1968, 8, 9, 0); - test1.addPerson("Nadejda", 1972, 12, 15, 1); - test1.addRelation(0, Husband, 1); - test1.addPerson("Venelin", 1998, 6, 9, 0, 0, 1); - test1.addPerson("Vasil", 2001, 1, 16, 0, 0, 1); - test1.addRelation(2, Brother, 3); - test1.addPerson("Maria-Veronika", 2009, 9, 3, 1, 0, 1); - test1.addRelation(2, Brother, 4); - test1.addRelation(3, Brother, 4); - - test2.addPerson("Vasil Dimitrov", 1941, 5, 18, 0); - test2.addPerson("Maria", 0, 0, 0, 1); - test2.addRelation(0, Husband, 1); - test2.addPerson("Dimitar", 0, 0, 0, 0, 0, 1); - test2.addPerson("Nadejda", 1972, 12, 15, 1, 0, 1); - test2.addRelation(2, Brother, 3); - test2.addPerson("Branimira", 0, 0, 0, 1); - test2.addRelation(2, Husband, 4); - test2.addPerson("Ioan", 0, 0, 0, 0, 2, 4); - test2.addPerson("Rumiana", 0, 0, 0, 1, 2, 4); - test2.addRelation(5, Brother, 6); - - test1.saveTree(); - test2.saveTree();*/ - - - Array trees; - - bool quit=0; - char input[128]; - short i; //Number of the entered command - const short numCom = 23; - const char* const commandList[] = - { - "quit", //0 - "rename", //1 - "load", //2 - "save", //3 - "addPerson", //4 - "addPersonWP", //5 Adds a person and connects him to his parents, by their number - "addRelation", //6 Adds a relation between two people input by name - "addRelationID", //7 -||- by number - "findID", //8 - "equate", //9 Enter the number of two trees, the second becomes equal to the first - "combine", //10 - "subtract", //11 - "removePerson", //12 - "removePersonID", //13 - "removeRelation", //14 - "removeRelationID", //15 - "addTree", //16 - "prtRelatives", //17 - "prtMember", //18 - "prtAncestors", //19 - "chooseTree", //20 - "prtCommonAncestor",//21 - "prtOldestAncestors"//22 - }; - - unsigned curTree = 0, //Currently selected tree ID - id, secondId; //Indexes - Tree *newTree; - char name[128], secondName[128]; - unsigned char day, month; - short year; - bool sex; - unsigned father, mother; - - do - { - std::cout << "Enter a command\n\n"; - std::cin >> input; - for (i = 0; i < numCom; ++i) - { - if (strComp(input, commandList[i])) - break; - } - - switch (i) - { - default: - std::cout << "Unknown command, try again\n\n"; - break; - case 0: //quit - quit = 1; - break; - case 1: //rename - std::cout << "Enter new name\n\n"; - std::cin >> name; - trees[curTree].rename(name); - break; - case 2: //load - if (!trees[curTree].loadTree()) - std::cout << "File doesnt exist or is empty.\n\n"; - break; - case 3: //save - trees[curTree].saveTree(); - break; - case 4: //addPerson - std::cin >> name >> day >> month >> year >> sex; - trees[curTree].addPerson(name, year, month, day, sex); - break; - case 5: //addPersonWP - std::cin >> name >> day >> month >> year >> sex >> father >> mother; - trees[curTree].addPerson(name, year, month, day, sex, father, mother); - break; - case 6: //addRelation - std::cin >> name >> input >> secondName; - while (!strToRel(input)) - { - std::cout << "Invalid Relation, try again!\n"; - std::cin >> input; - } - if(!trees[curTree].addRelation(name, strToRel(input), secondName)) - std::cout << "Failure! One or both of the relatives don't exist.\n\n"; - break; - case 7: //addRelationID - std::cin >> id >> input >> secondId; - while (!strToRel(input)) - { - std::cout << "Invalid Relation, try again!\n"; - std::cin >> input; - } - if(trees[curTree].addRelation(id, strToRel(input), secondId)) - std::cout << "Failure! One or both of the relatives don't exist.\n\n"; - break; - case 8: //findID - std::cin >> name; - id = trees[curTree].findId(name); - if (id == Nobody) - std::cout << "No such person in tree " << curTree <<"\n\n"; - else - std::cout << id << "\n\n"; - break; - case 9: //equate - std::cin >> id >> secondId; - trees[id] = trees[secondId]; - break; - case 10: //combine - std::cin >> id >> secondId; - trees[id] += trees[secondId]; - break; - case 11: //subtract - std::cin >> id >> secondId; - trees[id] -= trees[secondId]; - break; - case 12: //removePerson - std::cin >> name; - if (trees[curTree].findId(name) != Nobody) - trees[curTree].removePerson(name); - else - std::cout << "No such member!\n\n"; - break; - case 13: //removePersonID - std::cin >> id; - if (trees[curTree].gNumP() > id) - trees[curTree].removePerson(id); - else - std::cout << "No such member!\n\n"; - break; - case 14: //removeRelation - std::cin >> name >> secondName; - if (trees[curTree].gNumP() > trees[curTree].findId(name) && trees[curTree].gNumP() > trees[curTree].findId(secondName)) - trees[curTree].removeRelation(name, secondName); - else - std::cout << "No such member!\n\n"; - break; - case 15: //removeRelationID - std::cin >> id >> secondId; - if (trees[curTree].gNumP() > id && trees[curTree].gNumP() > secondId) - trees[curTree].removeRelation(id, secondId); - else - std::cout << "No such member\n\n"; - break; - case 16: //addTree - std::cin >> name; - newTree = new Tree(name); - trees.push(*newTree); - delete newTree; - break; - case 17: //printRelatives - std::cin >> id; - if (id < trees[curTree].gNumP()) - trees[curTree].printRel(id); - else - std::cout << "No such member\n\n"; - break; - case 18: //printMember - std::cin >> id; - if (id < trees[curTree].gNumP()) - trees[curTree].printMember(id); - else - std::cout << "No such member\n\n"; - break; - case 19: //printAncestors - std::cin >> id; - /*if (id < trees[curTree].gNumP()) - trees[curTree].printAncestors(id); - else - std::cout << "No such member\n\n";*/ - break; - case 20: //chooseTree - std::cout << "Enter tree ID\n\n"; - std::cin >> id; - if (id < trees.gNum()) - curTree = id; - else - std::cout << "No such tree\n\n"; - break; - case 21: //prtCommonAncestor - std::cin >> id >> secondId; - if (id < trees[curTree].gNumP() || secondId < trees[curTree].gNumP()) - trees[curTree].printMember(trees[curTree].findCommonAncestor(id, secondId)); - else - std::cout << "No such member\n\n"; - break; - case 22: //prtOldestAncestors - std::cin >> id; - if (id < trees[curTree].gNumP()) - trees[curTree].printOldestAncestors(id); - else - std::cout << "No such member\n\n"; - break; - } - - } while (!quit); - - return 0; +#include +#include "tree.h" +#include "help.h" + +using std::cin; +using std::cout; + +int main() +{ + /*Tree test1("Dechkovi"); //addTree Dechkovi addTree Karamanovi load 0 load 1 (to work with these example trees) + Tree test2("Karamanovi"); + + test1.addPerson("Rumen", 1968, 8, 9, 0); + test1.addPerson("Nadejda", 1972, 12, 15, 1); + test1.addRelation(0, Husband, 1); + test1.addPerson("Venelin", 1998, 6, 9, 0, 0, 1); + test1.addPerson("Vasil", 2001, 1, 16, 0, 0, 1); + test1.addRelation(2, Brother, 3); + test1.addPerson("Maria-Veronika", 2009, 9, 3, 1, 0, 1); + test1.addRelation(2, Brother, 4); + test1.addRelation(3, Brother, 4); + + test2.addPerson("Vasil Dimitrov", 1941, 5, 18, 0); + test2.addPerson("Maria", 0, 0, 0, 1); + test2.addRelation(0, Husband, 1); + test2.addPerson("Dimitar", 0, 0, 0, 0, 0, 1); + test2.addPerson("Nadejda", 1972, 12, 15, 1, 0, 1); + test2.addRelation(2, Brother, 3); + test2.addPerson("Branimira", 0, 0, 0, 1); + test2.addRelation(2, Husband, 4); + test2.addPerson("Ioan", 0, 0, 0, 0, 2, 4); + test2.addPerson("Rumiana", 0, 0, 0, 1, 2, 4); + test2.addRelation(5, Brother, 6); + + test1.saveTree(); + test2.saveTree();*/ + + Tree firstTree("firstTree"); + firstTree.addPerson("Адам,", {0, 1, 6}, true); + firstTree.addPerson("Ева", {0, 1, 6}, false); + firstTree.addRelation(0, Husband, 1); + + firstTree.addPerson("Кайн", {}, true, 0, 1); + firstTree.addPerson("Авел", {}, true, 0, 1); + firstTree.addPerson("Сит", 230, true, 0, 1); + firstTree.addRelation(2, Brother, 3); + firstTree.addRelation(2, Brother, 4); + + firstTree.print(); + firstTree.saveTree(); + + + Array trees; + + bool quit = false; + char input[128]; + short i; //Number of the entered command + const short numCom = 24; + const char* const commandList[] = + { + "quit", //0 + "rename", //1 + "load", //2 + "save", //3 + "addPerson", //4 + "addPersonWP", //5 Adds a person and connects him to his parents, by their number + "addRelation", //6 Adds a relation between two people input by name + "addRelationID", //7 -||- by number + "findID", //8 + "equate", //9 Enter the number of two trees, the second becomes equal to the first + "combine", //10 + "subtract", //11 + "removePerson", //12 + "removePersonID", //13 + "removeRelation", //14 + "removeRelationID", //15 + "addTree", //16 + "prtRelatives", //17 + "prtMember", //18 + "prtAncestors", //19 + "chooseTree", //20 + "prtCommonAncestor", //21 + "prtOldestAncestors",//22 + "prtTree" //23 + }; + + unsigned curTree = 0, //Currently selected tree ID + id, secondId; //Indexes + Tree *newTree; + char name[128], secondName[128]; + U8 day, month; //TODO add h m + U16 year; + bool sex; + unsigned father, mother; + + do + { + std::cout << "Enter a command\n"; + std::cin >> input; + for (i = 0; i < numCom; ++i) + { + if (strComp(input, commandList[i])) + break; + } + + switch (i) + { + default: + std::cout << "Unknown command, try again\n\n"; + break; + case 0: //quit + quit = 1; + break; + case 1: //rename + std::cout << "Enter new name\n\n"; + std::cin >> name; + trees[curTree].rename(name); + break; + case 2: //load + cin >> input; + trees.push(Tree(input)); + if (!trees[trees.gNum() - 1].loadTree()) + std::cout << "File doesnt exist or is empty.\n\n"; + break; + case 3: //save + trees[curTree].saveTree(); + break; + case 4: //addPerson + std::cin >> name >> day >> month >> year >> sex; + trees[curTree].addPerson(name, BirthTime(year, month, day) , sex); + break; + case 5: //addPersonWP + std::cin >> name >> day >> month >> year >> sex >> father >> mother; + trees[curTree].addPerson(name, BirthTime(year, month, day), sex, father, mother); + break; + case 6: //addRelation + std::cin >> name >> input >> secondName; + while (!strToRel(input)) + { + std::cout << "Invalid Relation, try again!\n"; + std::cin >> input; + } + if(!trees[curTree].addRelation(name, strToRel(input), secondName)) + std::cout << "Failure! One or both of the relatives don't exist.\n\n"; + break; + case 7: //addRelationID + std::cin >> id >> input >> secondId; + while (!strToRel(input)) + { + std::cout << "Invalid Relation, try again!\n"; + std::cin >> input; + } + if(trees[curTree].addRelation(id, strToRel(input), secondId)) + std::cout << "Failure! One or both of the relatives don't exist.\n\n"; + break; + case 8: //findID + std::cin >> name; + id = trees[curTree].findId(name); + if (id == Nobody) + std::cout << "No such person in tree " << curTree <<"\n\n"; + else + std::cout << id << "\n\n"; + break; + case 9: //equate + std::cin >> id >> secondId; + trees[id] = trees[secondId]; + break; + case 10: //combine + std::cin >> id >> secondId; + trees[id] += trees[secondId]; + break; + case 11: //subtract + std::cin >> id >> secondId; + trees[id] -= trees[secondId]; + break; + case 12: //removePerson + std::cin >> name; + if (trees[curTree].findId(name) != Nobody) + trees[curTree].removePerson(name); + else + std::cout << "No such member!\n\n"; + break; + case 13: //removePersonID + std::cin >> id; + if (trees[curTree].gNumP() > id) + trees[curTree].removePerson(id); + else + std::cout << "No such member!\n\n"; + break; + case 14: //removeRelation + std::cin >> name >> secondName; + if (trees[curTree].gNumP() > trees[curTree].findId(name) && trees[curTree].gNumP() > trees[curTree].findId(secondName)) + trees[curTree].removeRelation(name, secondName); + else + std::cout << "No such member!\n\n"; + break; + case 15: //removeRelationID + std::cin >> id >> secondId; + if (trees[curTree].gNumP() > id && trees[curTree].gNumP() > secondId) + trees[curTree].removeRelation(id, secondId); + else + std::cout << "No such member\n\n"; + break; + case 16: //addTree + std::cin >> name; + newTree = new Tree(name); + trees.push(*newTree); + delete newTree; + break; + case 17: //printRelatives + std::cin >> id; + if (id < trees[curTree].gNumP()) + trees[curTree].printRel(id); + else + std::cout << "No such member\n\n"; + break; + case 18: //printMember + std::cin >> id; + if (id < trees[curTree].gNumP()) + trees[curTree].printMember(id); + else + std::cout << "No such member\n\n"; + break; + case 19: //printAncestors + std::cin >> id; + /*if (id < trees[curTree].gNumP()) + trees[curTree].printAncestors(id); + else + std::cout << "No such member\n\n";*/ + break; + case 20: //chooseTree + std::cout << "Enter tree ID\n\n"; + std::cin >> id; + if (id < trees.gNum()) + curTree = id; + else + std::cout << "No such tree\n\n"; + break; + case 21: //prtCommonAncestor + std::cin >> id >> secondId; + if (id < trees[curTree].gNumP() || secondId < trees[curTree].gNumP()) + trees[curTree].printMember(trees[curTree].findCommonAncestor(id, secondId)); + else + std::cout << "No such member\n\n"; + break; + case 22: //prtOldestAncestors + std::cin >> id; + if (id < trees[curTree].gNumP()) + trees[curTree].printOldestAncestors(id); + else + std::cout << "No such member\n\n"; + break; + case 23: + trees[curTree].print(); + break; + } + + } while (!quit); + + return 0; } diff --git a/person.cpp b/person.cpp index 93b5315..7e3288f 100644 --- a/person.cpp +++ b/person.cpp @@ -1,29 +1,54 @@ +#include +#include + #include"person.h" -#include"help.h" -#include +#include "help.h" + +using std::cout; -/*Person::Person(): - name(nullptr), - numRel(0), - day(0), - month(0), - year(0), - isMale(true) -{}*/ +BirthTime::BirthTime(U16 Year, U8 Month, U8 Day, U8 Hour, U8 Minute) + : year(Year) + , month(Month) + , day(Day) + , hour(Hour) + , minute(Minute) +{ + assert(month <= 12 && day <= 31 && hour <= 23 && minute <= 59 && "Invalid BirthTime data"); +} + +void BirthTime::print() const +{ + cout << "Birth: "; + if (day != UNKNOWN) + cout << (I32)day; + else + cout << "??"; + cout << '.'; + + if (month != UNKNOWN) + cout << (I32)month; + else + cout << "??"; + cout << '.'; + + if (year != UNKNOWN) + cout << (I32)year; + else + cout << "????"; + cout << '\n'; +} -Person::Person(const char* Name, unsigned char Day, unsigned char Month, short Year, bool IsMale) : - numRel(0), - day(Day), - month(Month), - year(Year), - isMale(IsMale) + +Person::Person(const char* Name, BirthTime Birth, bool IsMale) + : name(Name) + , numRel(0) + , birth(Birth) + , isMale(IsMale) { - name = new char[strLen(Name) + 1]; - strCopy(name, Name); } -Person& Person::operator=(const Person &other) +/*Person& Person::operator=(const Person &other) { if (&other!=this) { @@ -35,58 +60,53 @@ Person& Person::operator=(const Person &other) year = other.year; } return *this; -} - -Person::~Person() -{ - delete[] name; -} +}*/ bool Person::operator==(const Person &other)const { - return strComp(name, other.name) && isMale == other.isMale && (day == other.day || !day || !other.day) && (month == other.month || !month || !other.month) && (year == other.year || !year || !other.year); + return name == other.name && isMale == other.isMale; //TODO && day == other.day || !day || !other.day) && (month == other.month || !month || !other.month) && (year == other.year || !year || !other.year); } void Person::save(std::ofstream &file)const { // - char nameLen = strLen(name); + char nameLen = name.size(); file.write(reinterpret_cast(&nameLen), sizeof(nameLen)); - file.write(name, nameLen * sizeof(*name)); + file.write(name.data(), nameLen * sizeof(name[0])); file.write(reinterpret_cast(&numRel), sizeof(numRel)); file.write(reinterpret_cast(&isMale), sizeof(isMale)); - file.write(reinterpret_cast(&day), sizeof(day)); - file.write(reinterpret_cast(&month), sizeof(month)); - file.write(reinterpret_cast(&year), sizeof(year)); + //file.write(reinterpret_cast(&day), sizeof(day)); TODO + //file.write(reinterpret_cast(&month), sizeof(month)); + //file.write(reinterpret_cast(&year), sizeof(year)); } void Person::load(std::ifstream &file) { char nameLen; - file.read((char*)&nameLen, sizeof(nameLen)); + file.read((char*)&nameLen, sizeof(nameLen)); //Check len - name = new char[nameLen + 1]; - file.read(name, nameLen * sizeof(*name)); - name[nameLen] = '\0'; + C8 nameBuf[128]; + file.read(nameBuf, nameLen * sizeof(*nameBuf)); + nameBuf[nameLen] = '\0'; + name = nameBuf; file.read(reinterpret_cast(&numRel), sizeof(numRel)); file.read(reinterpret_cast(&isMale), sizeof(isMale)); - file.read(reinterpret_cast(&day), sizeof(day)); - file.read(reinterpret_cast(&month), sizeof(month)); - file.read(reinterpret_cast(&year), sizeof(year)); + //file.read(reinterpret_cast(&day), sizeof(day)); TODO + //file.read(reinterpret_cast(&month), sizeof(month)); + //file.read(reinterpret_cast(&year), sizeof(year)); } void Person::rename(const char* newName) { - delete[] name; - name = new char[strLen(newName) + 1]; - strCopy(name, newName); + name = newName; } void Person::print()const { - std::cout << name << "\nBirthday: " << (int)day << "." << (int)month << "." << year << "\nSex: "; + std::cout << name << '\n'; + birth.print(); std::cout << (isMale ? "Male\n\n" : "Female\n\n"); } diff --git a/person.h b/person.h index 18ddc32..d2265ee 100644 --- a/person.h +++ b/person.h @@ -1,16 +1,25 @@ -#pragma once +#pragma once + +#include #include -#include "common/basicTypes.h" +#include "common/basicTypes.h" + +struct BirthTime +{ + static const U16 UNKNOWN = 0; + /*explicit*/ BirthTime(U16 Year=UNKNOWN, U8 Month=UNKNOWN, U8 Day=UNKNOWN, U8 Hour=UNKNOWN, U8 Minute=UNKNOWN); + void print() const; + + U16 year; + U8 month, day, hour, minute; +}; class Person { public: Person() = default; - Person(const char* Name, unsigned char Day, unsigned char Monthay, short Year, bool Sex); - // - Person& operator=(const Person &other); - ~Person(); + Person(const char* Name, BirthTime Birth, bool Sex); bool operator==(const Person &other)const; @@ -22,9 +31,8 @@ public: friend class Tree; private: - char *name; + std::string name; unsigned numRel; //Number of close relatives - mother, father, brother, sister, wife/husband, child, ex-wife/husband - unsigned char day, month; //Birth - short year; + BirthTime birth; bool isMale; }; diff --git a/tree.cpp b/tree.cpp index df0b8bb..37aa3c7 100644 --- a/tree.cpp +++ b/tree.cpp @@ -1,56 +1,20 @@ +#include +#include #include"tree.h" #include"person.h" -#include"help.h" -#include - - -Tree::Tree() : - numPeople(0) -{ - treeName = new char[strLen("Unnamed") + 1]; - strCopy(treeName, "Unnamed"); -} - -Tree::Tree(const char *Name): - numPeople(0) -{ - treeName = new char[strLen(Name) + 1]; - strCopy(treeName, Name); -} - -Tree::Tree(const Tree& other) : - numPeople(other.numPeople) -{ - treeName = new char[strLen(other.treeName) + 1]; - strCopy(treeName, other.treeName); - people = other.people; - relatives = other.relatives; - relations = other.relations; -} - -Tree& Tree::operator= (const Tree& other) -{ - if (this != &other) - { - rename(other.treeName); - numPeople = other.numPeople; - people = other.people; - relatives = other.relatives; - relations = other.relations; - } - return *this; -} - -Tree::~Tree() -{ - delete[] treeName; -} +#include"help.h" + +using std::cout; +Tree::Tree() + : treeName("Unnamed") + , numPeople(0) +{} Tree Tree::operator+ (const Tree& other)// { - Tree result(mergeStr(treeName, other.treeName)); //The tree resulting from the addition + Tree result(treeName + other.treeName); //The tree resulting from the addition unsigned *newId = new unsigned[other.numPeople]; //The indexes members of the II tree will have in result unsigned idCounter = numPeople; @@ -191,17 +155,16 @@ Tree& Tree::operator-= (const Tree& other) void Tree::rename(const char* newName) { - delete[] treeName; - treeName = new char[strLen(newName) + 1]; - strCopy(treeName, newName); + treeName = newName; } unsigned Tree::findId(const char* name, const short year, const unsigned char month, const unsigned char day)const -{ +{ + //TODO //Person sought(name, day, month, year,) for (unsigned i = 0; i < numPeople; ++i) { - if (strComp(name, people[i].name) && (year == people[i].year || !year || !people[i].year) && (month == people[i].month || !month || !people[i].month) && (day == people[i].day || !day || people[i].day)) + if (name == people[i].name) //&& (year == people[i].year || !year || !people[i].year) && (month == people[i].month || !month || !people[i].month) && (day == people[i].day || !day || people[i].day)) return i; } return Nobody; @@ -226,35 +189,29 @@ unsigned Tree::findCommonAncestor(const unsigned firstId, const unsigned secondI commonAncestorRec(secondId, visited); unsigned oldestId = Nobody; - short oldestBday = SHRT_MAX; + U16 oldestBday = SHRT_MAX; for (unsigned i = 0; i < numPeople; ++i) { - if (visited[i] == 2 && people[i].year(&numPeople), sizeof(numPeople)); for (unsigned i = 0; i < numPeople; ++i) people[i].save(peopleFile); peopleFile.close(); - fileName = mergeStr(treeName, ".relatives"); - std::ofstream relativeFile(fileName, std::ios::binary); - delete[] fileName; - fileName = mergeStr(treeName, ".relations"); - std::ofstream relationFile(fileName, std::ios::binary); - delete[] fileName; + std::ofstream relativeFile(treeName + ".relatives", std::ios::binary); + std::ofstream relationFile(treeName + ".relations", std::ios::binary); /*relativeFile.write((char*)&numPeople, sizeof(numPeople)); relationFile.write((char*)&numPeople, sizeof(numPeople));*/ @@ -274,9 +231,7 @@ void Tree::saveTree()const bool Tree::loadTree() { - char* fileName = mergeStr(treeName, ".people");//c - std::ifstream peopleFile(fileName, std::ios::binary); - delete[] fileName; + std::ifstream peopleFile(treeName + ".people", std::ios::binary); if (peopleFile.peek() == std::char_traits::eof()) { peopleFile.close(); @@ -290,12 +245,8 @@ bool Tree::loadTree() people.sNum(numPeople); peopleFile.close(); - fileName = mergeStr(treeName, ".relatives"); - std::ifstream relativeFile(fileName, std::ios::binary); - delete[] fileName; - fileName = mergeStr(treeName, ".relations"); - std::ifstream relationFile(fileName, std::ios::binary); - delete[] fileName; + std::ifstream relativeFile(treeName + ".relatives", std::ios::binary); + std::ifstream relationFile(treeName + ".relations", std::ios::binary); relatives.resize(numPeople); relations.resize(numPeople); @@ -318,9 +269,9 @@ bool Tree::loadTree() return 1; } -void Tree::addPerson(const char *name, short year, unsigned char month, unsigned char day, bool isMale, unsigned father, unsigned mother) +void Tree::addPerson(const char *name, BirthTime birth, bool isMale, unsigned father, unsigned mother) { - Person newPerson(name, day, month, year, isMale); + Person newPerson(name, birth, isMale); people.push(newPerson); Array newRelative; relatives.push(newRelative); @@ -490,6 +441,13 @@ void Tree::removeRelation(const unsigned firstId, const unsigned secondId) } +void Tree::print() const +{ + //for(const auto& member: people) + // member.print(); + for(int i=0; i +#pragma once + #include -#include"array.h" +#include "array.h" +#include "person.h" -class Person; - -enum Relation : char +enum Relation : U8 { Invalid = 0, Father, @@ -26,18 +25,13 @@ const unsigned Nobody = UINT_MAX; //Òîçè íîìåð ùå áúäå çàïàç class Tree { -private: - char *treeName; - unsigned numPeople; - Array people; //The data for each member - Array> relatives; //The relatives of each member - Array> relations; //The type of relation each member has with his relatives public: - Tree(); - Tree(const char *Name); - Tree(const Tree&); + Tree(); + template + Tree(Str&& Name) : treeName(std::forward(Name)), numPeople(0) {} + /*Tree(const Tree&); Tree& operator= (const Tree& other); - ~Tree(); + ~Tree();*/ Tree operator+ (const Tree& other); Tree operator- (const Tree& other); @@ -50,14 +44,15 @@ public: unsigned findCommonAncestor(const unsigned firstId, const unsigned secondId)const; //oldest common ancestor ID void saveTree()const;// bool loadTree(); - void addPerson(const char *, short year, unsigned char month, unsigned char day, bool sex, unsigned father = Nobody, unsigned mother = Nobody); + void addPerson(const char *name, BirthTime birth, bool isMale, unsigned father = Nobody, unsigned mother = Nobody); bool addRelation(const char* firstName, const Relation, const char* secondName); //Adds a new relation or edits an old one. 0 - failure 1 - success bool addRelation(const unsigned firstId, const Relation, const unsigned secondId, bool opposite=0); //0 - failure 1 - success void removePerson(const unsigned id); //Removes a member and the last one takes his ID void removePerson(const char*, const short year = 0, const unsigned char month = 0, const unsigned char day = 0); void removeRelation(const unsigned firstId, const unsigned secondId); void removeRelation(const char* firstName, const char* secondName); - + + void print()const; void printRel(const unsigned id)const; //Prints out close relatives void printMember(const unsigned id)const; void printOldestAncestors(const unsigned id)const;// @@ -66,6 +61,12 @@ public: private: void commonAncestorRec(const unsigned &id, const Array &visited)const; + + std::string treeName; + unsigned numPeople; + Array people; //The data for each member + Array> relatives; //The relatives of each member + Array> relations; //The type of relation each member has with his relatives //Search, ect. };