#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include "tordelo.h"
#include "szinek.hpp"
using namespace std;
// --- nl és tab manipulátorok ---
ostream& nl(ostream& os) { return os.put('\n'); }
ostream& tab(ostream& os) { return os.put('\t'); }
int main() {
setlocale(LC_ALL, "");
cout << SARGA << "Adj meg egy mondatot: " << FEHER;
string bemenet; getline(cin, bemenet);
cout << SZURKE << nl << "[1] Beolvasott szöveg:" << FEHER << nl << tab << bemenet << nl;
// -- Szavak kigyűjtése --
Tordelo t(bemenet); int n = t.darab(); vector<string> szavak;
cout << SZURKE << nl << "[2] Szavak (szótagolás eredménye):" << FEHER << nl;
for (int i = 0; i < n; ++i) {
string szo = t.szo(i);
if (szo == "cica")
szo.replace(0, 1, "m");
szavak.push_back(szo);
cout << tab << i << ". " << szo << " (" << szo.length() << ")" << nl;
}
// --- Tordelo::szo() metódus használata ---
cout << K_CYAN << nl << "[2.1] Szó lekérdezése index alapján (Tordelo::szo példa):" << FEHER << nl;
int index = 0;
if (n > 0) {
cout << tab << "Első szó (t.szo(0)):" << tab << t.szo(0) << nl;
cout << tab << "Utolsó szó (t.szo(n-1)):" << tab << t.szo(n - 1) << nl;
}
// Nem létező index
cout << tab << "Nem létező index (t.szo(100)):" << tab << "\"" << t.szo(100) << "\"" << nl;
// --- Műveleti blokkok: mindenhol előtte/utána állapot ---
cout << SZURKE << nl << "[3] String műveletek példákon keresztül (mindig előtte/utána):" << nl << FEHER;
// 3.1 =, .assign()
string s1 = szavak.empty() ? "" : szavak[0];
string s2 = szavak.size() > 1 ? szavak[1] : "alma";
cout << K_CYAN << nl
<< tab << "[3.1] Értékadás (=, .assign):" << FEHER << nl;
cout << tab << "s1: " << s1
<< tab << "s2: " << s2 << nl;
s2 = s1;
cout << tab << "s2 = s1"
<< tab << "s2: " << s2 << nl;
s2.assign("barack");
cout << tab << "s2.assign(\"barack\")"
<< tab << "s2: " << s2 << nl;
// 3.2 [], .at()
cout << K_CYAN << nl
<< tab << "[3.2] Karakterek elérése ([] és .at()):" << FEHER << nl
<< tab << "s2: " << s2 << nl;
char elotte = s2[0];
s2[0] = 'B';
cout << tab << "s2[0] = 'B'"
<< tab << "(" << elotte << "->" << s2[0] << ")"
<< tab << "s2: " << s2 << nl;
char elotte2 = s2.at(1);
s2.at(1) = 'O';
cout << tab << "s2.at(1) = 'O'"
<< tab << "(" << elotte2 << "->" << s2[1] << ")"
<< tab << "s2: " << s2 << nl;
// 3.3 +, +=, .append()
string s3 = s1 + s2;
cout << K_CYAN << nl
<< tab << "[3.3] Összefűzés (+, +=, .append()):" << FEHER << nl
<< tab << "s3 = s1 + s2: " << s3 << nl;
s3 += "123";
cout << tab << "s3 += \"123\""
<< tab << s3 << nl;
s3.append("XYZ");
cout << tab << "s3.append(\"XYZ\")"
<< tab << s3 << nl;
// 3.4 .length(), .size()
cout << K_CYAN << nl
<< tab << "[3.4] Hossz (length, size):" << FEHER << nl
<< tab << "s3: " << s3 << nl;
cout << tab << "s3.length(): " << s3.length()
<< tab << "s3.size(): " << s3.size() << nl;
// 3.5 .erase(pos, size)
cout << K_CYAN << nl
<< tab << "[3.5] Részleges törlés (erase(pos, size)):" << FEHER << nl
<< tab << "s3: " << s3 << nl;
string s4 = s3;
s4.erase(2, 3);
cout << tab << "s4.erase(2,3)"
<< tab << s4 << nl;
// 3.6 .erase(iterator)
cout << K_CYAN << nl
<< tab << "[3.6] Törlés iterátorral (erase(iterator)):" << FEHER << nl
<< tab << "s4: " << s4 << nl;
s4.erase(s4.begin());
cout << tab << "s4.erase(s4.begin())"
<< tab << s4 << nl;
// 3.7 .empty(), .clear()
cout << K_CYAN << nl
<< tab << "[3.7] Üres-e? (empty), teljes törlés (clear):" << FEHER << nl
<< tab << "s2: " << s2
<< tab << "(empty? " << (s2.empty() ? "igen" : "nem") << ")" << nl;
s2.clear();
cout << tab << "s2.clear()"
<< tab << "s2: " << (s2.empty() ? "[üres]" : s2) << nl;
// 3.8 .substr()
cout << K_CYAN << nl
<< tab << "[3.8] Részszöveg (substr):" << FEHER << nl
<< tab << "s3: " << s3 << nl
<< tab << "s3.substr(2,5): " << s3.substr(2, 5) << nl;
// 3.9 .find()
cout << K_CYAN << nl
<< tab << "[3.9] Keresés (find):" << FEHER << nl
<< tab << "s3: " << s3 << nl;
size_t pos = s3.find("BO");
cout << tab << "s3.find(\"BO\"): ";
if (pos != string::npos) cout << pos << nl;
else cout << "nincs benne" << nl;
// 3.10 .c_str()
cout << K_CYAN << nl
<< tab << "[3.10] Karaktertömbbé alakítás (c_str):" << FEHER << nl
<< tab << "s3.c_str(): " << s3.c_str() << nl;
// 3.11 .insert()
cout << K_CYAN << nl
<< tab << "[3.11] Beszúrás (insert):" << FEHER << nl;
string s5 = s3;
cout << tab << "s5: " << s5 << nl;
s5.insert(1, "---");
cout << tab << "s5.insert(1,\"---\")"
<< tab << s5 << nl;
// 3.12 .replace()
cout << K_CYAN << nl
<< tab << "[3.12] Csere (replace):" << FEHER << nl
<< tab << "s5: " << s5 << nl;
s5.replace(1, 3, "@@@");
cout << tab << "s5.replace(1,3,\"@@@\")"
<< tab << s5 << nl;
// 3.13 .copy()
cout << K_CYAN << nl
<< tab << "[3.13] Másolás char tömbbe (copy):" << FEHER << nl;
char buf[20];
size_t m = s5.copy(buf, 5, 0);
buf[m] = '\0';
cout << tab << "s5.copy(buf,5,0): \"" << buf << "\" (első 5 karakter)" << nl;
// --- Modern stringfüggvények ---
cout << K_CYAN << nl << "[4] Modernebb C++ string műveletek:" << FEHER << nl;
// 4.1 .front(), .back() (C++11)
string modern = "modernitas";
cout << nl
<< tab << "modern: " << modern << nl
<< tab << "modern.front(): " << modern.front() << nl
<< tab << "modern.back(): " << modern.back() << nl;
modern.front() = 'M';
modern.back() = 'Z';
cout << tab << "(front/back után): " << modern << nl;
// 4.2 .starts_with(), .ends_with() (C++20)
cout << nl
<< tab << "modern: " << modern << nl
<< tab << "modern.starts_with(\"Mo\"): " << (modern.starts_with("Mo") ? "igen" : "nem") << nl
<< tab << "modern.ends_with(\"Z\"): " << (modern.ends_with("Z") ? "igen" : "nem") << nl;
// 4.3 string_view használata (C++17)
cout << nl //Egy olyan könnyű (lightweight) típus,
//ami egy meglévő szövegre (stringre vagy akár karaktertömbre) mutat, anélkül, hogy adatot másolna.
<< tab << "string_view bemutató:" << nl; // Csak egy nézet (view), nem birtokolja az adatot – így gyors, hatékony, nincs felesleges másolás.
// Nagy szövegeket, fájltartalmakat stb. gyorsan feldolgozhatsz vele.
string_view view = modern; // A modern nevű stringedre egy "nézetet" (view) hoz létre.
// Mostantól a view-on keresztül ugyanúgy olvashatod a szöveget, mintha az egy string lenne, de nem másolod át.
cout << tab << "view: " << view << nl
<< tab << "view.substr(1,4): " << view.substr(1, 4) << nl; //Gyakorlati előnye: Gyors, nulla-másolás: nem kell minden részszöveget új stringgé másolni,
// Nagy adatoknál (pl. logfájl, fájltartalom) óriási sebességelőny!
// Alternatív: push_back(), pop_back()
cout << nl
<< tab << "push_back, pop_back alternatíva:" << nl;
modern.push_back('X');
cout << tab << "modern.push_back('X'): " << modern << nl;
modern.pop_back();
cout << tab << "modern.pop_back(): " << modern << nl;
cout << K_MAGENTA << nl << "-- Labor vége --" << nl << FEHER;
return 0;
}