Using Collection Notification

The following example demonstrates the use of collection event data for a sequence of IString objects. IString is the main string handling class provided by the IBM Open Class Library.

#include <iobservr.hpp>
#include <inotifev.hpp>
#include <iseq.h>

typedef IVSequence <long> Notifier;

#include <iostream.h>

template <class Notifier>
class Observer : public IObserver {
public:
    Observer (Notifier* notifier)
        : ivNotifier (notifier)
    {
        handleNotificationsFor (*ivNotifier);
    }

    ~Observer ()
    {
        if (ivNotifier != 0) // critical !
            stopHandlingNotificationsFor (*ivNotifier);
    }

    IObserver& dispatchNotificationEvent(
        INotificationEvent const& event)
    {
        if (event.notificationId() == IStandardNotifier::deleteId) {
            cout << "IStandardNotifier::deleteId received" << endl;
        }
    }
    else if (event.notificationId() == IVCollection::removeId) {
        cout << "IVCollection::removeId received" << endl;
        cout << "Old Data: ";
        cout << ((IASequence<long>)(event.notifier()));

        //
        //  IASequence can be either replaced by IACollection
        //  or IAOrderedCollection:
        //      cout << ((IACollection<long>)(event.notifier()));
        //

        cout.elementAt(
            ((IVCollectionEventData<long>*)
                ((char*)event.eventData()))->cursor());
        cout << endl;
    }
    else if (event.notificationId() == IVCollection::replaceId) {
        cout << "IVCollection::replaceId received" << endl;
        cout << "Replace at position: ";
        cout << ((IASequence<long>)(event.notifier()));

        //
        //  IASequence can be replaced by IAOrderedCollection
        //      cout << ((IAOrderedCollection<long>)(event.notifier()));
        //

        cout.positionAt(
            ((IVCollectionEventData<long>*)
                ((char*)event.eventData()))->cursor());
        cout << endl;
        cout << "Old Data: "
        cout << ((IASequence<long>)(event.notifier()));

        //
        //  IASequence can be either replaced by IACollection
        //  or IAOrderedCollection:
        //      cout << ((IACollection<long>)(event.notifier()));
        //

        cout.elementAt(
            ((IVCollectionEventData<long>*)
                ((char*)event.eventData()))->cursor());
        cout << endl;
        cout << "New Data: ";
        cout << *(((IVCollectionEventData<long>*)
            ((char*)event.eventData()))->element());
        cout << endl;
    }
    else if (event.notificationId() == IVCollection::addId)
    {
        cout << "IVCollection::addId received" << endl;
        cout << "Add at position: ";
        cout << ((IAOrderedCollection<long>)(event.notifier()));
        cout.positionAt(((IVCollectionEventData<long>*)
            ((char*)event.eventData()))->cursor());
        cout << endl;
        cout << "New Data: ";
        cout << ((IASequence<long>)(event.notifier()));

        //
        //  IASequence can be either replaced by IACollection
        //  or IAOrderedCollection:
        //      cout << ((IACollection<long>)(event.notifier()));
        //

        cout.elementAt(
            ((IVCollectionEventData<long>*)
                ((char*)event.eventData()))->cursor());
        cout << endl;
    }
    else {
        cout << "unknown event received" << endl;
    }

    return *this;
}

private:

    Notifier* ivNotifier;

};


int main ()
{
    Notifier* n = new Notifier;
    Notifier::Cursor c(*n);
    Observer <Notifier> o (n);

    n->enableNotification ();

    {
        n->add(123,c);
        cout << "element in collection: "
            << n->elementAt(c) << endl;
        n->replaceAt(c,456);
        cout << "element in collection: "
            << n->elementAt(c) << endl;
        n->removeAt(c);
        cout << "Number of elements in collection: "
            << n->numberOfElements() << endl;
    }

    delete n;

    return 0;
}


Introduction to the Collection Classes
Overall Implementation Structure
Adding Elements
Removing Elements
Replacing Elements
Support for Notifications


Adding an Element to a Collection
Removing an Element from a Collection
Instantiating the Collection Classes