shizaero

Untitled

Aug 15th, 2023
951
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.22 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cassert>
  3. #include <string>
  4. #include <list>
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. class Editor {
  9. public:
  10.     Editor(){}
  11.    
  12.     void Left(){
  13.         if((it != text.begin()) && (text.size() != 0)){
  14.             --it;
  15.         }
  16.     }
  17.    
  18.     // сдвинуть курсор вправо
  19.     void Right(){
  20.         if((it != text.end()) && (text.size() != 0)) ++it;
  21.     }
  22.    
  23.     // вставить символ token
  24.     void Insert(char token){
  25.         auto it_insert = text.insert(it, token);
  26.         it_insert++;
  27.         it = it_insert;
  28.     }
  29.    
  30.     // вырезать не более tokens символов, начиная с текущей позиции курсора
  31.     void Cut(size_t tokens = 1){
  32.         buffer.clear();
  33.         auto dist = max((int)distance(it, text.end()), static_cast<int>(tokens));
  34.         auto ptr_end = it;
  35.         advance(ptr_end, dist);
  36.         buffer.insert(buffer.begin(), it, ptr_end);
  37.         text.erase(it, ptr_end);
  38.     }
  39.    
  40.     // cкопировать не более tokens символов, начиная с текущей позиции курсора
  41.     void Copy(size_t tokens = 1){
  42.         buffer.clear();
  43.         auto dist = max(static_cast<int>(distance(it, text.end())), static_cast<int>(tokens));
  44.         auto ptr_end = it;
  45.         advance(ptr_end, dist);
  46.         buffer.insert(buffer.begin(), it, ptr_end);
  47.     }
  48.    
  49.     // вставить содержимое буфера в текущую позицию курсора
  50.     void Paste(){
  51.         auto pos = text.insert(it, buffer.begin(), buffer.end());
  52.         advance(pos, buffer.size());
  53.     }
  54.     // получить текущее содержимое текстового редактора
  55.     string GetText() const{
  56.         string result;
  57.         for (auto letter: text) {
  58.             result += letter;
  59.         }
  60.         return result;
  61.     }
  62. private:
  63.     list <char> text;
  64.     list <char> buffer;
  65.     list <char>::iterator it = text.begin();
  66. };
  67.  
  68. int main() {
  69.     Editor editor;
  70.     const string text = "hello, world"s;
  71.     for (char c : text) {
  72.         editor.Insert(c);
  73.     }
  74.     // Текущее состояние редактора: `hello, world|`
  75.     for (size_t i = 0; i < text.size(); ++i) {
  76.         editor.Left();
  77.     }
  78.     // Текущее состояние редактора: `|hello, world`
  79.     editor.Cut(7);
  80.     // Текущее состояние редактора: `|world`
  81.     // в буфере обмена находится текст `hello, `
  82.     for (size_t i = 0; i < 5; ++i) {
  83.         editor.Right();
  84.     }
  85.     // Текущее состояние редактора: `world|`
  86.     editor.Insert(',');
  87.     editor.Insert(' ');
  88.     // Текущее состояние редактора: `world, |`
  89.     editor.Paste();
  90.     // Текущее состояние редактора: `world, hello, |`
  91.     editor.Left();
  92.     editor.Left();
  93.     //Текущее состояние редактора: `world, hello|, `
  94.     editor.Cut(3);  // Будут вырезаны 2 символа
  95.     // Текущее состояние редактора: `world, hello|`
  96.     cout << editor.GetText();
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment