Boost logo

Boost :

From: Andreas Nicolai (Andreas.Nicolai_at_[hidden])
Date: 2003-01-23 08:48:08


Hi Stefan!

Well you could implement it like this (if that works, didn't test it yet).
Although you would still need a wrapping undo_list class, to implement all
the undo/redo-relationship, the checks "is the undo-vector already empty"
etc., basically everything that's in my undo_list class already (at there
are quite a few bits). So in fact one would change the storage members and
change the interface for the user.

Instead of writing undo-classes with a constructor, an undo-function and a
redo-function (that makes 3) one would have to write two functions, that
take the appropriate parameters (so speaking in numbers, you would save 1
function).

BUT, when executing the undo-code one might want to add a redo-function to
the redo list and all shared properties/member-variables have to be copied
yourself:

void string_erase_undo(std::string& dest, int pos, std::string to_insert) {
    dest.insert(pos, to_insert);
    // now add the redo function
    redolist.push_back(boost::bind(string_erase_redo, dest, pos,
to_insert(size)));
    // questions: 1. What is redolist? does every undo/redo-function need to
know this?
    // 2. Do I really have to copy all the function parameters?
    // 3. Why do I (the undo function) have to add the redo
function? This is
    // multiplying the same code (in every undo and redo
function)
}

Ok, there you see some of the problems/disadvantages of this approach.

Well, there's another minor advantage of my solution. You wouldn't be
obliged to use other libraries (even though this are boost library
elements).

Thinking it over I came to the conclusion that the derived-undo_action-class
version is the most convenient and most flexible way of doing so... but
there's surely something I forgot to think of!?

Bye - Andreas


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk