Advertisement
Derga

Untitled

Mar 3rd, 2023
656
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. template<typename T>
  2. typedef bool (*Predicate) (const T&)
  3.  
  4. template<typename T>
  5. typedef void (*Transformer) (T&)
  6.  
  7. template <class T>
  8. // void TransformIf(T* begin, T* end, bool (*p)(const T&), void (*f)(T&)) {
  9. void TransformIf(T* begin, T* end, Predicate<T> p, Transformer<T> f) {
  10.     size_t N = end - begin;
  11.     std::vector<T> reserve_copy;
  12.     v.reserve(N);
  13.     bool is_copy_valid = true;
  14.  
  15.     // Проходим по исходной последовательности
  16.     for (T* it = begin; it != end; ++it) {
  17.         try {
  18.             // Запоминаем исходный элемент
  19.             try {
  20.                 //Если при копировании T возникает исключение
  21.                 if (is_copy_valid) {
  22.                     reserve_copy.push_back(*it);
  23.                 }
  24.             } catch(...) {
  25.                 // Если копия не работает, то запоминаем этот факт
  26.                 is_copy_valid = false;
  27.             }
  28.             // Может быть * не нужна в *p и *f
  29.             if ((*p)(*it)) {
  30.                 (*f)(*it);
  31.             }
  32.         } catch(...) {
  33.             // Если p и/или f бросает исключение
  34.             if (is_copy_valid) {
  35.                 // то функция должна оставить последовательность в первоначальном виде
  36.                 for (int i = 0; i < v.size(); ++i) {
  37.                     try {
  38.                         begin[i] = v[i];
  39.                     } catch(...) {
  40.                         // Nothing
  41.                     }
  42.                 }
  43.             } else {
  44.                 //Если исключения возникают и при копировании T, и в p и/или f, функция оставляет последовательность в неопределенном состояниии бросает одно из исключений
  45.                 //p или f не работают, копирование тоже не работает
  46.             }
  47.             //(и бросить то же исключение).
  48.             throw;
  49.         }
  50.     }
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement