12.3. Design

To support our requirements, change signals are actually implemented as follows:

sigc::signal<void, k3d::ihint*> bitmap_changed_signal;

With corresponding signal handlers:

void on_bitmap_changed(k3d::ihint* Hint)
{
  if(dynamic_cast<k3d::hint::bitmap_pixels_changed*>(Hint))
  {
    // We know that only pixel values changed,
    // so we can perform efficient computation here.
  }
  else
  {
    // We didn't get a hint, or we got a hint that we don't
    // recognize, so we don't know what changed and have to
    // start-over from scratch, "assuming the worst".
  }
}

Now, whenever emitting a change signal, the emitter can provide a hint object:

m_output_property.changed_signal().emit(k3d::hint::bitmap_pixels_changed::instance());

or not:

m_output_property.changed_signal().emit(0);