Luke Meyers wrote:
I'll take a crack at revising this code, will post again if I come up
with something worth showing.
Okay, here's what I came up with. Seems to do what you described.
#include <vector>
#include <string>
#include <iostream>
class message {
std::string m_id_recipient;
int m_payload;
int m_count;
public:
message (std::string const& id_recipient,
int payload,
int count)
: m_id_recipient (id_recipient)
, m_payload(payload)
, m_count (count)
{ }
std::string get_recipient_id() const
{ return m_id_recipient; }
int get_payload() const
{ return m_payload; }
int get_count() const
{ return m_count; }
};
class foo {
typedef std::vector<message> msg_vec;
std::string name_;
msg_vec messages_;
public:
foo(std::string name)
: name_(name)
{ }
void add_msg(message& msg)
{ messages_.push_back(msg); }
std::string get_foo_str() const
{ return name_; }
typedef msg_vec::const_iterator const_iterator;
const_iterator begin() const {
return messages_.begin();
}
const_iterator end() const {
return messages_.end();
}
};
// bar removed (unused)
class manager {
typedef std::vector<foo> FOO_VEC;
FOO_VEC foos;
public:
void add_foo(foo const& f)
{
foos.push_back(f);
}
void add_foo_msg(message msg)
{
FOO_VEC::iterator end = foos.end();
for (FOO_VEC::iterator it = foos.begin(); it != end; ++it ) {
std::string recipient = msg.get_recipient_id();
if ( recipient == it->get_foo_str() )
{
it->add_msg(msg);
break;
}
}
}
void do_foo_search( unsigned int seg_id )
{
FOO_VEC::iterator end = foos.end();
for (FOO_VEC::const_iterator i = foos.begin(); i != end; ++i ) {
foo::const_iterator end = i->end();
std::vector<int> payloads;
for(foo::const_iterator j = i->begin(); j != end; ++j) {
if(j->get_count() == seg_id) payloads.push_back(j->get_payload());
}
if (!payloads.empty()) do_a_special_thing(payloads);
}
}
void do_a_special_thing(std::vector<int> payloads) {
std::cout << "Here's something special: ";
std::vector<int>::const_iterator end = payloads.end();
for(std::vector<int>::const_iterator it = payloads.begin(); it !=
end; ++it) {
std::cout << "0x" << std::hex << *it << " ";
}
std::cout << "\n";
}
};
int main()
{
manager mgr;
mgr.add_foo(foo("foo1"));
mgr.add_foo(foo("foo2"));
mgr.add_foo_msg( message("foo1", 0x4000, 1)); // i
mgr.add_foo_msg( message("foo1", 0x1000, 5));
mgr.add_foo_msg( message("foo2", 0x2000, 1)); // ii
mgr.add_foo_msg( message("foo3", 0x3000, 2));
mgr.do_foo_search(1);
}
HTH,
Luke