{{page>courses:b6b36pjc:styles#common&noheader&nofooter}} {{page>courses:b6b36pjc:styles#ukoly&noheader&nofooter}} ===== TMP: bounded_int ===== V tomto úkolu vytvoříte šablonovou třídu ''bounded_int'', která reprezentuje ''int'', ale s rozsahem hodnot známým již během kompilace. Tímto způsobem se například dá zaručit, že žádná operace nepřeteče (protože operace, která by přetekla, se ani nezkompiluje). ==== Zadání ==== ''bounded_int'' podporuje základní sadu operací: * unární i binární operátor ''+'' * unární i binární operátor ''-'' * binární operátor ''*'' * binární operátor ''/'' -- pro jednoduchost budou podporované pouze kladné dělitele * kontrolovaný (int) konstruktor -- pokud by měl ''bounded_int'' být vytvořen z intu, který se nevejde do jeho rozsahu, vyhodí výjimku * kopírující konstruktor a přiřazení -- zachová invariant objektu (není možné kopírovat/přiřadit do ''bounded_int''u, do kterého se ten původní nemusí vejít) * ''explicit operator int()'' * relační operátory ''<'', ''%%<=%%'', ''>'', ''>='', ''=='' a ''!='' Pro každou operaci platí, že rozsah navráceného typu musí odpovídat rozsahu předchozích typů po provedení dané operace((Alespoň pokud vrací další ''bounded_int'')). Například pro operátor sčítání to znamená, že pokud máme výraz ''auto c = a + b'', kde ''a'' je ''bounded_int'' a ''b'' je ''bounded_int'', pak ''c'' by mělo být typu ''bounded_int''. Zároveň pro každou operaci platí, že pokud by mohlo dojít k přetečení nebo k podtečení velikosti typu ''int'', pak se kód obsahující danou operaci nezkompiluje. Specificky pro relační operátory pak platí pravidlo, že pokud se dá během kompilace určit, jaký bude výsledek, pak je to kompilační chyba. Testy a pomocné soubory jsou ke stažení {{:courses:b6b36pjc:ukoly:tmp-bounded_int.zip|zde}}. Pro zjednodušení testování tam najdete makro ''TESTABLE_STATIC_ASSERT'', které použijte místo ''static_assert''. Tím se přesune chyba z kompilace do běhu programu a zjednodušší se testování. Dále tam najdete implementaci literálů pro vytváření ''bounded_int'' o specifické hodnotě (''123_bi'' vytvoří ''bounded_int<123, 123>'' s vnitřní hodnotou 123). ===== Rady ===== Tento úkol je bonusový a přesahuje rámec předmětu. To znamená, že k jeho úspěšnému splnění si budete muset sami nastudovat různé vlastnosti C%%++%%. Doporučujeme se ale podívat na klíčové slovo [[http://en.cppreference.com/w/cpp/language/constexpr|constexpr]], které umožňuje nechat část programu vyhodnotit během kompilace a na tzv [[http://en.cppreference.com/w/cpp/language/function|trailing return type]], který umožňuje zohlednit typ argumentu do funkce při definici návratového typu.