1 /*
2  * Copyright (C) 2009 Codership Oy <info@codership.com>
3  */
4 
5 #ifndef GCOMM_GMCAST_LINK_HPP
6 #define GCOMM_GMCAST_LINK_HPP
7 
8 #include "gcomm/uuid.hpp"
9 
10 #include <set>
11 #include <string>
12 
13 namespace gcomm
14 {
15     namespace gmcast
16     {
17         class Link;
18         class LinkMapCmp;
19         class LinkMap;
20         std::ostream& operator<<(std::ostream& os, const LinkMap&);
21     }
22 }
23 
24 class gcomm::gmcast::Link
25 {
26 public:
Link(const gcomm::UUID & uuid,const std::string & addr,const std::string & mcast_addr)27     Link(const gcomm::UUID& uuid,
28          const std::string& addr,
29          const std::string& mcast_addr) :
30         uuid_      (uuid),
31         addr_      (addr),
32         mcast_addr_(mcast_addr)
33     { }
34 
operator ==(const Link & cmp) const35     bool operator==(const Link& cmp) const
36     { return (uuid_ == cmp.uuid_ && addr_ == cmp.addr_); }
37 
operator <(const Link & cmp) const38     bool operator<(const Link& cmp) const
39     {
40         return (uuid_ < cmp.uuid_ ||
41                 (uuid_ == cmp.uuid_ && addr_ < cmp.addr_));
42 
43     }
44 
uuid() const45     const gcomm::UUID& uuid() const { return uuid_; }
addr() const46     const std::string& addr() const { return addr_; }
mcast_addr() const47     const std::string& mcast_addr() const { return mcast_addr_; }
48 private:
49     UUID uuid_;
50     std::string addr_;
51     std::string mcast_addr_;
52 };
53 
54 
55 
56 class gcomm::gmcast::LinkMap
57 {
58     typedef std::set<Link> MType;
59 public:
LinkMap()60     LinkMap() : link_map_() { }
61     typedef MType::iterator iterator;
62     typedef MType::const_iterator const_iterator;
63     typedef MType::value_type value_type;
64 
insert(const Link & i)65     std::pair<iterator, bool> insert(const Link& i)
66     { return link_map_.insert(i); }
67 
begin()68     iterator begin() { return link_map_.begin(); }
begin() const69     const_iterator begin() const { return link_map_.begin(); }
end()70     iterator end() { return link_map_.end(); }
end() const71     const_iterator end() const { return link_map_.end(); }
find(const value_type & vt) const72     const_iterator find(const value_type& vt) const { return link_map_.find(vt); }
size() const73     size_t size() const { return link_map_.size(); }
key(const_iterator i)74     static const UUID& key(const_iterator i) { return i->uuid(); }
value(const_iterator i)75     static const Link& value(const_iterator i) { return *i; }
key(const value_type & vt)76     static const UUID& key(const value_type& vt) { return vt.uuid(); }
value(const value_type & vt)77     static const Link& value(const value_type& vt) { return vt; }
operator ==(const LinkMap & cmp) const78     bool operator==(const LinkMap& cmp) const
79     { return (link_map_ == cmp.link_map_); }
80 private:
81     MType link_map_;
82 };
83 
operator <<(std::ostream & os,const LinkMap & lm)84 inline std::ostream& gcomm::gmcast::operator<<(std::ostream& os, const LinkMap& lm)
85 {
86     for (LinkMap::const_iterator i = lm.begin(); i != lm.end();
87          ++i)
88     {
89         os << "\n(" << LinkMap::key(i) << ","
90            << LinkMap::value(i).addr() << ")";
91     }
92     return (os << "\n");
93 }
94 
95 
96 #endif // GCOMM_GMCAST_LINK_HPP
97