Choreonoid  1.5
SignalTemplate.h
Go to the documentation of this file.
1 
7 #define CNOID_SIGNAL_FUNCTION_N_HEADER CNOID_SIGNAL_CONCAT(<boost/function/function,CNOID_SIGNAL_NUM_ARGS.hpp>)
8 #include CNOID_SIGNAL_FUNCTION_N_HEADER
9 
10 #if CNOID_SIGNAL_NUM_ARGS == 0
11 # define CNOID_SIGNAL_COMMA_IF_NONZERO_ARGS
12 #else
13 # define CNOID_SIGNAL_COMMA_IF_NONZERO_ARGS ,
14 #endif
15 
16 #define CNOID_SIGNAL_SIGNAL CNOID_SIGNAL_CONCAT(Signal,CNOID_SIGNAL_NUM_ARGS)
17 #define CNOID_SIGNAL_FUNCTION CNOID_SIGNAL_CONCAT(boost::function,CNOID_SIGNAL_NUM_ARGS)
18 #define CNOID_SIGNAL_SLOT_HOLDER CNOID_SIGNAL_CONCAT(SlotHolder,CNOID_SIGNAL_NUM_ARGS)
19 #define CNOID_SIGNAL_ARGSET CNOID_SIGNAL_CONCAT(ArgSet,CNOID_SIGNAL_NUM_ARGS)
20 
21 
22 namespace cnoid {
23 
24 template<
25  typename R,
28  typename Combiner = signal_private::last_value<R>
29  >
31 
32 
33 namespace signal_private {
34 
35 template<
36  typename R,
39  typename Combiner
40  >
42 {
43  typedef CNOID_SIGNAL_FUNCTION<R CNOID_SIGNAL_COMMA_IF_NONZERO_ARGS CNOID_SIGNAL_TEMPLATE_ARGS> FuncType;
44  FuncType func;
45 
48  SlotHolderPtr next;
49  SlotHolder* prev;
51  SignalType* owner;
52 
53 public:
54  typedef R result_type;
55 
56  CNOID_SIGNAL_SLOT_HOLDER(const FuncType& func)
57  : func(func), prev(0), owner(0) {
58  }
59 
60  virtual void disconnect() {
61  if(owner) owner->remove(this);
62  }
63 
64  virtual bool connected() const {
65  return owner != 0;
66  }
67 
68  virtual void changeOrder(int orderId) {
69  if(owner) owner->changeOrder(this, orderId);
70  }
71 };
72 
73 } // namespace signal_private
74 
75 
76 template<
77  typename R,
80  typename Combiner
81  >
83 {
85 
88 
89  template<typename SlotHolderType>
90  R call(SlotHolderType* slot) {
91  return slot->func(CNOID_SIGNAL_ARGS);
92  }
93 };
94 
95 
96 template<
97  typename R,
100  typename Combiner
101  >
103 {
104 public:
105  typedef R result_type;
106  typedef CNOID_SIGNAL_FUNCTION<R CNOID_SIGNAL_COMMA_IF_NONZERO_ARGS CNOID_SIGNAL_TEMPLATE_ARGS> slot_function_type;
107  typedef slot_function_type slot_type;
108  typedef slot_function_type Slot;
109 
110  typedef Combiner combiner_type;
111  typedef struct { } group_type;
112  typedef struct { } group_compare_type;
113 
114 private:
119 
120  SlotHolderPtr firstSlot;
121  SlotHolderType* lastSlot;
122 
124  CNOID_SIGNAL_SIGNAL& operator=(const CNOID_SIGNAL_SIGNAL& rhs);
125 
126 public:
127  CNOID_SIGNAL_SIGNAL() : lastSlot(0) { }
128 
130  disconnect_all_slots();
131  }
132 
133  Connection connect(const slot_function_type& func){
134 
135  SlotHolderType* slot = new SlotHolderType(func);
136 
137  if(!firstSlot){
138  firstSlot = slot;
139  lastSlot = slot;
140  } else {
141  lastSlot->next = slot;
142  slot->prev = lastSlot;
143  lastSlot = slot;
144  }
145  slot->owner = this;
146 
147  return Connection(slot);
148  }
149 
150  void remove(SlotHolderPtr slot){
151  if(slot->owner == this){
152  SlotHolderType* next = slot->next;
153  SlotHolderType* prev = slot->prev;
154  if(next){
155  next->prev = prev;
156  } else {
157  lastSlot = prev;
158  }
159  if(prev){
160  prev->next = next;
161  } else {
162  firstSlot = next;
163  }
164  slot->prev = 0;
165  slot->next = 0;
166  slot->owner = 0;
167  }
168  }
169 
170  void changeOrder(SlotHolderPtr slot, int orderId){
171  if(slot->owner == this){
172  if(orderId == Connection::FIRST){
173  if(firstSlot != slot){
174  remove(slot);
175  slot->owner = this;
176  if(firstSlot){
177  slot->next = firstSlot;
178  slot->next->prev = slot;
179  }
180  firstSlot = slot;
181  }
182  } else if(orderId == Connection::LAST){
183  if(lastSlot != slot){
184  remove(slot);
185  slot->owner = this;
186  if(lastSlot){
187  lastSlot->next = slot;
188  slot->prev = lastSlot;
189  } else {
190  firstSlot = slot;
191  }
192  lastSlot = slot;
193  }
194  }
195  }
196  }
197 
199  while(firstSlot){
200  remove(firstSlot);
201  }
202  }
203 
204  bool empty() const {
205  return (firstSlot == 0);
206  }
207 
209 
210 #if CNOID_SIGNAL_NUM_ARGS == 0
211  ArgSetType args;
212 #else
213  ArgSetType args(CNOID_SIGNAL_ARGS);
214 #endif
215 
216  Combiner combiner;
217  return combiner(IteratorType(firstSlot, args), IteratorType(0, args));
218  }
219 };
220 
221 } // namespace cnoid
222 
223 
224 #undef CNOID_SIGNAL_FUNCTION_N_HEADER
225 #undef CNOID_SIGNAL_COMMA_IF_NONZERO_ARGS
226 #undef CNOID_SIGNAL_SIGNAL
227 #undef CNOID_SIGNAL_FUNCTION
228 #undef CNOID_SIGNAL_SLOT_HOLDER
229 #undef CNOID_SIGNAL_ARGSET
~CNOID_SIGNAL_SIGNAL()
Definition: SignalTemplate.h:129
CNOID_SIGNAL_SIGNAL()
Definition: SignalTemplate.h:127
void remove(SlotHolderPtr slot)
Definition: SignalTemplate.h:150
Definition: SignalTemplate.h:111
bool empty() const
Definition: SignalTemplate.h:204
R result_type
Definition: SignalTemplate.h:105
Definition: Signal.h:146
CNOID_SIGNAL_SLOT_HOLDER SlotHolder
Definition: SignalTemplate.h:46
#define CNOID_SIGNAL_TEMPLATE_PARMS
Definition: Signal.h:238
CNOID_SIGNAL_FUNCTION< R CNOID_SIGNAL_COMMA_IF_NONZERO_ARGS CNOID_SIGNAL_TEMPLATE_ARGS > slot_function_type
Definition: SignalTemplate.h:106
#define CNOID_SIGNAL_SIGNAL
Definition: SignalTemplate.h:16
CNOID_SIGNAL_SIGNAL< R, CNOID_SIGNAL_TEMPLATE_ARGS CNOID_SIGNAL_COMMA_IF_NONZERO_ARGS Combiner > SignalType
Definition: SignalTemplate.h:50
CNOID_SIGNAL_FUNCTION< R CNOID_SIGNAL_COMMA_IF_NONZERO_ARGS CNOID_SIGNAL_TEMPLATE_ARGS > FuncType
Definition: SignalTemplate.h:43
virtual bool connected() const
Definition: SignalTemplate.h:64
result_type operator()(CNOID_SIGNAL_PARMS)
Definition: SignalTemplate.h:208
void changeOrder(SlotHolderPtr slot, int orderId)
Definition: SignalTemplate.h:170
#define CNOID_SIGNAL_ARGS_AS_MEMBERS
Definition: Signal.h:242
#define CNOID_SIGNAL_COMMA_IF_NONZERO_ARGS
Definition: SignalTemplate.h:11
#define CNOID_SIGNAL_COPY_PARMS
Definition: Signal.h:243
slot_function_type Slot
Definition: SignalTemplate.h:108
CNOID_SIGNAL_SLOT_HOLDER(const FuncType &func)
Definition: SignalTemplate.h:56
#define CNOID_SIGNAL_PARMS
Definition: Signal.h:240
#define CNOID_SIGNAL_ARGS
Definition: Signal.h:241
virtual void disconnect()
Definition: SignalTemplate.h:60
void disconnect_all_slots()
Definition: SignalTemplate.h:198
Defines the minimum processing for performing pasing file for STL.
Definition: AbstractSceneLoader.h:9
Definition: Signal.h:107
FuncType func
Definition: SignalTemplate.h:44
R result_type
Definition: SignalTemplate.h:54
Combiner combiner_type
Definition: SignalTemplate.h:110
#define CNOID_SIGNAL_INIT_ARGS
Definition: Signal.h:244
Definition: SignalTemplate.h:82
slot_function_type slot_type
Definition: SignalTemplate.h:107
Connection connect(const slot_function_type &func)
Definition: SignalTemplate.h:133
Definition: Signal.h:146
SlotHolderPtr next
Definition: SignalTemplate.h:48
Definition: SignalTemplate.h:30
SignalType * owner
Definition: SignalTemplate.h:51
Definition: SignalTemplate.h:112
#define CNOID_SIGNAL_ARGSET
Definition: SignalTemplate.h:19
SlotHolder * prev
Definition: SignalTemplate.h:49
ref_ptr< SlotHolder > SlotHolderPtr
Definition: SignalTemplate.h:47
virtual void changeOrder(int orderId)
Definition: SignalTemplate.h:68