Listing 1: Adding new elements to the rollback list.
template <class T, class ForwardIterator>
void strong_insert(std::set<T> c, ForwardIterator first, ForwardIterator last)
{
typedef typename std::set<T>::iterator set_iterator;
std::deque<set_iterator> rollback_temp;
try {
while ( first != last ) {
std::pair<set_iterator,bool> result = c.insert( *first );
if ( result.second ) {
try {
rollback_temp.push_back(result.first);
} catch ( ... ) {
c.erase( result.first );
throw; // skip to outer catch block
}
}
++first;
}
} catch ( ... ) {
typedef typename std::deque<set_iterator>::iterator deque_iterator;
// remove rollback list elements
for ( deque_iterator i = rollback_temp.begin();
i != rollback_temp.end();
++i ) {
c.erase( *i );
}
throw;
}
}