shizaero

Untitled

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