Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/libs/signals/src/named_slot_map.cpp @ 29

Last change on this file since 29 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

File size: 3.3 KB
Line 
1// Boost.Signals library
2
3// Copyright Douglas Gregor 2001-2004. Use, modification and
4// distribution is subject to the Boost Software License, Version
5// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt)
7
8// For more information, see http://www.boost.org
9
10#define BOOST_SIGNALS_SOURCE
11
12#include <boost/signals/detail/named_slot_map.hpp>
13#include <cassert>
14#include <map>
15#include <list>
16#include <typeinfo>
17
18namespace boost { namespace BOOST_SIGNALS_NAMESPACE { namespace detail {
19
20typedef std::list<connection_slot_pair> group_list;
21typedef group_list::iterator slot_pair_iterator;
22typedef std::map<stored_group, group_list, compare_type> slot_container_type;
23typedef slot_container_type::iterator group_iterator;
24typedef slot_container_type::const_iterator const_group_iterator;
25
26
27#if BOOST_WORKAROUND(_MSC_VER, <= 1400)
28void named_slot_map_iterator::decrement() { assert(false); }
29void named_slot_map_iterator::advance(difference_type) { assert(false); }
30#endif
31
32named_slot_map::named_slot_map(const compare_type& compare) : groups(compare)
33{
34  clear();
35}
36
37void named_slot_map::clear()
38{
39  groups.clear();
40  groups[stored_group(stored_group::sk_front)];
41  groups[stored_group(stored_group::sk_back)];
42  back = groups.end();
43  --back;
44}
45
46named_slot_map::iterator named_slot_map::begin()
47{
48  return named_slot_map::iterator(groups.begin(), groups.end());
49}
50
51named_slot_map::iterator named_slot_map::end()
52{
53  return named_slot_map::iterator(groups.end(), groups.end());
54}
55
56named_slot_map::iterator
57named_slot_map::insert(const stored_group& name, const connection& con,
58                       const any& slot, connect_position at)
59{
60  group_iterator group;
61  if (name.empty()) {
62    switch (at) {
63    case at_front: group = groups.begin(); break;
64    case at_back: group = back; break;
65    }
66  } else {
67    group = groups.find(name);
68    if (group == groups.end()) {
69      slot_container_type::value_type v(name, group_list());
70      group = groups.insert(v).first;
71    }
72  }
73  iterator it;
74  it.group = group;
75  it.last_group = groups.end();
76
77  switch (at) {
78  case at_back:
79    group->second.push_back(connection_slot_pair(con, slot));
80    it.slot_ = group->second.end();
81    it.slot_assigned = true;
82    --(it.slot_);
83    break;
84
85  case at_front:
86    group->second.push_front(connection_slot_pair(con, slot));
87    it.slot_ = group->second.begin();
88    it.slot_assigned = true;
89    break;
90  }
91  return it;
92}
93
94void named_slot_map::disconnect(const stored_group& name)
95{
96  group_iterator group = groups.find(name);
97  if (group != groups.end()) {
98    slot_pair_iterator i = group->second.begin();
99    while (i != group->second.end()) {
100      slot_pair_iterator next = i;
101      ++next;
102      i->first.disconnect();
103      i = next;
104    }
105    groups.erase(group);
106  }
107}
108
109void named_slot_map::erase(iterator pos)
110{
111  // Erase the slot
112  pos.slot_->first.disconnect();
113  pos.group->second.erase(pos.slot_);
114}
115
116void named_slot_map::remove_disconnected_slots()
117{
118  // Remove any disconnected slots
119  group_iterator g = groups.begin();
120  while (g != groups.end()) {
121    slot_pair_iterator s = g->second.begin();
122    while (s != g->second.end()) {
123      if (s->first.connected()) ++s;
124      else g->second.erase(s++);
125    }
126
127    // Clear out empty groups
128    if (empty(g)) groups.erase(g++);
129    else ++g;
130  }
131}
132
133
134} } }
Note: See TracBrowser for help on using the repository browser.