Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <list>
- #include <string>
- #include <iostream>
- using namespace std;
- class Editor {
- public:
- Editor();// = default;
- // сдвинуть курсор влево
- void Left();
- // сдвинуть курсор вправо
- void Right();
- // вставить символ token
- void Insert(char token);
- // вырезать не более tokens символов, начиная с текущей позиции курсора
- void Cut(size_t tokens = 1);
- // cкопировать не более tokens символов, начиная с текущей позиции курсора
- void Copy(size_t tokens = 1);
- // вставить содержимое буфера в текущую позицию курсора
- void Paste();
- // получить текущее содержимое текстового редактора
- std::string GetText() const;
- std::list<char> clipboard, text;
- std::list<char>::iterator cursor = text.begin();
- };
- Editor::Editor() {
- cursor=text.begin();
- }
- void Editor::Left() {
- if(cursor!=text.begin()) {
- --cursor;
- }
- }
- void Editor::Right() {
- if(cursor!=text.end()) {
- ++cursor;
- }
- }
- void Editor::Insert(char token) {
- cursor=text.insert(cursor, token);
- ++cursor;
- }
- void Editor::Cut(size_t tokens/* = 1*/) {
- if(0 == tokens) {
- return;
- }
- clipboard.erase(clipboard.begin(), clipboard.end());
- clipboard.assign(cursor, std::next(cursor, tokens));
- auto it=cursor;
- while(it!=text.end() && 0<tokens) {
- if(0<tokens){
- it=text.erase(it);
- --tokens;
- }
- }
- cursor = it;
- }
- void Editor::Copy(size_t tokens/* = 1*/) {
- if(0 == tokens) {
- return;
- }
- //clipboard.erase(clipboard.begin(), clipboard.end());
- clipboard.assign(cursor, std::next(cursor, tokens));
- }
- void Editor::Paste() {
- if(0 == clipboard.size()) {
- return;
- }
- cursor=text.insert(cursor, clipboard.begin(), clipboard.end());
- std::advance(cursor, clipboard.size());
- }
- std::string Editor::GetText() const {
- std::string result;
- for(auto curr=text.begin();curr!=text.end();++curr){
- //if(curr==cursor){
- // result.push_back('|');
- //}
- result.push_back(*curr);
- }
- //if(cursor==text.end()) {
- // result.push_back('|');
- //}
- return result;
- }
- int main() {
- Editor editor;
- const string text = "hello, world"s;
- for (char c : text) {
- editor.Insert(c);
- }
- // Текущее состояние редактора: `hello, world|`
- for (size_t i = 0; i < text.size(); ++i) {
- editor.Left();
- }
- // Текущее состояние редактора: `|hello, world`
- editor.Cut(7);
- // Текущее состояние редактора: `|world`
- // в буфере обмена находится текст `hello, `
- for (size_t i = 0; i < 5; ++i) {
- editor.Right();
- }
- // Текущее состояние редактора: `world|`
- editor.Insert(',');
- editor.Insert(' ');
- // Текущее состояние редактора: `world, |`
- editor.Paste();
- // Текущее состояние редактора: `world, hello, |`
- editor.Left();
- editor.Left();
- //Текущее состояние редактора: `world, hello|, `
- editor.Cut(3); // Будут вырезаны 2 символа
- // Текущее состояние редактора: `world, hello|`
- cout << editor.GetText();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement