/[ghosts]/ghosts/gedcomparser/src/GEDCOMParser/LineageLinkageGedcom.cpp
ViewVC logotype

Diff of /ghosts/gedcomparser/src/GEDCOMParser/LineageLinkageGedcom.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.13 by cpcp, Thu Sep 25 19:27:11 2003 UTC revision 1.14 by cpcp, Thu Oct 30 20:05:42 2003 UTC
# Line 25  Line 25 
25  #include "GEDCOMParser/GEDCOMFactory.hh"  #include "GEDCOMParser/GEDCOMFactory.hh"
26  #include "GEDCOMParser/GEDCOMFactoryAccessor.hh"  #include "GEDCOMParser/GEDCOMFactoryAccessor.hh"
27    
 #include <iostream>  
28    
29  GEDCOMParser::Header * GEDCOMParser::LineageLinkageGedcom::setHeader(GEDCOMParser::Header * const data = 0)  GEDCOMParser::Header * GEDCOMParser::LineageLinkageGedcom::setHeader(GEDCOMParser::Header * const data = 0)
30  {  {
# Line 83  GEDCOMParser::IndividualRecord * GEDCOMP Line 82  GEDCOMParser::IndividualRecord * GEDCOMP
82      {      {
83        _id_generator = new GEDCOMParser::IdGenerator();        _id_generator = new GEDCOMParser::IdGenerator();
84      }      }
85      
86    if (data == 0)    if (data == 0)
87      {      {
88        GEDCOMParser::GEDCOMFactory * factory = GEDCOMParser::GEDCOMFactoryAccessor::getFactory();        GEDCOMParser::GEDCOMFactory * factory = GEDCOMParser::GEDCOMFactoryAccessor::getFactory();
# Line 220  GEDCOMParser::SubmitterRecord * GEDCOMPa Line 219  GEDCOMParser::SubmitterRecord * GEDCOMPa
219    return _submitter_records[id].getPtr();    return _submitter_records[id].getPtr();
220  }  }
221    
222  GEDCOMParser::SpouseToFamilyLink * GEDCOMParser::LineageLinkageGedcom::AddSpouse(GEDCOMParser::IndividualRecord * spouse)  void GEDCOMParser::LineageLinkageGedcom::RemoveFamilyRecord(SmartPtr < GEDCOMParser::FamilyRecord > const &family)
 {  
   GEDCOMParser::SpouseToFamilyLink * family_link = 0;  
   if (spouse != 0)  
     {  
       family_link = spouse->addSpouseToFamilyLink();  
       GEDCOMParser::FamilyRecord * family_record = addFamilyRecord();  
       family_record->setSpouse(*spouse);  
       family_link->setFamsXref(family_record->getId());  
     }  
   return family_link;  
 }  
   
 void GEDCOMParser::LineageLinkageGedcom::RemoveSpouseToFamilyLink(GEDCOMParser::IndividualRecord  * individual, GEDCOMParser::SpouseToFamilyLink * family_link_to_delete)  
 {  
   if (individual != 0)  
     {  
       SmartPtr < GEDCOMParser::FamilyRecord > family = _family_records[family_link_to_delete->getFamsXref()];  
       SmartPtr < GEDCOMParser::IndividualRecord > spouse;  
       GEDCOMParser::SpouseToFamilyLinks_t spouse_links;  
       GEDCOMParser::SpouseToFamilyLinks_t::iterator spouse_link_iter;  
       std::string const & spouse_id = family->getSpouseId(*individual);  
         
       if (spouse_id != "")  
         {  
           spouse = _individual_records[spouse_id];  
           spouse_links = spouse->getSpouseToFamilyLinks();  
           spouse_link_iter = find_if(spouse_links.begin(), spouse_links.end(), GEDCOMParser::SpouseToFamilyLink::IsEqualByFamsXref(family->getId()));  
         }  
       family->RemoveSpouse(*individual);  
       individual->RemoveFamilyLink(family_link_to_delete);  
       if (FamilyIsUsed(family.getPtr()) == false)  
         {  
           RemoveFamilyRecord(*(family.getPtr()));  
         }  
       if (spouse_id != "")  
         {  
           if (spouse_link_iter != spouse_links.end())  
             {  
               RemoveSpouseToFamilyLink(spouse.getPtr(), (*spouse_link_iter).getPtr());  
             }  
         }  
     }  
   return;  
 }  
   
 void GEDCOMParser::LineageLinkageGedcom::RemoveFamilyRecord(GEDCOMParser::FamilyRecord const &family)  
223  {  {
224    GEDCOMParser::FamilyRecords_t::iterator family_iter = _family_records.find(family.getId());    GEDCOMParser::FamilyRecords_t::iterator family_iter = _family_records.find(family->getId());
225    _family_records.erase(family_iter);    _family_records.erase(family_iter);
226    return;    return;
227  }  }
228    
 GEDCOMParser::ChildToFamilyLink * GEDCOMParser::LineageLinkageGedcom::AddParents(GEDCOMParser::IndividualRecord * child)  
 {  
   GEDCOMParser::ChildToFamilyLink * family_link = 0;  
   if (child != 0)  
     {  
       family_link = child->addChildToFamilyLink();  
       GEDCOMParser::FamilyRecord * family_record = addFamilyRecord();  
       family_record->addChilXref(child->getId());  
       family_link->setFamcXref(family_record->getId());  
     }  
   return family_link;  
 }  
   
 void GEDCOMParser::LineageLinkageGedcom::setParent(GEDCOMParser::FamilyRecord * const family, GEDCOMParser::IndividualRecord * parent)  
 {  
     
   if ((family != 0) && (parent != 0))  
     {  
       family->setSpouse(*parent);  
       GEDCOMParser::SpouseToFamilyLink * spouse_link = parent->addSpouseToFamilyLink();  
       std::string const &family_id = family->getId();  
       spouse_link->setFamsXref(family_id);  
     }  
   return;  
 }  
   
 void GEDCOMParser::LineageLinkageGedcom::RemoveChildToFamilyLink(GEDCOMParser::IndividualRecord * individual, GEDCOMParser::ChildToFamilyLink * family_link_to_delete)  
 {  
   if (individual != 0)  
     {  
       SmartPtr < GEDCOMParser::FamilyRecord > family = _family_records[family_link_to_delete->getFamcXref()];  
       family->RemoveChilXref(individual->getId());  
       individual->RemoveFamilyLink(family_link_to_delete);  
       if (FamilyIsUsed(family.getPtr()) == false)  
         {  
           RemoveFamilyRecord(*(family.getPtr()));  
         }  
     }  
   return;  
 }  
   
229  SmartPtr<GEDCOMParser::Header> const & GEDCOMParser::LineageLinkageGedcom::getHeader(void) const  SmartPtr<GEDCOMParser::Header> const & GEDCOMParser::LineageLinkageGedcom::getHeader(void) const
230  {  {
231    return _header;    return _header;
# Line 359  GEDCOMParser::SubmitterRecords_t const & Line 271  GEDCOMParser::SubmitterRecords_t const &
271    return _submitter_records;    return _submitter_records;
272  }  }
273    
 SmartPtr<GEDCOMParser::IndividualRecord> GEDCOMParser::LineageLinkageGedcom::getIndividualParent(GEDCOMParser::IndividualRecord const * const individu, GEDCOMParser::LineageLinkageGedcom::enumParents parent_type) const  
 {  
   std::string fam_id;  
   std::string parent_id;  
   FamilyRecords_t::const_iterator fam_iter;  
   IndividualRecords_t::const_iterator parent_iter;  
   SmartPtr<GEDCOMParser::IndividualRecord> res;  
   
   if (individu->getChildToFamilyLinks().size() == 1)  
     {  
       fam_id = individu->getChildToFamilyLinks()[0]->getFamcXref();  
       fam_iter = _family_records.find(fam_id);  
       if (fam_iter != _family_records.end())  
         {  
           if (parent_type == e_Husband)  
             {  
               parent_id = (*fam_iter).second->getHusb();  
             }  
           else  
             {  
               parent_id = (*fam_iter).second->getWife();  
             }  
           parent_iter = _individual_records.find(parent_id);  
           if (parent_iter != _individual_records.end())  
             {  
               res = (*parent_iter).second;  
             }  
         }  
     }  
   return res;  
 }  
   
 bool GEDCOMParser::LineageLinkageGedcom::hasChildren(GEDCOMParser::IndividualRecord const * const individu) const  
 {  
   std::string fam_id;  
   FamilyRecords_t::const_iterator fam_iter;  
   IndividualRecords_t::const_iterator child_iter;  
   bool found = false;  
   
   if (individu != 0)  
     {  
       SpouseToFamilyLinks_t spouse_to_family_links = individu->getSpouseToFamilyLinks();  
       SpouseToFamilyLinks_t::const_iterator spouse_to_family_links_iter = spouse_to_family_links.begin();      
       while ((!found) && (spouse_to_family_links_iter != spouse_to_family_links.end()))  
         {  
           fam_id = (*spouse_to_family_links_iter)->getFamsXref();  
           fam_iter = _family_records.find(fam_id);  
           if (fam_iter != _family_records.end())  
             {  
               if ((*fam_iter).second->getChilXrefs().size() > 0)  
                 {  
                   found = true;  
                 }  
             }  
           spouse_to_family_links_iter++;  
         }  
     }  
   return found;  
 }  
   
 bool GEDCOMParser::LineageLinkageGedcom::hasSpouse(GEDCOMParser::IndividualRecord const * const individu) const  
 {  
   std::string fam_id;  
   std::string spouse_id;  
   FamilyRecords_t::const_iterator fam_iter;  
   IndividualRecords_t::const_iterator spouse_iter;  
   bool found = false;  
   
   if (individu != 0)  
     {  
       SpouseToFamilyLinks_t spouse_to_family_links = individu->getSpouseToFamilyLinks();  
       SpouseToFamilyLinks_t::const_iterator spouse_to_family_links_iter = spouse_to_family_links.begin();      
       while ((!found) && (spouse_to_family_links_iter != spouse_to_family_links.end()))  
         {  
           fam_id = (*spouse_to_family_links_iter)->getFamsXref();  
           fam_iter = _family_records.find(fam_id);  
           if (fam_iter != _family_records.end())  
             {  
               if (individu->getSex() == "M")  
                 {  
                   spouse_id = (*fam_iter).second->getWife();  
                 }  
               else  
                 {  
                   spouse_id = (*fam_iter).second->getHusb();  
                 }  
               if (spouse_id != "")  
                 {  
                   found = true;  
                 }  
             }  
           spouse_to_family_links_iter++;  
         }  
     }  
   return found;  
 }  
   
   
 bool GEDCOMParser::LineageLinkageGedcom::FamilyIsUsed(GEDCOMParser::FamilyRecord const * const family) const  
 {  
   bool res = false;  
   std::string family_id = family->getId();  
   GEDCOMParser::IndividualRecords_t::const_iterator individu_iter = _individual_records.begin();  
   do  
     {  
       GEDCOMParser::ChildToFamilyLinks_t const child_links = (*individu_iter).second->getChildToFamilyLinks();  
       GEDCOMParser::ChildToFamilyLinks_t::const_iterator child_link_iter = find_if(child_links.begin(), child_links.end(), GEDCOMParser::ChildToFamilyLink::IsEqualByFamcXref(family_id));  
       if (child_link_iter != child_links.end())  
         {  
           res = true;  
         }  
       if (res == false)  
         {  
           GEDCOMParser::SpouseToFamilyLinks_t spouse_links = (*individu_iter).second->getSpouseToFamilyLinks();  
           GEDCOMParser::SpouseToFamilyLinks_t::const_iterator spouse_link_iter = find_if(spouse_links.begin(), spouse_links.end(), GEDCOMParser::SpouseToFamilyLink::IsEqualByFamsXref(family_id));  
           if (spouse_link_iter != spouse_links.end())  
             {  
               res = true;  
             }  
         }  
       individu_iter++;  
     }  
   while ((res == false) && (individu_iter != _individual_records.end()));  
   return res;  
 }  
   
 GEDCOMParser::IndividualRecords_t GEDCOMParser::LineageLinkageGedcom::getRootIndividuals(void) const  
 {  
   GEDCOMParser::IndividualRecords_t children;  
   for (GEDCOMParser::IndividualRecords_t::const_iterator iter = _individual_records.begin();  iter != _individual_records.end() ; iter++)  
     {  
       if (hasChildren((*iter).second.getPtr()) == false)  
         {  
           children[(*iter).second->getId()] = (*iter).second;  
         }  
     }      
   return children;  
 }  
   
274  GEDCOMParser::LineageLinkageGedcom::~LineageLinkageGedcom(void)  GEDCOMParser::LineageLinkageGedcom::~LineageLinkageGedcom(void)
275  {  {
276    delete _id_generator;    delete _id_generator;

Legend:
Removed from v.1.13  
changed lines
  Added in v.1.14

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26