Commit 60ca35f4 by Karsa Zoltán István

kivetlek, append

parent c23f08ad
......@@ -47,6 +47,10 @@ A `RString` osztály fenti publikus metódusai tovább nem bővíthetőek. Term
A `pool.h`-ban az osztályhoz készített kommentezést követve implementáld a StringPool-t! Az osztály megvalósítása során törekedj az egységbezárásra, a hatékony megvalósításra, az osztály publikus interfésze nem bővíthető és nem is módosítható.
A két `acquire` függvénynél azt a szabad RString objektumot kell visszaadni, ami maximális kihasználtságú, azaz:
- `acquire(size_t cap)` esetén a kért kapacitás (cap) és a visszaadott RString objektum kapacitásának (str_cap) hányadosa maximális: 0 < max(cap/str_cap) <= 1
- `acquire(const char* str)` esetén a kapott string valós méretének (len+1) és a visszaadott RString objektum kapacitásának (str_cap) hányadosa maximális: 0 < max((len+1)/str_cap) <= 1
## Tiltott elemek
Az `RString` implementálásakor semmilyen STL tároló nem használható. A megoldásnál elemi dinamikus memóriakezelést kell alkalmazni. Ugyanakkor a `StringPool`-nál már használható valamilyen STL vektor vagy lista. Ezt a JPorta egyszerű szövegvizsgálattal ellenőrzi!
......
......@@ -11,6 +11,7 @@ class StringPool {
// Visszaad egy szabad RString objektumot ami
// legalább capacity kapacitással rendelkezik
// azt az objektumot kell visszadni, ami maximális kihasználtságú
// Ha nincs ilyen a pool-ban, akkor létrehoz egyet.
// Visszavonásig az a string objektum nem oszható ki.
// "Foglaltnak" minősül
......@@ -18,6 +19,7 @@ class StringPool {
// Visszaad egy szabad RString objektumot amibe
// belefér a paraméteül kapott string, azt bele is másolja.
// azt az objektumot kell visszadni, ami maximális kihasználtságú
// Ha nincs ilyen a pool-ban, akkor létrehoz egyet.
// Visszavonásig az a string objektum nem oszható ki.
// "Foglaltnak" minősül
......
......@@ -91,9 +91,12 @@ int main() {
TEST(StringPool, init) {
StringPool pool(10, 20);
EXPECT_EQ(10, pool.size());
EXPECT_EQ(10, pool.free_size());
RString& ref = pool.acquire(15);
EXPECT_EQ(20, ref.capacity());
EXPECT_STREQ("", ref);
RString& ref2 = pool.acquire("almafa");
EXPECT_STREQ("almafa", ref2);
} END
#endif
......@@ -183,14 +186,61 @@ int main() {
} END
#endif
#if ELKESZULT > 0
#if ELKESZULT > 10
TEST(StringPool, append) {
StringPool pool(3, 15);
RString& alma = pool.acquire("alma");
RString& fa = pool.acquire("fa");
RString& almafa = pool.append(alma, fa);
EXPECT_EQ(3, pool.size());
EXPECT_EQ(1, pool.free_size());
EXPECT_EQ(&almafa, &alma);
EXPECT_EQ("almafa", almafa);
} END
#endif
#if ELKESZULT > 11
TEST(StringPool, append_complex) {
StringPool pool(3, 15);
RString& arvizturo = pool.acquire("arvizturo");
RString& tukorfurogep = pool.acquire("tukorfurogep");
RString& egyben = pool.append(arvizturo, tukorfurogep);
EXPECT_EQ(4, pool.size());
EXPECT_EQ(1, pool.free_size());
EXPECT_NE(&arvizturo, &egyben);
EXPECT_EQ("arvizturotukorfurogep", egyben);
} END
#endif
#if ELKESZULT > 12
TEST(StringPool, append_kivetel) {
try {
StringPool pool(3, 15);
RString& arvizturo = pool.acquire("arvizturo");
pool.release(arvizturo);
RString& tukorfurogep = pool.acquire("tukorfurogep");
EXPECT_THROW_THROW(pool.append(arvizturo, tukorfurogep);, const char* p);
} catch (const char *p) {
#ifdef CPORTA
EXPECT_ENVCASEEQ("ORG_ID", p);
#endif
}
try {
StringPool pool(3, 15);
RString& arvizturo = pool.acquire("arvizturo");
RString& tukorfurogep = pool.acquire("tukorfurogep");
pool.release(tukorfurogep);
EXPECT_THROW_THROW(pool.append(arvizturo, tukorfurogep);, const char* p);
} catch (const char *p) {
#ifdef CPORTA
EXPECT_ENVCASEEQ("ORG_ID", p);
#endif
}
} END
#endif
if (ELKESZULT < 10)
if (ELKESZULT < 13)
ADD_FAILURE() << "\nNem futott minden teszteset!" << std::endl;
GTEND(std::cerr);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment