Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <cassert>
- #include <string>
- #include <list>
- using namespace std;
- class Editor {
- public:
- Editor(){}
- void Left(){
- if((it != text.begin()) && (text.size() != 0)){
- --it;
- }
- }
- // сдвинуть курсор вправо
- void Right(){
- if((it != text.end()) && (text.size() != 0)) ++it;
- }
- // вставить символ token
- void Insert(char token){
- auto it_insert = text.insert(it, token);
- it_insert++;
- it = it_insert;
- }
- // вырезать не более tokens символов, начиная с текущей позиции курсора
- void Cut(size_t tokens = 1){
- buffer.clear();
- auto dist = max(distance(it, text.end()), static_cast<int>(tokens));
- buffer.insert(buffer.begin(), it, it + dist);
- text.erase(it, it + dist);
- }
- // cкопировать не более tokens символов, начиная с текущей позиции курсора
- void Copy(size_t tokens = 1){
- buffer.clear();
- auto dist = max(static_cast<int>(distance(it, text.end())), static_cast<int>(tokens));
- buffer.insert(buffer.begin(), it, it + dist);
- }
- // вставить содержимое буфера в текущую позицию курсора
- void Paste(){
- auto pos = insert(it, buffer.begin(), buufer.end());
- advance(it, buffer.size());
- }
- // получить текущее содержимое текстового редактора
- string GetText() const{
- string result;
- for (auto letter: text) {
- result += letter;
- }
- return result;
- }
- private:
- list <char> text;
- list <char> buffer;
- list <char>::iterator it = text.begin();
- };
- 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