Commit e1aecbfc by Szeberényi Imre

v0

parents
# Pelda Makefile a generikus tomb feladat megoldasanak forditasara
# Solaris (ural2) es Linux ala.
# forditando obj. fajlok
objs = gen_array_iter2_test.o
# headerek, melyektol az egyszeruseg kedveert minden fugg
heads = gen_array_iter2.hpp
prog = gen_array_iter2_test # a program neve
CXX = g++ # a C++ fordito neve
CXXFLAGS = -pedantic -Wall # C++ kapcsolok: legyen bobeszedu,
CXXFLAGS += -g # ... es forduljon debug info is
# alapertelmezett cel: tesztprogram linkelese
all: $(prog)
$(prog): $(objs) $(objs2)
$(CXX) $(objs) $(objs2) -o $@
$(objs): $(heads)
# takaritas igeny szerint
clean:
rm -f $(objs) $(prog)
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="gen_array_iter3" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/genarray3" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/genarray3" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-pedantic" />
<Add option="-std=c++11" />
<Add option="-Wall" />
</Compiler>
<Unit filename="gen_array_iter3.hpp" />
<Unit filename="gen_array_iter3_test.cpp" />
<Unit filename="gtest_lite.h" />
<Unit filename="integer.h" />
<Unit filename="sablonok.hpp" />
<Extensions>
<code_completion />
<debugger />
<envvars />
<DoxyBlocks>
<comment_style block="0" line="0" />
<doxyfile_project />
<doxyfile_build />
<doxyfile_warnings />
<doxyfile_output />
<doxyfile_dot />
<general />
</DoxyBlocks>
</Extensions>
</Project>
</CodeBlocks_project_file>
/**
* \file gen_array_iter3.hpp
*
* Generikus tömb iterátorral v3.
* Előadáson bemutatott kód módosított változata.
*/
#ifndef GEN_ARRAY_ITER3
#define GEN_ARRAY_ITER3
#include <stdexcept>
/**
* Fix méretű generikus tömb.
* @param T - tárolt adattípus
* @param maxsiz - maximális méret
*/
template<class T, size_t maxsiz = 6>
class Array {
size_t siz; // adatok tényleges mennyisége
T t[maxsiz]; // elemek (adatok) tömbje
public:
/// minden implicit tagfüggvény jó, nem kell átdefiniálni
class iterator; // elődeklaráció
/// default és konstans értékkel feltöltő konstruktor
/// @param n - méret
/// @param value - érték, amivel feltölt
explicit Array(size_t n = 0, const T& value = T()) : siz(0) {
while (siz < n && siz < maxsiz)
t[siz++] = value;
}
/// konstruktor sorozatból
/// @param first - sorozat elejére mutat
/// @param last - utolsó elem után
template <class InputIterator>
Array(InputIterator first, InputIterator last) : siz(0) {
while (first != last && siz < maxsiz) // átmásolunk, amíg lehet
t[siz++] = *first++;
}
/// létrehoz egy iterátort és az elejére állítja
/// @return - iterátor az adatsorozat elejére
iterator begin() {
return iterator(*this); // ld. iterátor konstruktor
}
/// létrehoz egy iterátort és az utolsó elem után állítja
/// @return - iterátor az adatsorozat végére
iterator end() {
return iterator(*this, siz);// ld. iterátor konstruktor
}
/// Elemek tényleges száma
/// @return - ténylegesen tárolt elemek száma
size_t size() const { return siz; }
/// Tömb allokált (maximális) kapacitása
/// @return - tömb allokált (maximális) kapacitása
size_t capacity() const { return maxsiz; }
/// Tömb allokált maximális kapacitása
/// Mivel a tömb fix méretű így a max_size és a capacity megegyezik.
/// @return - tömb maximális kapacitása
size_t max_size() const { return maxsiz; }
/// at
/// @param i - index
/// @return - i. elem referenciája, vagy out_of_range hiba
T& at(size_t i) {
if (i >= maxsiz) throw std::out_of_range("Array.at(): hibas index");
if (i >= siz) siz = i+1; // növeljük a tényleges méretet
return t[i];
}
/// at konstans változata.
/// konstans esetén nem változhat a méret
/// @param i - index
/// @return i. elem referenciája, vagy out_of_range hiba
const T& at(size_t i) const {
if (i >= siz) throw std::out_of_range("Array.at(): hibas index");
return t[i];
}
/// iterator osztály
/// input/output (STL::ForwardIterator) iterátorként használható
class iterator {
Array *p; // tároljuk, hogy melyik az objektumhoz tartozik az iterátor
size_t idx; // tároljuk az aktuális index értéket
public:
/// default konstruktor
iterator() :p(0), idx(0) {}
/// konstruktor, egy konkrét objektum ix-edik elemére mutat
/// @param a - a konkrét objektum
/// @param ix - ide állítja az indexet
iterator(Array& a, size_t ix = 0)
: p(&a), // az objektumra mutat
idx(ix) {} // erre az elemre áll
/// pre-inkremens
/// csak hatékonyság miatt ref. visszatérésű,
/// értelmetlen lenne balértékként használni
iterator& operator++() {
if (idx != p->siz) ++idx; // nem engedjük túllépni
return *this;
}
/// post-inkremens
iterator operator++(int); // Ezt el kell készítenie
/// egyenlőtlenség vizsgálat
/// @param i - jobboldali operandus
bool operator!=(const iterator &i) {
return(idx != i.idx);
}
/// egyenlőség vizsgálat
/// @param i - jobboldali operandus
bool operator==(const iterator &i) {
return !operator!=(i);
}
/// indirekció
T& operator*() {
if (idx != p->siz) return p->t[idx];
else throw std::runtime_error("Hibas indirekcio");
}
/// Szelekció pointerrel (nyil). Címet kell, hogy adjon.
T* operator->() {
return &operator*();
}
}; // iterator osztály vége
/// Virtuális destruktor.
/// Most nem használjuk, de egy generikus osztály későbbi
/// felhasználási módja kevésbé látszik.
virtual ~Array() {}
}; // generikus tömb vége
#endif
/**
* Egyszerű program az iterátoros generikus tömb kipróbálásához.
*/
#include <iostream>
#include <stdexcept>
#include <sstream>
#include "integer.h"
#include "sablonok.hpp"
#include "gen_array_iter3.hpp"
#include "gtest_lite.h"
/// Ellenőrizzük, hogy a sablonok.hpp-ben definiálta-e az ELKESZULT makrót
#ifndef ELKESZULT
#define ELKESZULT 0 /// ha mégse definiálta
#endif
#if ELKESZULT < 0 /// ha hibásan definiálta
#undef ELKESZULT
#define ELKESZULT 0
#endif
/// ------- Ellenőrző rész vége ----------
using std::cout;
using std::endl;
/// Összegző funktor (6. részfeladathoz)
/// ELKESZULT == 15-höz
struct Sum {
int sum;
Sum(int s=0) :sum(s) {}
void operator()(int i) { sum += i;}
};
/// Egyszerű C stílusú tömbök, amiből majd az adatokat vesszük
int itomb[] = { -5, 11, 13, -2, -1, 0, 1, -82, 3, 4 };
double dtomb[] = { .0, .1, .2, .3, 4.4, -12.4, 8.7 };
const char* txtomb[] = { "C#" , "C", "C++", "Java", "C++11" };
int main() {
try {
/// az int tömbből létrehozuk az intarr0-át
Array<int> intarr0(itomb, itomb+10);
/// a double tömbből létrehozzuk a dblarr0-át
Array<double, 20> dblarr0(dtomb, dtomb+7);
/// const char* tömbből pedig létrehozzuk a txarray-t
Array<const char*> txarray(txtomb, txtomb+5);
#if ELKESZULT <= 11 // csak az elején, hogy máskor ne zavarjon a kivétel
/// szándékosan rosszul indexelünk
cout << intarr0.at(112);
#endif // ELKESZULT <= 11
#if ELKESZULT >= 12
/// Kiírjuk a tömböket.
PrintArray("intarr0", intarr0);
PrintArray("dblarr0", dblarr0);
PrintArray("txarray", txarray);
/// Adatokat is kiírja?
TEST(PrintArray, adat) {
char cpp[] = "C++";
Array<char, 10> carr(cpp, cpp+3); /// létrehozzuk
std::stringstream out; /// ide ír, az out adatfolyamba
PrintArray("cpp", carr, out);
// out-nak a sztring "arcát" összehasonlítjuk az elvárt sztringgel
EXPECT_EQ(std::string("cpp size=3 capacity=10\n\t data=C,+,+\n"), out.str()) << "== Nem jo a kiiras formatuma!\n";
END }
#endif // ELKESZULT >= 12
#if ELKESZULT >= 13
/// Ellenőrizzük az Array post-inkremens iterátorát:
Array<int>::iterator i1, i2;
i1 = i2 = intarr0.begin();
if (i1 != i2++) { cout << "** HIBAS az iterator post-inkremens operatora **\n"; }
#endif // ELKESZULT >= 13
#if ELKESZULT >=14
/// intarr0-ból létrehozzuk az intarr1-et
Array<int, 100> intarr1(intarr0.begin(), intarr0.end());
/// Kiírjuk az elemeket.
PrintArray("\bintarr1", intarr1);
#endif // ELKESZULT >= 14
#if ELKESZULT >= 15
// Számlálja össze az intarr1-ben az 5-nél nagyobb elemeket!
// Használja a korábban elkészített szamol_ha sablont!
int db =
cout << "\nintarr1-ben 5-nel nagyobb: ";
cout << db << " db" << endl;
#endif // ELKESZULT >= 15
#if ELKESZULT >= 16
Sum s = forEach(intarr1.begin(), intarr1.end(), Sum());
cout << "\nintarr0 osszegzes forEach segitsegevel: " << s.sum << endl;
#endif // ELKESZULT >= 16
#if ELKESZULT >= 17
cout << "intarr0 kiiras forEach segtisegevel: ";
ostreamFunctor<int> out(cout, ",");
forEach(intarr1.begin(), intarr1.end(), out);
cout << endl;
#endif // ELKESZULT >= 17
#if ELKESZULT >= 18
/// Itt valamilyen memóriaszemét lesz
cout << "\nMemoriaszemet: " << intarr1.at(12) << endl;
/// Itt meg nincs memóriaszemét. Miért?
Array<Integer,100> Ia;
cout << "Ez meg nulla: "<< Ia.at(12) << endl;
#endif // ELKESZULT >= 18
} catch (std::exception& e) { // az out_of_range, és a runtime_error is az exception
// osztályból származik. Így azok kompatibilisek
// az alaposztállyal
cout << e.what() << endl;
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{DE168991-4F63-46C2-82A1-4133088E7B92}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>genarray</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v110</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v110</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="gen_array_iter3.hpp" />
<ClInclude Include="integer.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="gen_array_iter3_test.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="gen_array_iter3.hpp">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="integer.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="gen_array_iter3_test.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
\ No newline at end of file
/*
* \file integer.h
*/
#ifndef INTEGER_H
#define INTEGER_H
/// Integer osztály.
/// A konverziós operátorok és a C automatikus konverziós szabályai
/// miatt az osztály példányai úgy használhatók mint egy int változó.
class Integer {
int adat;
public:
Integer(int i = 0) :adat(i) {} /// konstruktor és egyben konverziós operátor
operator int&() { return adat; }/// cast
operator int() const { return adat; } /// const cast
int* operator&() { return &adat; }
const int* operator&() const { return &adat; }
virtual ~Integer() {}
};
#endif // INTEGER_H
#ifndef ISCLASS_HPP
#define ISCLASS_HPP
template <class T>
struct IsClass {
template<class X> static char Test(int X::*);
template<class X> static long Test(...);
enum { Yes = sizeof(Test<T>(0)) == 1 };
enum { No = !Yes };
};
#endif // ISCLASS_HPP
/*
* \file fancy_iterators.hpp
*
*/
#ifndef FANCY_ITERATORS_HPP
#define FANCY_ITERATORS_HPP
/// counting iterator.
/// Végtelen számláló.
/// Olyan típusokra példányosítható, aminek van pre-inkremens operátora.
template <typename T>
class counting_iterator {
T t;
public:
/// Konstruktor
/// @param t - kezdőérték
counting_iterator(T t = T()) : t(t) {}
/// Összehasonlító operátorok
bool operator==(const counting_iterator& rhs) const { return t == rhs.t; }
bool operator!=(const counting_iterator& rhs) const { return !operator==(rhs); }
/// pre-inkremens
/// csak hatékonyság miatt ref. visszatérésű
/// értelmetlen balértékként használni
const counting_iterator& operator++() { ++t; return *this; }
/// post-inkremens
counting_iterator operator++(int) {
counting_iterator tmp = *this; /// eltesszük a jelenlegi értéket
operator++();
return tmp; /// léptetés előttivel tér vissza
}
/// dereferálás
/// nem engedjük balértékként használni, ne változtathassa meg a sorozatot
const T& operator*() const { return t; }
/// szelekció pointerrel, ami címet kell, hogy adjon
/// csak formai, mert csak privát adattag lenne elérhető, így nem lehet használni
const T* operator->() const { return &operator*(); }
};
#endif // FANCY_ITERATORS_HPP
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="generikus2" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/genalg" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin/Release/genalg" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-pedantic" />
<Add option="-std=c++11" />
<Add option="-Wall" />
<Add option="-Werror" />
</Compiler>
<Unit filename="fancy_iterators.hpp" />
<Unit filename="generikus2_teszt.cpp" />
<Unit filename="gtest_lite.h" />
<Extensions>
<code_completion />
<envvars />
<debugger />
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{79C9E9C3-84CB-413A-955A-A97D07617647}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>generikus2</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v110</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="integer.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="generikus2_teszt.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="integer.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="generikus2_teszt.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
#include <iostream>
#include <string>
#include <sstream>
#include "sablonok.hpp"
#include "fancy_iterators.hpp"
#include "gtest_lite.h"
/// Ellenőrizzük, hogy a sablonok.hpp-ben definiálta-e az ELKESZULT makrót
#ifndef ELKESZULT
#define ELKESZULT 0 /// ha mégse definiálta
#endif
#if ELKESZULT < 0 /// ha hibásan definiálta
#undef ELKESZULT
#define ELKESZULT 0
#endif
/// ------- Ellenőrző rész vége ----------
int itomb[] = { 1, 8, -3, 4, 5 };
double dtomb[] = { 1.2, -2.1, 3.91, -4.1, 5.1, -10 };
int main() {
GTINIT(std::cin); // Csak C(J)PORTA működéséhez kell
#if ELKESZULT == 1
/// kiírás cout-ra, paraméter: [first, last)
printEach(itomb, itomb+5);
std::cout << std::endl;
printEach(dtomb, dtomb+5);
#endif // TESZLEVEL == 1
#if ELKESZULT == 2
/// paraméterként megadható a stream is
printEach(itomb, itomb+5, std::cout);
std::cout << std::endl;
// default paraméterrel is kipróbáljuk
printEach(dtomb, dtomb+5);
#endif // TESZLEVEL == 2
#if ELKESZULT >= 3
/// paraméterként megadható a formátum is
TEST(printEach, format) {
std::stringstream out;
printEach(itomb, itomb+4, out, "; ");
EXPECT_EQ(std::string("1; 8; -3; 4\n"), out.str());
out.str("");
printEach(itomb, itomb+3, out, "// ");
EXPECT_EQ(std::string("1// 8// -3\n"), out.str());
END }
#endif // ELKESZULT >=3
#if ELKESZULT >= 4
/// Annak vizsgálata, hogy a pre/post-inkremens operátorokon
/// kívül használ-e más aritmetikai operátort a printEach.
/// Ha használt, akkor nem fog lefordulni ez a rész.
/// Javítsa a kódot.
counting_iterator<int> i1(10), i2(15); /// speciális iterátor ami sorozatot ad
printEach(i1, i2);
#endif // ELKESZULT >= 4
#if ELKESZULT >= 5
/// Számol ha sablon tesztjei
TEST(szamol_ha_negativ, int) {
EXPECT_EQ(1, szamol_ha_negativ(itomb, itomb+5));
END }
TEST(szamol_ha_negativ, double) {
EXPECT_EQ(3, szamol_ha_negativ(dtomb, dtomb+6));
END }
#endif // ELKESZULT >=5
#if ELKESZULT >= 6
/// Nagyobb mint funktor tesztjei
TEST(nyagobb_mint3, int) {
nagyobb_mint<int> nm_3(3); // konstruktor megjegyzi a 3-at
EXPECT_TRUE(nm_3(4)); // meghívjuk a függvényhívás operátorát
END }
TEST(nyagobb_mint10, int) {
nagyobb_mint<int> nm_10(10); // konstruktor megjegyzi a 10-et
EXPECT_FALSE(nm_10(4)); // meghívjuk a függvényhívás operátorát
END }
TEST(nyagobb_mint314, double) {
nagyobb_mint<double> nm314(3.14); // konstruktor megjegyzi a 3.14-et
EXPECT_TRUE(nm314(4)); // meghívjuk a függvényhívás operátorát
END }
#endif // ELKESZULT >=6
#if ELKESZULT >= 7
/// szamol_ha funktorral
TEST(szamol_ha, int) {
EXPECT_EQ(3, szamol_ha(itomb, itomb+5, nagyobb_mint<int>(3)));
END }
TEST(szamol_ha, double) {
EXPECT_EQ(2, szamol_ha(dtomb, dtomb+6, nagyobb_mint<double>(3.14)));
END }
#endif // ELKESZULT >=7
/// Itt a vége
std::cout << "ELKESZULT = " << ELKESZULT << std::endl;
if (ELKESZULT < 2 && !gtest_lite::test.fail())
FAIL() << "\nMind a 7 feladatot oldja meg!" << std::endl;
if (ELKESZULT >= 7 && !gtest_lite::test.fail())
std::cout << "Szuper! Mind kesz" << std::endl;
GTEND(std::cerr); // Csak C(J)PORTA működéséhez kell
return 0;
}
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