Thanks Alan,
I like your method name better! I'll give this usage pattern a spin and
see how it goes! For my case, I think it may be a bit too generic; I'm
still leaning towards a modify_if() or an update_if() type method. As I
said, I'll give it a spin and see if it will fly!
all the best,
Sam
Alan Conway wrote:
On 12/23/2009 06:13 AM, Sam Joyce wrote:
Hi Alan,
thanks for this. I hadn't realized this was the use pattern; more
comments in code please folks.
Perhaps you can add some while you still have the new-user
perspective, that's the best time to write documentation :)
looking at the add() fn, I see what you mean, it takes a copy, does the
add and then replaces the main array element.
I think CopyOnWriteArray is the correct type to use in the
HeadersExchange. Personally I like it because I get to use things like
add_unless() etc. (less coding for me) and I like the idea of a wrapper
class like this that protects the coder from having to manage the
locking directly; leads to less race conds because of misplaced locks.
From what you've mentioned below Alan, I'd guess the best option would
be to add a new method to CopyOnWriteArray, something like
replace_or_add(T& t, F f). the match function being the one to identify
an existing element. I'm open to ideas for a better method name :) I
think it should work a bit like add_unless(), except doing a
copy/remove/replace
thoughts?
regards,
Sam.
How about a general-purpose modify function like this:
// t takes a const vector<T>& , m takes a non-const vector<T>&
template <class Test, class Modifier>
bool modify_if(Test t, Modifier m) {
Mutex::ScopedLock l(lock);
if (array && t(*array)) {
ArrayPtr copy(new std::vector<T>(*array));
m(*copy);
array = copy;
return true;
}
return false;
}
That will let you do anything you like to the array - you could
rewrite all the modifiers in terms of this one (although they'd be a
little less efficient because the current ones use the results of the
test part in the modify part.)
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:[email protected]
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:[email protected]