The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Gtk2::Ex::TreeModel::ImplBits - miscellaneous helpers for TreeModel implementations

SYNOPSIS

 use Gtk2::Ex::TreeModel::ImplBits;

FUNCTIONS

Gtk2::Ex::TreeModel::ImplBits::random_stamp ($model)

Set $model->{'stamp'} to a randomly chosen stamp (an integer) between 1 and 2**31-1 inclusive. If $model->{'stamp'} is an existing stamp value then that's excluded, ensuring a new value.

This is designed to pick a stamp in the INIT_INSTANCE of a TreeModel object,

    use Gtk2::Ex::TreeModel::ImplBits;

    sub INIT_INSTANCE {
      my ($self) = @_;
      Gtk2::Ex::TreeModel::ImplBits::random_stamp ($self);
      # ...
    }

and also later to change stamp to deliberately invalidate iters an application might still have. This can be when the last row is deleted, so no iter can possibly be valid, or when the model is not iters-persist and a delete, insert or reorder has moved memory etc rendering existing iter pointers or references invalid.

Zero is not used for a stamp because it's what ListStore and TreeStore remove set to invalidate an iter when no next row. Negatives are not used because Perl-Gtk 1.220 on a system with 64-bit IV and 32-bit gint will sometimes zero extend (instead of sign extend), giving back a positive value. In the future though it might be possible to use negatives, or a full 64-bit gint on a 64-bit system.

Gtk2::TreeStore uses a similar randomly chosen stamp. With a random stamp there's a small chance an iter misuse will be undetected because stamps happen to match. But this will be extremely rare, and randomness has the considerable advantage that it won't be systematically tricked by something semi-deterministic like uninitialized or re-used memory.

EXPORTS

Nothing is exported by default, but random_stamp can be requested in usual Exporter style,

    use Gtk2::Ex::TreeModel::ImplBits 'random_stamp';

    sub remove {
      my ($self, $iter) = @_;
      # ...
      if (have_become_empty) {
        # no iter can be valid, new stamp to enforce that
        random_stamp ($self);
      }
    }

There's no :all tag since this module is meant as a grab-bag of functions and to import yet unknown names would be asking for trouble!

SEE ALSO

Gtk2::TreeModel, Gtk2::Ex::WidgetBits, Exporter

HOME PAGE

http://user42.tuxfamily.org/gtk2-ex-widgetbits/index.html

LICENSE

Copyright 2009, 2010, 2011, 2012 Kevin Ryde

Gtk2-Ex-WidgetBits is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.

Gtk2-Ex-WidgetBits is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with Gtk2-Ex-WidgetBits. If not, see http://www.gnu.org/licenses/.