Advertisement
YaMolekula

Untitled

Jan 21st, 2023 (edited)
1,244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.64 KB | None | 0 0
  1. #include <list>
  2. #include <string>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. class Editor {
  8. public:
  9.     Editor();// = default;
  10.     // сдвинуть курсор влево
  11.     void Left();
  12.     // сдвинуть курсор вправо
  13.     void Right();
  14.     // вставить символ token
  15.     void Insert(char token);
  16.     // вырезать не более tokens символов, начиная с текущей позиции курсора
  17.     void Cut(size_t tokens = 1);
  18.     // cкопировать не более tokens символов, начиная с текущей позиции курсора
  19.     void Copy(size_t tokens = 1);
  20.     // вставить содержимое буфера в текущую позицию курсора
  21.     void Paste();
  22.     // получить текущее содержимое текстового редактора
  23.     std::string GetText() const;
  24.     std::list<char> clipboard, text;
  25.     std::list<char>::iterator cursor = text.begin();
  26. };
  27.  
  28. Editor::Editor() {
  29.     cursor=text.begin();
  30. }
  31.  
  32. void Editor::Left() {
  33.     if(cursor!=text.begin()) {
  34.         --cursor;
  35.     }
  36. }
  37.  
  38. void Editor::Right() {
  39.     if(cursor!=text.end()) {
  40.         ++cursor;
  41.     }
  42. }
  43.  
  44. void Editor::Insert(char token) {
  45.     cursor=text.insert(cursor, token);
  46.     ++cursor;
  47. }
  48.  
  49. void Editor::Cut(size_t tokens/* = 1*/) {
  50.     if(0 == tokens) {
  51.         return;
  52.     }
  53.     clipboard.erase(clipboard.begin(), clipboard.end());
  54.     clipboard.assign(cursor, std::next(cursor, tokens));
  55.     auto it=cursor;
  56.     while(it!=text.end() && 0<tokens) {
  57.         if(0<tokens){
  58.             it=text.erase(it);
  59.             --tokens;
  60.         }
  61.     }
  62.     cursor = it;
  63. }
  64.  
  65. void Editor::Copy(size_t tokens/* = 1*/) {
  66.     if(0 == tokens) {
  67.         return;
  68.     }
  69.     //clipboard.erase(clipboard.begin(), clipboard.end());
  70.     clipboard.assign(cursor, std::next(cursor, tokens));
  71. }
  72.  
  73. void Editor::Paste() {
  74.     if(0 == clipboard.size()) {
  75.         return;
  76.     }
  77.     cursor=text.insert(cursor, clipboard.begin(), clipboard.end());
  78.     std::advance(cursor, clipboard.size());
  79. }
  80.  
  81. std::string Editor::GetText() const {
  82.     std::string result;
  83.     for(auto curr=text.begin();curr!=text.end();++curr){
  84.         //if(curr==cursor){
  85.         //    result.push_back('|');
  86.         //}
  87.         result.push_back(*curr);
  88.     }
  89.     //if(cursor==text.end()) {
  90.     //    result.push_back('|');
  91.     //}
  92.     return result;
  93. }
  94.  
  95.  
  96. int main() {
  97.     Editor editor;
  98.     const string text = "hello, world"s;
  99.     for (char c : text) {
  100.         editor.Insert(c);
  101.     }
  102.     // Текущее состояние редактора: `hello, world|`
  103.     for (size_t i = 0; i < text.size(); ++i) {
  104.         editor.Left();
  105.     }
  106.     // Текущее состояние редактора: `|hello, world`
  107.     editor.Cut(7);
  108.     // Текущее состояние редактора: `|world`
  109.     // в буфере обмена находится текст `hello, `
  110.     for (size_t i = 0; i < 5; ++i) {
  111.         editor.Right();
  112.     }
  113.     // Текущее состояние редактора: `world|`
  114.     editor.Insert(',');
  115.     editor.Insert(' ');
  116.     // Текущее состояние редактора: `world, |`
  117.     editor.Paste();
  118.     // Текущее состояние редактора: `world, hello, |`
  119.     editor.Left();
  120.     editor.Left();
  121.     //Текущее состояние редактора: `world, hello|, `
  122.     editor.Cut(3);  // Будут вырезаны 2 символа
  123.     // Текущее состояние редактора: `world, hello|`
  124.     cout << editor.GetText();
  125.     return 0;
  126. }
  127.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement