-
Notifications
You must be signed in to change notification settings - Fork 1
/
Ch13_Message.h
198 lines (171 loc) · 4.49 KB
/
Ch13_Message.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
// C++ Primer 4th Edition Chapter 13 Exercise Section 13.4 Exercise 13.16-19
/*
// Usage:
#include "Ch13_Message.h"
int main()
{
Message msg1("new message !");
Folder fldr1;
msg1.save(fldr1) ;
return 0;
}
*/
#include <iostream>
#include <string>
#include <set>
#ifndef MESSAGE_H
#define MESSAGE_H
class Message;
class Folder
{
public:
Folder() {};
~Folder();
Folder(const Folder& other);
Folder& operator=(const Folder& other);
// add/remove specified Message from this Folder
void save(Message&);
void remove(Message&);
// add/remove this Folder from specified Message
void addMsg(Message*);
void remMsg(Message*);
protected:
private:
// Data:
std::set<Message*> message;
// Utility Functions:
void put_Fldr_in_Messages(const std::set<Message*>& rhs);
void remove_Fldr_from_Messages();
};
class Message
{
public:
// folders is initialized to the empty set automatically
Message(const std::string &str = ""):
contents(str) { }
// copy control: we must manage pointers to this Message
// from the Folders pointed to by folders
~Message();// virtual ~Message();
Message(const Message& other);
Message& operator=(const Message& other);
// add/remove this Message from specified Folder's set of messages
void save(Folder&);
void remove(Folder&);
// add/remove specified Folder from this Message
void addFldr(Folder*);
void remFldr(Folder*);
protected:
private:
// Data:
std::string contents;
std::set<Folder*> folders;
// Utility Functions:
void put_Msg_in_Folders(const std::set<Folder*>& rhs);
void remove_Msg_from_Folders();
};
Folder::~Folder()
{
//dtor
remove_Fldr_from_Messages();
}
Folder::Folder(const Folder& other):
message(other.message)
{
//copy ctor
put_Fldr_in_Messages(other.message);
}
Folder& Folder::operator=(const Folder &rhs)
{
if (this == &rhs) return *this;
remove_Fldr_from_Messages();
message = rhs.message;
put_Fldr_in_Messages(rhs.message);
return *this;
}
void Folder::put_Fldr_in_Messages(const std::set<Message*> &rhs)
{
for( std::set<Message*>::const_iterator beg = rhs.begin();
beg != rhs.end(); ++beg )
(*beg)->addFldr(this);
}
void Folder::remove_Fldr_from_Messages()
{
for( std::set<Message*>::const_iterator beg = message.begin();
beg != message.end();++beg )
(*beg)->remFldr(this);
}
void Folder::save(Message& msg)
{
addMsg(&msg);
msg.addFldr(this);
}
void Folder::remove(Message& msg)
{
remMsg(&msg);
msg.remFldr(this);
}
void Folder::addMsg(Message* msg)
{
message.insert(msg);
}
void Folder::remMsg(Message* msg)
{
message.erase(msg);
}
Message::~Message()
{
//dtor
remove_Msg_from_Folders();
}
Message::Message(const Message& other):
contents(other.contents), folders(other.folders)
{
//copy ctor
// add this Message to each Folder that points to other
put_Msg_in_Folders(folders);
}
Message& Message::operator=(const Message& rhs)
{
if (this == &rhs) return *this; // handle self assignment
//assignment operator
remove_Msg_from_Folders(); // update existing Folders
contents = rhs.contents; // copy contents from rhs
folders = rhs.folders; // copy Folder pointers from rhs
// add this Message to each Folder in rhs
put_Msg_in_Folders( rhs.folders );
return *this;
}
// add this Message to Folders that point to rhs
void Message::put_Msg_in_Folders(const std::set<Folder*>& rhs)
{
for( std::set<Folder *>::const_iterator beg = rhs.begin();
beg != rhs.end(); ++beg )
(*beg)->addMsg(this);
}
// remove this Message from corresponding Folders
void Message::remove_Msg_from_Folders()
{
// remove this message from corresponding folders
for( std::set<Folder*>::const_iterator beg = folders.begin ();
beg != folders.end (); ++beg )
(*beg)->remMsg(this); // *beg points to a Folder
}
void Message::save(Folder& fldr)
{
addFldr( &fldr );
fldr.addMsg( this );
}
void Message::remove(Folder& fldr)
{
remFldr( &fldr );
fldr.remMsg( this );
}
void Message::addFldr(Folder* fldr)
{
folders.insert( fldr );
}
void Message::remFldr(Folder* fldr)
{
folders.erase( fldr );
}
#endif // MESSAGE_H