- Timestamp:
- 05/15/09 17:33:25 (3 years ago)
- Location:
- branches/turbo/avango-core
- Files:
-
- 1 deleted
- 7 edited
-
include/avango/Field.h (modified) (4 diffs)
-
include/avango/TimeSensor.h (modified) (1 diff)
-
src/avango/fields/Field.cpp (modified) (9 diffs)
-
src/avango/fields/tests/SConscript (modified) (1 diff)
-
src/avango/fields/tests/TestFieldCallbacks.cpp (deleted)
-
src/avango/interface/TimeSensor.cpp (modified) (2 diffs)
-
src/avango/interface/tests/TestTimeSensor.cpp (modified) (2 diffs)
-
src/avango/nodes/tests/TestFieldConnectionChangeInNotify.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/turbo/avango-core/include/avango/Field.h
r1 r161 65 65 public: 66 66 67 /**68 * Field event base class passed to functions attached to field signals.69 */70 67 class Event 71 68 { … … 96 93 const Field *mField; 97 94 }; 98 99 /**100 * Event class for field change events.101 */102 class ChangedEvent : public Event103 {104 friend class Field;105 106 public:107 108 /**109 * Was the field change triggered from network or locally?110 */111 bool getChangedFromNet() const { return mChangedFromNet; }112 113 /**114 * Returns the connected field which triggered this field change.115 * Returns 0 if the field was not changed by a connection.116 * \see FieldEvent::getField for notes about holding the field after117 * the callback has returned.118 */119 Field* getTriggeredFromField() const { return mTriggeredFromField; }120 121 protected:122 ChangedEvent(Field *field, bool changedFromNet, Field* triggeredFromField) :123 Event(field), mChangedFromNet(changedFromNet), mTriggeredFromField(triggeredFromField) {}124 125 private:126 bool mChangedFromNet;127 Field* mTriggeredFromField;128 };129 130 /**131 * Event class for field connect events.132 */133 class ConnectedEvent : public Event134 {135 friend class Field;136 137 public:138 139 /**140 * Get the field just connected to the originating field of the event.141 * \see FieldEvent::getField for notes about holding the field after142 * the callback has returned.143 */144 Field* getConnectedField() const { return mConnectedField; }145 146 protected:147 ConnectedEvent(Field *field, Field *connectedField) :148 Event(field), mConnectedField(connectedField) {}149 150 private:151 Field* mConnectedField;152 };153 154 /**155 * Event class for field disconnect events.156 */157 class DisconnectedEvent : public Event158 {159 friend class Field;160 161 public:162 163 /**164 * Get the fields just disconnected to the originating field of the event.165 * \see FieldEvent::getField for notes about holding a field after166 * the callback has returned.167 */168 std::vector<Field*> getDisconnectedFields() const { return mDisconnectedFields; }169 170 protected:171 DisconnectedEvent(Field *field, std::vector<Field*> disconnectedFields) :172 Event(field), mDisconnectedFields(disconnectedFields) {}173 174 private:175 std::vector<Field*> mDisconnectedFields;176 };177 178 179 typedef boost::signal<void (const ChangedEvent&)> ChangedSignal;180 typedef ChangedSignal::slot_type ChangedCallback;181 typedef boost::signals::connection ChangedCallbackHandle;182 183 typedef boost::signal<void (const ConnectedEvent&)> ConnectedSignal;184 typedef ConnectedSignal::slot_type ConnectedCallback;185 typedef boost::signals::connection ConnectedCallbackHandle;186 187 typedef boost::signal<void (const DisconnectedEvent&)> DisconnectedSignal;188 typedef DisconnectedSignal::slot_type DisconnectedCallback;189 typedef boost::signals::connection DisconnectedCallbackHandle;190 95 191 96 enum FieldChangeSource … … 371 276 372 277 /** 373 * Register callback invoked after a field change or field touch.374 * The callback must take exactly one parameter of ChangedEvent.375 */376 ChangedCallbackHandle addChangedCallback(const ChangedCallback& callback);377 378 /**379 * Remove previously registered field changed callback via its handle.380 */381 void removeChangedCallback(const ChangedCallbackHandle& handle);382 383 /**384 * Register callback invoked after a field has been connected to this field.385 * The callback must take exactly one parameter of ConnectedEvent.386 */387 ConnectedCallbackHandle addConnectedCallback(const ConnectedCallback& callback);388 389 /**390 * Remove previously registered field ConnectedCallback via its handle.391 */392 void removeConnectedCallback(const ConnectedCallbackHandle& handle);393 394 /**395 * Register callback invoked after a field has been disconnected from this field.396 * The callback must take exactly one parameter of DisconnectedEvent.397 */398 DisconnectedCallbackHandle addDisconnectedCallback(const DisconnectedCallback& callback);399 400 /**401 * Remove previously registered field DisconnectedCallback via its handle.402 */403 void removeDisconnectedCallback(const DisconnectedCallbackHandle& handle);404 405 /**406 278 * Create a new instance of same field type and same value. 407 279 * This type is not added to any container or event handler. … … 441 313 // disable copy construction 442 314 Field(const Field&); 443 444 void containerFieldChanged(const ChangedEvent& event);445 446 ChangedSignal mChangedSignal;447 ConnectedSignal mConnectedSignal;448 DisconnectedSignal mDisconnectedSignal;449 315 450 316 FieldPtrSet mAuditors; -
branches/turbo/avango-core/include/avango/TimeSensor.h
r1 r161 71 71 72 72 virtual void evaluate(); 73 74 private:75 76 void referenceTimeChanged(const av::SFDouble::ChangedEvent& event);77 78 73 }; 79 74 -
branches/turbo/avango-core/src/avango/fields/Field.cpp
r151 r161 182 182 183 183 // copy and reference auditors while in notify because the connection topology may change 184 185 184 FieldPtrVec auditors; 186 185 auditors.reserve(mAuditors.size()); … … 189 188 FieldPtrVec::const_iterator current; 190 189 FieldPtrVec::const_iterator past_of_end = auditors.end(); 191 192 // create references to field containers193 std::vector<Link<FieldContainer> > auditor_containers;194 auditor_containers.reserve(mAuditors.size());195 std::transform(auditors.begin(), auditors.end(), std::back_inserter(auditor_containers),196 boost::bind(&Field::getContainer, _1));197 198 // notify199 200 190 for (current = auditors.begin(); current != past_of_end; ++current) 201 191 { … … 344 334 if (notifyEnabled()) 345 335 { 346 mC hangedSignal(ChangedEvent(this, fromNet, triggeredFrom));336 mContainer->fieldChanged(*this, fromNet); 347 337 notify(triggeredFrom); 348 338 ContainerPool::notifyFieldHasChanged(this); … … 370 360 mConnectedFrom.push_back(std::make_pair(field, dependent)); 371 361 field->addAuditor(this); 372 mConnectedSignal(ConnectedEvent(this, field));373 362 374 363 ContainerPool::notifyConnect(this); … … 401 390 // we can notice disconnects this way 402 391 touch(); 403 404 mDisconnectedSignal(DisconnectedEvent(this, disconnected_fields));405 392 406 393 ContainerPool::notifyDisconnect(this); … … 453 440 touch(); 454 441 455 mDisconnectedSignal(DisconnectedEvent(this, std::vector<Field*>(1, field)));456 457 442 ContainerPool::notifyDisconnect(this); 458 443 } … … 505 490 506 491 void 507 av::Field::containerFieldChanged(const ChangedEvent& event)508 {509 AV_ASSERT(this == event.getField());510 mContainer->fieldChanged(*(event.getField()), event.getChangedFromNet());511 }512 513 void514 492 av::Field::bind(av::FieldContainer* container, const std::string& name, bool owned) 515 493 { … … 526 504 unsigned int index = container->addField(this, name); 527 505 setContainer(container, index, owned); 528 addChangedCallback(boost::bind(&Field::containerFieldChanged, this, _1));529 506 } 530 507 … … 708 685 } 709 686 710 av::Field::ChangedCallbackHandle711 av::Field::addChangedCallback(const ChangedCallback& callback)712 {713 return mChangedSignal.connect(callback);714 }715 716 void717 av::Field::removeChangedCallback(const ChangedCallbackHandle& handle)718 {719 handle.disconnect();720 }721 722 av::Field::ConnectedCallbackHandle723 av::Field::addConnectedCallback(const ConnectedCallback& callback)724 {725 return mConnectedSignal.connect(callback);726 }727 728 void729 av::Field::removeConnectedCallback(const ConnectedCallbackHandle& handle)730 {731 handle.disconnect();732 }733 734 av::Field::DisconnectedCallbackHandle735 av::Field::addDisconnectedCallback(const DisconnectedCallback& callback)736 {737 return mDisconnectedSignal.connect(callback);738 }739 740 void741 av::Field::removeDisconnectedCallback(const DisconnectedCallbackHandle& handle)742 {743 handle.disconnect();744 }745 746 687 void 747 688 av::Field::evaluateDependencies(void) -
branches/turbo/avango-core/src/avango/fields/tests/SConscript
r1 r161 42 42 tests += avango_test_env.Alias('test-core-field-fields', test_fields, "${SOURCE.abspath}") 43 43 44 test_field_callbacks = avango_test_env.Program('TestFieldCallbacks.cpp')45 tests += avango_test_env.Alias('test-core-field-callbacks', test_field_callbacks,46 "${SOURCE.abspath}")47 48 44 test_field_value_callbacks = avango_test_env.Program('TestFieldValueCallbacks.cpp') 49 45 tests += avango_test_env.Alias('test-core-field-value-callbacks', test_field_value_callbacks, -
branches/turbo/avango-core/src/avango/interface/TimeSensor.cpp
r153 r161 71 71 AV_FC_ADD_FIELD(Time, 0); 72 72 73 ReferenceTime.addChangedCallback(boost::bind(&av::TimeSensor::referenceTimeChanged, this, _1));74 73 alwaysEvaluate(true); 75 74 } … … 94 93 RealTime.touch(); 95 94 } 96 97 void98 av::TimeSensor::referenceTimeChanged(const av::SFDouble::ChangedEvent&)99 {100 Time.setValue(RealTime.getValue()-ReferenceTime.getValue());101 } -
branches/turbo/avango-core/src/avango/interface/tests/TestTimeSensor.cpp
r1 r161 40 40 namespace 41 41 { 42 double real_time = 0;43 44 void realTimeChanged(const av::SFDouble::ChangedEvent& event)45 {46 real_time = dynamic_cast<const av::SFDouble*>(event.getField())->getValue();47 AV_ASSERT(real_time);48 av::getRootLogger().info() << "real_time: " << real_time;49 }50 51 42 TEST(TimeSensor) 52 43 { 53 44 av::TimeSensor::initClass(); 54 45 av::Link<av::TimeSensor> time_sensor(new av::TimeSensor); 55 time_sensor->RealTime.addChangedCallback(&realTimeChanged);56 46 av::ApplicationInstance::get().evaluate(); 47 double real_time = time_sensor->RealTime.getValue(); 57 48 CHECK(real_time > 0); 58 49 double old_time = real_time; … … 63 54 #endif 64 55 av::ApplicationInstance::get().evaluate(); 56 real_time = time_sensor->RealTime.getValue(); 65 57 av::getRootLogger().info() << "real_time - old_time : " << real_time - old_time; 66 58 CHECK(old_time < real_time); -
branches/turbo/avango-core/src/avango/nodes/tests/TestFieldConnectionChangeInNotify.cpp
r155 r161 43 43 public: 44 44 45 MyObject(); 46 void valueChanged(const av::SFInt::ChangedEvent event); 45 MyObject() {} 46 MyObject(av::Field* field); 47 void fieldHasChanged(const av::Field& field); 47 48 49 private: 50 av::Field* mOtherField; 48 51 }; 49 52 … … 59 62 } 60 63 61 MyObject::MyObject() 64 MyObject::MyObject(av::Field* field) : 65 mOtherField(field) 62 66 { 63 Value.addChangedCallback(boost::bind(&MyObject::valueChanged, this, _1));64 67 } 65 68 66 void MyObject:: valueChanged(const av::SFInt::ChangedEvent event)69 void MyObject::fieldHasChanged(const av::Field& field) 67 70 { 68 if ( event.getTriggeredFromField() &&Value.getValue() == 1)71 if (Value.getValue() == 1) 69 72 { 70 73 AVANGO_LOG(logger,av::logging::INFO , "fieldHasChanged: disconnecting from source field"); 71 74 Value.enableNotify(false); 72 Value.disconnectFrom( event.getTriggeredFromField());75 Value.disconnectFrom(mOtherField); 73 76 Value.enableNotify(true); 74 77 } 75 if ( event.getTriggeredFromField() &&Value.getValue() == 3)78 if (Value.getValue() == 3) 76 79 { 77 80 AVANGO_LOG(logger,av::logging::INFO , "fieldHasChanged: disconnecting all fields from source field"); 78 81 Value.enableNotify(false); 79 event.getTriggeredFromField()->disconnectAuditors();82 mOtherField->disconnectAuditors(); 80 83 Value.enableNotify(true); 81 84 } … … 87 90 88 91 av::Link<av::IntObject> src(new av::IntObject); 89 av::Link<MyObject> dst1(new MyObject );92 av::Link<MyObject> dst1(new MyObject(&src->Value)); 90 93 av::Link<av::IntObject> dst2(new av::IntObject); 91 94
Note: See TracChangeset
for help on using the changeset viewer.
