Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template<typename T>
- typedef bool (*Predicate) (const T&)
- template<typename T>
- typedef void (*Transformer) (T&)
- template <class T>
- // void TransformIf(T* begin, T* end, bool (*p)(const T&), void (*f)(T&)) {
- void TransformIf(T* begin, T* end, Predicate<T> p, Transformer<T> f) {
- size_t N = end - begin;
- std::vector<T> reserve_copy;
- v.reserve(N);
- bool is_copy_valid = true;
- // Проходим по исходной последовательности
- for (T* it = begin; it != end; ++it) {
- try {
- // Запоминаем исходный элемент
- try {
- //Если при копировании T возникает исключение
- if (is_copy_valid) {
- reserve_copy.push_back(*it);
- }
- } catch(...) {
- // Если копия не работает, то запоминаем этот факт
- is_copy_valid = false;
- }
- // Может быть * не нужна в *p и *f
- if ((*p)(*it)) {
- (*f)(*it);
- }
- } catch(...) {
- // Если p и/или f бросает исключение
- if (is_copy_valid) {
- // то функция должна оставить последовательность в первоначальном виде
- for (int i = 0; i < v.size(); ++i) {
- try {
- begin[i] = v[i];
- } catch(...) {
- // Nothing
- }
- }
- } else {
- //Если исключения возникают и при копировании T, и в p и/или f, функция оставляет последовательность в неопределенном состояниии бросает одно из исключений
- //p или f не работают, копирование тоже не работает
- }
- //(и бросить то же исключение).
- throw;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement