Folder.cpp
上传用户:qdkongtiao
上传日期:2022-06-29
资源大小:356k
文件大小:3k
源码类别:

书籍源码

开发平台:

Visual C++

  1. #include "Folder.h"
  2. #include <iostream>
  3. using std::cerr; using std::endl;
  4. using std::set; using std::string; using std::vector;
  5. Message::Message(const Message &m): 
  6.     contents(m.contents), folders(m.folders) 
  7. {
  8.     // add this Message to each Folder that points to m
  9.     put_Msg_in_Folders(folders);  
  10. }
  11. Message& Message::operator=(const Message &rhs)
  12. {
  13.     if (&rhs != this) {
  14.         remove_Msg_from_Folders(); // update existing Folders
  15.         contents = rhs.contents;   // copy contents from rhs
  16.         folders = rhs.folders;     // copy Folder pointers from rhs
  17.         // add this Message to each Folder in rhs 
  18.         put_Msg_in_Folders(rhs.folders); 
  19.     }
  20.     return *this;
  21. }
  22. Message::~Message()
  23. {
  24.     remove_Msg_from_Folders();
  25. }
  26. // add this Message to Folders that point to rhs
  27. void Message::put_Msg_in_Folders(const set<Folder*> &rhs)
  28. {
  29.     for(std::set<Folder*>::const_iterator beg = rhs.begin(); 
  30.                                      beg != rhs.end(); ++beg)
  31.         (*beg)->addMsg(this);  // *beg points to a Folder
  32. }
  33. // remove this Message from corresponding Folders 
  34. void Message::remove_Msg_from_Folders()
  35. {
  36.     // remove this message from corresponding folders
  37.     for(std::set<Folder*>::const_iterator beg =
  38.           folders.begin(); beg != folders.end(); ++beg)
  39.         (*beg)->remMsg(this);  // *beg points to a Folder
  40. }
  41. void Folder::copy_msgs(const set<Message*> &m)
  42. {
  43.     for (Msg_iter beg = m.begin(); beg != m.end(); ++beg)
  44.         (*beg)->save(*this);   // add this Folder to each Message
  45. }
  46. Folder::Folder(const Folder &f)
  47. {
  48.     copy_msgs(f.msgs);  // add this Folder to each Message in f.msgs
  49. }
  50. Folder& Folder::operator=(const Folder &f)
  51. {
  52.     if (&f != this) {
  53.         empty_msgs();  // remove this folder from each Message in msgs
  54.         copy_msgs(f.msgs); // add this folder to each Message in msgs
  55.     }
  56.     return *this;
  57. }
  58. Folder::~Folder()
  59. {
  60.     empty_msgs();
  61. }
  62. void Folder::empty_msgs()
  63. {
  64.     Msg_iter it = msgs.begin(); 
  65.     while (it != msgs.end()) {
  66.         Msg_iter next = it;
  67.         ++next;                // remember next element in msgs
  68.         (*it)->remove(*this);
  69.         it = next;
  70.     }
  71. }
  72. void Message::save(Folder &f)
  73. {
  74.     // add f to Folders and this Message to f's list of Messages
  75.     folders.insert(&f);  
  76.     f.addMsg(this);
  77. }
  78. void Message::remove(Folder &f)
  79. {
  80.     // remove f from Folders and this Message from f's list of Messages
  81.     folders.erase(&f);
  82.     f.remMsg(this);
  83. }
  84. void Folder::save(Message &m)
  85. {
  86.     // add m and add this folder to m's set of Folders
  87.     msgs.insert(&m);
  88.     m.addFldr(this);
  89. }
  90. void Folder::remove(Message &m)
  91. {
  92.     // erase m from msgs and remove this folder from m
  93.     msgs.erase(&m);
  94.     m.remFldr(this);
  95. }
  96. vector<Folder*> Message::get_folders()
  97. {
  98.     return vector<Folder*>(folders.begin(), folders.end());
  99. }
  100. vector<Message*> Folder::messages()
  101. {
  102.     return vector<Message*>(msgs.begin(), msgs.end());
  103. }
  104. void Folder::debug_print()
  105. {
  106.     cerr << "Folder contains " << msgs.size() << " messages" << endl;
  107.     int ctr = 1;
  108.     for (Msg_iter beg = msgs.begin(); beg != msgs.end(); ++beg)
  109.         cerr << "Message " << ctr++ << ":nt" 
  110.              << (*beg)->print_message() << endl;
  111. }
  112. void Message::debug_print()
  113. {
  114.     cerr << "Message:nt" << contents << endl;
  115.     cerr << "Appears in " << folders.size() << " Folders" << endl;
  116. }