Skip to content

Commit a43b215

Browse files
authored
Merge pull request #24 from yusuf601/main
feat: add write,read,undo,redo operations
2 parents 6ecef48 + 0292b23 commit a43b215

2 files changed

Lines changed: 148 additions & 34 deletions

File tree

.vscode/settings.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@
7171
"cinttypes": "cpp",
7272
"typeinfo": "cpp",
7373
"valarray": "cpp",
74-
"variant": "cpp"
74+
"variant": "cpp",
75+
"any": "cpp",
76+
"bitset": "cpp",
77+
"complex": "cpp",
78+
"csignal": "cpp",
79+
"forward_list": "cpp",
80+
"stack": "cpp"
7581
}
7682
}

case_study/advanced/undo_redo.cpp

Lines changed: 141 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <iostream>
22
#include <stdexcept>
3+
#include <sstream>
34
class Stack{
45
private:
56
enum Mode{write = 1,read = 2,undo = 3,redo = 4,unknown = 5};
@@ -26,6 +27,7 @@ class Stack{
2627
}
2728
~Stack(){
2829
delete[] arr;
30+
delete[] temp;
2931
}
3032
public:
3133
Mode classifyInput(const std::string& text){
@@ -47,62 +49,168 @@ class Stack{
4749
}
4850
return false;
4951
}
50-
std::string get_operation(const std::string& text){
51-
std::string ans = "";
52-
Mode m = classifyInput(text);
53-
if(m == read){
54-
return "read";
55-
}else if(m == write){
56-
return "write";
57-
}else if(m == undo){
58-
return "undo";
59-
}else if(m == redo){
60-
return "redo";
61-
}
62-
return "";
63-
}
6452
bool is_empty()const noexcept{
6553
if(size == 0){
6654
return true;
6755
}
6856
return false;
6957
}
58+
bool temp_is_empty()const noexcept{
59+
if(temp_size == 0){
60+
return true;
61+
}
62+
return false;
63+
}
7064
std::string top(){
71-
return arr[size];
65+
return arr[size - 1];
7266
}
73-
private:
67+
std::string top_temp(){
68+
return temp[temp_size - 1];
69+
}
70+
private:
71+
/**
72+
* @brief fungsi untuk mendapatkan operasi dengan melakukan parser
73+
* terhadap string dengan memisahkan keyword operasi dengan string utama
74+
*
75+
* @param text adalah string input yang masih mentah dalam kata lain masih
76+
* tercampur dengan keyword(write,read,undo,dan redo)
77+
*
78+
* @return string yang berisi operasi apa saja pada sebuah string
79+
*/
80+
std::string get_operation(const std::string& text){
81+
std::string ans = "";
82+
std::istringstream iss(text);
83+
std::string cmd;
84+
iss >> cmd;
85+
Mode m = classifyInput(cmd);
86+
return cmd;
87+
}
88+
/**
89+
* @brief fungsi untuk melakukan parser terhadap string,dengan kata
90+
* lain memisahkan keyword(write,read,undo,dan redo) dengan string utama
91+
*
92+
* @param text adalah string input yang masih mentah dalam kata lain masih
93+
* tercampur dengan keyword(write,read,undo,dan redo)
94+
*
95+
* @return sebuah string setelah di parser
96+
*
97+
* @details memakai istringstream untuk memisahkan keyword dengan string utama
98+
* parameter istringstream(is,str)
99+
* is: objek input stream
100+
* - std::cin(baca dari console)
101+
* - std::ifstream(baca dari file)
102+
* - std::istringstream(baca dari stream) ->kita memakai ini
103+
*/
104+
std::string parser(const std::string& text){
105+
std::istringstream iss(text);
106+
std::string cmd;
107+
iss >> cmd; //ambil kata pertama(keyword)
108+
std::string args;
109+
std::getline(iss,args);
110+
if(!args.empty() && args.front() == ' '){ //jika ada spasi maka erase
111+
args.erase(0,1);
112+
}
113+
return args;
114+
}
115+
private: //abstraksi common operation on stack
116+
void push_arr(const std::string& text){
117+
std::string parser_text = parser(text);
118+
arr[size] = parser_text;
119+
size++;
120+
}
121+
void push_temp(){
122+
temp[temp_size] = top();
123+
temp_size++;
124+
}
125+
void pop_arr(){
126+
arr[size - 1] = "";
127+
size--;
128+
}
129+
void pop_temp(){
130+
temp[temp_size] = "";
131+
temp_size--;
132+
}
133+
public:
74134
void Write(const std::string& text){
75135
if(is_full()){
76136
throw std::runtime_error("Stack telah penuh");
77137
}
78-
Mode m = classifyInput(top());
79-
if(m == read){
80-
arr[size] = text;
81-
size++;
138+
Mode m = classifyInput(text);
139+
if(m == write){
140+
push_arr(text);
82141
}else{
83142
std::string operasi = get_operation(text);
84-
if(!operasi.empty()){
85-
std::cout << "Tidak dapat melakukan operasi" << operasi << std::endl;
86-
}else{
87-
std::cout << "Keyword tidak ditemukan" << std::endl;
88-
}
143+
std::cout << "Error: " << operasi << " not available" << std::endl;
89144
}
90145
}
91-
void pop(){
146+
/**
147+
* @brief undo adalah salah satu operasi pada text editor,adapun tugas nya adalah
148+
* membatalkan perubahan yang user lakukan.
149+
*
150+
* @details cara kerja undo:
151+
* 1.push top pada arr ke temp_stack
152+
* 2.pop element top pada arr
153+
*/
154+
void Undo(const std::string& text){
92155
Mode m = classifyInput(top());
93156
if(m == undo){
94-
temp[temp_size] = top();
95-
temp_size++;
96-
arr[size - 1] = "";
97-
size--;
157+
if(is_empty()){
158+
std::runtime_error("Queue is empty");
159+
}else{
160+
push_temp();
161+
pop_arr();
162+
}
163+
}else{
164+
std::string operasi = get_operation(top());
98165
}
99166
}
100-
public:
101-
void menu(){
102-
167+
void Redo(){
168+
if(temp_is_empty()){
169+
throw std::runtime_error("tidak ada perubahan terbaru");
170+
}else{
171+
arr[size] = top_temp();
172+
size++;
173+
pop_temp();
174+
}
175+
}
176+
void Read(){
177+
for(size_t i = 0;i < size;i++){
178+
std::cout << arr[i] << " ";
179+
}
180+
std::cout << std::endl;
103181
}
182+
public:
183+
std::string input(){
184+
std::string text;
185+
std::cin >> text;
186+
return text;
187+
}
188+
void menu(const std::string& text){
189+
std::string operation = get_operation(text);
190+
Mode m = classifyInput(text);
191+
if(m == write){
192+
Write(text);
193+
}else if(m == read){
194+
Read();
195+
}else if(m == undo){
196+
Undo(text);
197+
}else if(m == redo){
198+
Redo();
199+
}else{
200+
std::string operasi = get_operation(top());
201+
std::cout << "Error: " << operasi << " not available" << std::endl;
202+
}
203+
}
104204
};
105205
int main(){
206+
Stack stack1(1024); //
207+
stack1.Write("write aku");
208+
stack1.Write("write dia");
209+
stack1.Write("write sayang");
210+
stack1.Write("write kamu");
211+
stack1.Read(); // aku dia sayang kamu
212+
stack1.Undo("undo"); // aku dia sayang
213+
stack1.Read();
106214
std::cin.get();
107215
return 0;
108216
}

0 commit comments

Comments
 (0)