diff options
| -rw-r--r-- | ue5/Makefile | 3 | ||||
| -rw-r--r-- | ue5/array.hpp | 136 | ||||
| -rw-r--r-- | ue5/mean_mark.hpp | 14 | ||||
| -rw-r--r-- | ue5/shared_ptr.hpp | 99 | ||||
| -rw-r--r-- | ue5/verwendung.cpp | 258 |
5 files changed, 295 insertions, 215 deletions
diff --git a/ue5/Makefile b/ue5/Makefile index 2c98aaa..53fd8f5 100644 --- a/ue5/Makefile +++ b/ue5/Makefile | |||
| @@ -30,6 +30,9 @@ debug: | |||
| 30 | clean: | 30 | clean: |
| 31 | rm -f $(OBJS) $(BIN) | 31 | rm -f $(OBJS) $(BIN) |
| 32 | 32 | ||
| 33 | run test: all | ||
| 34 | @./test/test.sh | ||
| 35 | |||
| 33 | .PHONY: clean | 36 | .PHONY: clean |
| 34 | 37 | ||
| 35 | # vim600: noet sw=8 ts=8 | 38 | # vim600: noet sw=8 ts=8 |
diff --git a/ue5/array.hpp b/ue5/array.hpp index 19cdc02..37a33b4 100644 --- a/ue5/array.hpp +++ b/ue5/array.hpp | |||
| @@ -2,44 +2,116 @@ | |||
| 2 | #define ARRAY_H | 2 | #define ARRAY_H |
| 3 | 3 | ||
| 4 | #undef SOLVED_2 | 4 | #undef SOLVED_2 |
| 5 | //#define SOLVED_2 | 5 | #define SOLVED_2 |
| 6 | 6 | ||
| 7 | /* TODO Includes */ | 7 | /* TODO: |
| 8 | * Angabe: Im Gegensatz zu den Beispielen bis jetzt ist die Verwendung | ||
| 9 | * der STL und Boostuntersagt! | ||
| 10 | */ | ||
| 11 | #include <utility> // for std::move | ||
| 12 | #include <stdexcept> // for std::out_of_range | ||
| 13 | #include <algorithm> // for std::fill_n + std::swap_ranges | ||
| 8 | 14 | ||
| 9 | namespace Ti | 15 | namespace Ti |
| 10 | { | 16 | { |
| 17 | template<typename T, size_t N> | ||
| 18 | struct array | ||
| 19 | { | ||
| 20 | typedef T& reference; | ||
| 21 | typedef const T& const_reference; | ||
| 22 | typedef T* iterator; | ||
| 23 | typedef const T* const_iterator; | ||
| 24 | typedef size_t size_type; | ||
| 11 | 25 | ||
| 12 | /* TODO */ | 26 | static_assert(N != 0, "array<T, 0> not allowed"); |
| 13 | struct array | 27 | |
| 14 | { | 28 | void fill (const T& u) |
| 15 | /* TODO typedef */ | 29 | { |
| 16 | 30 | std::fill_n(begin(), size(), u); | |
| 17 | /* TODO static_assert */ | 31 | } |
| 18 | 32 | ||
| 19 | /* TODO: | 33 | void swap (array<T,N> & other) |
| 20 | void fill (const T& u); | 34 | { |
| 21 | void swap (array<T,N> & other); | 35 | std::swap_ranges(begin(), end(), other.begin()); |
| 22 | iterator begin(); | 36 | } |
| 23 | const_iterator begin() const; | 37 | |
| 24 | iterator end(); | 38 | iterator begin() |
| 25 | const_iterator end() const; | 39 | { |
| 26 | size_type size() const; | 40 | return m_data; |
| 27 | size_type max_size() const; | 41 | } |
| 28 | bool empty() const; | 42 | |
| 29 | reference operator[] (size_type n); | 43 | const_iterator begin() const |
| 30 | const_reference operator[] (size_type n) const; | 44 | { |
| 31 | reference at(size_type n); | 45 | return m_data; |
| 32 | const_reference at (size_type n) const; | 46 | } |
| 33 | T* data(); | 47 | |
| 34 | */ | 48 | iterator end() |
| 35 | 49 | { | |
| 36 | private: | 50 | return m_data + size(); |
| 37 | /* TODO data */ | 51 | } |
| 38 | }; | 52 | |
| 39 | 53 | const_iterator end() const | |
| 40 | /* TODO */ | 54 | { |
| 41 | array/* TODO */&& make_array(); | 55 | return m_data + size(); |
| 56 | } | ||
| 57 | |||
| 58 | size_type size() const | ||
| 59 | { | ||
| 60 | return N; | ||
| 61 | } | ||
| 62 | |||
| 63 | size_type max_size() const | ||
| 64 | { | ||
| 65 | return N; | ||
| 66 | } | ||
| 67 | |||
| 68 | bool empty() const | ||
| 69 | { | ||
| 70 | return false; /* size() == 0 */ | ||
| 71 | } | ||
| 72 | |||
| 73 | reference operator[] (size_type n) | ||
| 74 | { | ||
| 75 | return m_data[n]; | ||
| 76 | } | ||
| 77 | |||
| 78 | const_reference operator[] (size_type n) const | ||
| 79 | { | ||
| 80 | return m_data[n]; | ||
| 81 | } | ||
| 82 | |||
| 83 | reference at(size_type n) | ||
| 84 | { | ||
| 85 | if (n >= size()) | ||
| 86 | throw std::out_of_range("array::at"); | ||
| 87 | return m_data[n]; | ||
| 88 | } | ||
| 89 | |||
| 90 | const_reference at (size_type n) const | ||
| 91 | { | ||
| 92 | if (n >= size()) | ||
| 93 | throw std::out_of_range("array::at"); | ||
| 94 | return m_data[n]; | ||
| 95 | } | ||
| 96 | |||
| 97 | T* data() | ||
| 98 | { | ||
| 99 | return m_data; | ||
| 100 | } | ||
| 101 | |||
| 102 | private: | ||
| 103 | T m_data[N]; | ||
| 104 | }; | ||
| 105 | |||
| 106 | /* TODO: was macht std::move() genau?! :) */ | ||
| 107 | template<typename T, size_t N> | ||
| 108 | array<T, N>&& make_array() | ||
| 109 | { | ||
| 110 | return std::move(array<T, N>()); | ||
| 111 | } | ||
| 42 | 112 | ||
| 43 | } // namespace | 113 | } // namespace |
| 44 | 114 | ||
| 45 | #endif | 115 | #endif |
| 116 | |||
| 117 | /* vim: set et sw=2 ts=2: */ | ||
diff --git a/ue5/mean_mark.hpp b/ue5/mean_mark.hpp index 671090a..f35910c 100644 --- a/ue5/mean_mark.hpp +++ b/ue5/mean_mark.hpp | |||
| @@ -7,15 +7,17 @@ | |||
| 7 | namespace Ti | 7 | namespace Ti |
| 8 | { | 8 | { |
| 9 | 9 | ||
| 10 | template <typename Iter> | 10 | template <typename Iter> |
| 11 | double mean_mark(Iter first, Iter last); | 11 | double mean_mark(Iter first, Iter last); |
| 12 | 12 | ||
| 13 | template <typename Iter> | 13 | template <typename Iter> |
| 14 | double mean_mark_student(Iter first, Iter last); | 14 | double mean_mark_student(Iter first, Iter last); |
| 15 | 15 | ||
| 16 | template <class ForwardIterator> | 16 | template <class ForwardIterator> |
| 17 | ForwardIterator remove_greater (ForwardIterator first, ForwardIterator last, int mark); | 17 | ForwardIterator remove_greater (ForwardIterator first, ForwardIterator last, int mark); |
| 18 | 18 | ||
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | #endif | 21 | #endif |
| 22 | |||
| 23 | /* vim: set et sw=2 ts=2: */ | ||
diff --git a/ue5/shared_ptr.hpp b/ue5/shared_ptr.hpp index 87e4b01..4492fff 100644 --- a/ue5/shared_ptr.hpp +++ b/ue5/shared_ptr.hpp | |||
| @@ -8,78 +8,79 @@ | |||
| 8 | 8 | ||
| 9 | namespace Ti { | 9 | namespace Ti { |
| 10 | 10 | ||
| 11 | /* TODO helpers */ | 11 | /* TODO helpers */ |
| 12 | 12 | ||
| 13 | template <typename T> | 13 | template <typename T> |
| 14 | class shared_ptr | 14 | class shared_ptr |
| 15 | { | 15 | { |
| 16 | private: | 16 | private: |
| 17 | /* TODO data */ | 17 | /* TODO data */ |
| 18 | 18 | ||
| 19 | public: | 19 | public: |
| 20 | shared_ptr(); | 20 | shared_ptr(); |
| 21 | T* get() const; | 21 | T* get() const; |
| 22 | shared_ptr (const shared_ptr<T>& other); | 22 | shared_ptr (const shared_ptr<T>& other); |
| 23 | 23 | ||
| 24 | template <typename O> | 24 | template <typename O> |
| 25 | shared_ptr (const shared_ptr<O>& other); | 25 | shared_ptr (const shared_ptr<O>& other); |
| 26 | 26 | ||
| 27 | template <typename O> | 27 | template <typename O> |
| 28 | explicit shared_ptr (O* p); | 28 | explicit shared_ptr (O* p); |
| 29 | shared_ptr& operator = (const shared_ptr<T>& other); | 29 | shared_ptr& operator = (const shared_ptr<T>& other); |
| 30 | 30 | ||
| 31 | template <typename O> | 31 | template <typename O> |
| 32 | shared_ptr& operator = (const shared_ptr<O>& other); | 32 | shared_ptr& operator = (const shared_ptr<O>& other); |
| 33 | 33 | ||
| 34 | ~shared_ptr (); | 34 | ~shared_ptr (); |
| 35 | T& operator * () const; | 35 | T& operator * () const; |
| 36 | T* operator -> () const; | 36 | T* operator -> () const; |
| 37 | 37 | ||
| 38 | void swap (shared_ptr<T>& other); | 38 | void swap (shared_ptr<T>& other); |
| 39 | 39 | ||
| 40 | inline void reset(); | 40 | inline void reset(); |
| 41 | 41 | ||
| 42 | private: | 42 | private: |
| 43 | template <typename R, typename... Args> | 43 | template <typename R, typename... Args> |
| 44 | friend shared_ptr<R> make_shared (Args...); | 44 | friend shared_ptr<R> make_shared (Args...); |
| 45 | 45 | ||
| 46 | template<typename U1, typename U2> | 46 | template<typename U1, typename U2> |
| 47 | friend bool operator == (const shared_ptr<U1>& a, const shared_ptr<U2>& b); | 47 | friend bool operator == (const shared_ptr<U1>& a, const shared_ptr<U2>& b); |
| 48 | 48 | ||
| 49 | template<typename U1, typename U2> | 49 | template<typename U1, typename U2> |
| 50 | friend bool operator == (const shared_ptr<U1>& a, const U2* b); | 50 | friend bool operator == (const shared_ptr<U1>& a, const U2* b); |
| 51 | 51 | ||
| 52 | template<typename U1, typename U2> | 52 | template<typename U1, typename U2> |
| 53 | friend bool operator == (const U1* a, const shared_ptr<U2>& b); | 53 | friend bool operator == (const U1* a, const shared_ptr<U2>& b); |
| 54 | 54 | ||
| 55 | template<typename U1, typename U2> | 55 | template<typename U1, typename U2> |
| 56 | friend bool operator != (const shared_ptr<U1>& a, const U2* b); | 56 | friend bool operator != (const shared_ptr<U1>& a, const U2* b); |
| 57 | 57 | ||
| 58 | template<typename U1, typename U2> | 58 | template<typename U1, typename U2> |
| 59 | friend bool operator != (const U1* a, const shared_ptr<U2>& b); | 59 | friend bool operator != (const U1* a, const shared_ptr<U2>& b); |
| 60 | 60 | ||
| 61 | template<typename U1, typename U2> | 61 | template<typename U1, typename U2> |
| 62 | friend bool operator != (const shared_ptr<U1>& a, const shared_ptr<U2>& b); | 62 | friend bool operator != (const shared_ptr<U1>& a, const shared_ptr<U2>& b); |
| 63 | 63 | ||
| 64 | template <typename R, typename F> | 64 | template <typename R, typename F> |
| 65 | friend shared_ptr<R> shared_dynamic_cast (const shared_ptr<F>& from); | 65 | friend shared_ptr<R> shared_dynamic_cast (const shared_ptr<F>& from); |
| 66 | }; | 66 | }; |
| 67 | 67 | ||
| 68 | 68 | ||
| 69 | template <typename T /* TODO */ > | 69 | template <typename T /* TODO */ > |
| 70 | shared_ptr<T> make_shared (/* TODO */); | 70 | shared_ptr<T> make_shared (/* TODO */); |
| 71 | 71 | ||
| 72 | 72 | template <typename T, typename F> | |
| 73 | template <typename T, typename F> | 73 | shared_ptr<T> shared_dynamic_cast (const shared_ptr<F>& from); |
| 74 | shared_ptr<T> shared_dynamic_cast (const shared_ptr<F>& from); | ||
| 75 | 74 | ||
| 76 | } // end namespace ti | 75 | } // end namespace ti |
| 77 | 76 | ||
| 78 | namespace std { | 77 | namespace std { |
| 79 | using namespace Ti; | 78 | using namespace Ti; |
| 80 | template <typename T> | 79 | template <typename T> |
| 81 | inline void swap (shared_ptr<T>& t1, shared_ptr<T>& t2); | 80 | inline void swap (shared_ptr<T>& t1, shared_ptr<T>& t2); |
| 82 | /* TODO */ | 81 | /* TODO */ |
| 83 | } | 82 | } |
| 84 | 83 | ||
| 85 | #endif | 84 | #endif |
| 85 | |||
| 86 | /* vim: set et sw=2 ts=2: */ | ||
diff --git a/ue5/verwendung.cpp b/ue5/verwendung.cpp index b3506c0..9e10326 100644 --- a/ue5/verwendung.cpp +++ b/ue5/verwendung.cpp | |||
| @@ -5,33 +5,33 @@ | |||
| 5 | 5 | ||
| 6 | struct Person | 6 | struct Person |
| 7 | { | 7 | { |
| 8 | Person (){} | 8 | Person (){} |
| 9 | virtual int mark(){ return 0; } | 9 | virtual int mark(){ return 0; } |
| 10 | virtual ~Person(){} | 10 | virtual ~Person(){} |
| 11 | }; | 11 | }; |
| 12 | 12 | ||
| 13 | struct Student : Person | 13 | struct Student : Person |
| 14 | { | 14 | { |
| 15 | int m_mark; | 15 | int m_mark; |
| 16 | Student (int mark) : | 16 | Student (int mark) : |
| 17 | m_mark(mark) | 17 | m_mark(mark) |
| 18 | {} | 18 | {} |
| 19 | int mark() | 19 | int mark() |
| 20 | { | 20 | { |
| 21 | return m_mark; | 21 | return m_mark; |
| 22 | } | 22 | } |
| 23 | }; | 23 | }; |
| 24 | 24 | ||
| 25 | struct Pupil : Person | 25 | struct Pupil : Person |
| 26 | { | 26 | { |
| 27 | int m_mark; | 27 | int m_mark; |
| 28 | Pupil (int mark) : | 28 | Pupil (int mark) : |
| 29 | m_mark(mark) | 29 | m_mark(mark) |
| 30 | {} | 30 | {} |
| 31 | int mark() | 31 | int mark() |
| 32 | { | 32 | { |
| 33 | return m_mark; | 33 | return m_mark; |
| 34 | } | 34 | } |
| 35 | }; | 35 | }; |
| 36 | 36 | ||
| 37 | #include <memory> | 37 | #include <memory> |
| @@ -68,151 +68,153 @@ using std::vector; | |||
| 68 | 68 | ||
| 69 | int main() | 69 | int main() |
| 70 | { | 70 | { |
| 71 | try { | 71 | try { |
| 72 | // initialize with new expression | 72 | // initialize with new expression |
| 73 | shared_ptr<Student> n1 (new Student(5)); | 73 | shared_ptr<Student> n1 (new Student(5)); |
| 74 | assert (n1.get() != 0); | 74 | assert (n1.get() != 0); |
| 75 | shared_ptr<Person> n2 (new Person); | 75 | shared_ptr<Person> n2 (new Person); |
| 76 | assert (n2.get() != 0); | 76 | assert (n2.get() != 0); |
| 77 | 77 | ||
| 78 | throw 0; // must be exception safe | 78 | throw 0; // must be exception safe |
| 79 | } catch (...) | 79 | } catch (...) |
| 80 | {} | 80 | {} |
| 81 | 81 | ||
| 82 | 82 | ||
| 83 | { | 83 | { |
| 84 | // derived1 is 0. | 84 | // derived1 is 0. |
| 85 | shared_ptr<Student> derived1; | 85 | shared_ptr<Student> derived1; |
| 86 | assert(derived1.get() == 0); | 86 | assert(derived1.get() == 0); |
| 87 | 87 | ||
| 88 | // Other way for object creation | 88 | // Other way for object creation |
| 89 | derived1 = make_shared<Student>(3); | 89 | derived1 = make_shared<Student>(3); |
| 90 | assert(derived1.get() != 0); | 90 | assert(derived1.get() != 0); |
| 91 | 91 | ||
| 92 | // Call object member | 92 | // Call object member |
| 93 | derived1->mark(); | 93 | derived1->mark(); |
| 94 | 94 | ||
| 95 | // Object creation with constructor parameters | 95 | // Object creation with constructor parameters |
| 96 | shared_ptr<Student> derived2 = make_shared<Student>(4); | 96 | shared_ptr<Student> derived2 = make_shared<Student>(4); |
| 97 | assert (derived2.get() != 0); | 97 | assert (derived2.get() != 0); |
| 98 | 98 | ||
| 99 | shared_ptr<Person> base1 = make_shared<Person>(); | 99 | shared_ptr<Person> base1 = make_shared<Person>(); |
| 100 | assert (base1.get() != 0); | 100 | assert (base1.get() != 0); |
| 101 | 101 | ||
| 102 | // Implicit upcast possible. The object make_sharedd in the previous line is | 102 | // Implicit upcast possible. The object make_sharedd in the previous line is |
| 103 | // destroyed, because there are no more pointers referencing it. | 103 | // destroyed, because there are no more pointers referencing it. |
| 104 | base1 = derived1; | 104 | base1 = derived1; |
| 105 | 105 | ||
| 106 | #ifdef SOLVED_1 | 106 | #ifdef SOLVED_1 |
| 107 | // Explicit downcast possible. Some casts that are available: constCast, | 107 | // Explicit downcast possible. Some casts that are available: constCast, |
| 108 | // staticCast, dynamicCast | 108 | // staticCast, dynamicCast |
| 109 | derived2 = shared_dynamic_cast<Student>(base1); | 109 | derived2 = shared_dynamic_cast<Student>(base1); |
| 110 | 110 | ||
| 111 | // You can compare pointers. | 111 | // You can compare pointers. |
| 112 | assert(derived1 == derived2); | 112 | assert(derived1 == derived2); |
| 113 | #endif | 113 | #endif |
| 114 | 114 | ||
| 115 | // Destroy most references to derived instance. References | 115 | // Destroy most references to derived instance. References |
| 116 | // (but not the object itself) are destroyed if they go out | 116 | // (but not the object itself) are destroyed if they go out |
| 117 | // of scope, or you can force reference destruction by multiple ways. | 117 | // of scope, or you can force reference destruction by multiple ways. |
| 118 | derived1.reset(); // release reference | 118 | derived1.reset(); // release reference |
| 119 | assert(derived1.get() == 0); | 119 | assert(derived1.get() == 0); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | 122 | ||
| 123 | { | 123 | { |
| 124 | // array<int, 0> x; // Should fail with static assertion | 124 | // array<int, 0> x; // Should fail with static assertion |
| 125 | 125 | ||
| 126 | typedef array<shared_ptr<Student>, 5> sarray; | 126 | typedef array<shared_ptr<Student>, 5> sarray; |
| 127 | sarray a; | 127 | sarray a; |
| 128 | a [0] = shared_ptr<Student>(new Student(2)); | 128 | a [0] = shared_ptr<Student>(new Student(2)); |
| 129 | a [1] = shared_ptr<Student>(new Student(1)); | 129 | a [1] = shared_ptr<Student>(new Student(1)); |
| 130 | a [2] = shared_ptr<Student>(new Student(5)); | 130 | a [2] = shared_ptr<Student>(new Student(5)); |
| 131 | a [3] = shared_ptr<Student>(new Student(4)); | 131 | a [3] = shared_ptr<Student>(new Student(4)); |
| 132 | a [4] = shared_ptr<Student>(); | 132 | a [4] = shared_ptr<Student>(); |
| 133 | assert(a[0].get() != 0); | 133 | assert(a[0].get() != 0); |
| 134 | assert(a[4].get() == 0); | 134 | assert(a[4].get() == 0); |
| 135 | a [4] = shared_ptr<Student>(new Student(4)); | 135 | a [4] = shared_ptr<Student>(new Student(4)); |
| 136 | 136 | ||
| 137 | try { | 137 | try { |
| 138 | a.at(5); // throws exception | 138 | a.at(5); // throws exception |
| 139 | assert(0); | 139 | assert(0); |
| 140 | } catch (std::out_of_range const& oor) { | 140 | } catch (std::out_of_range const& oor) { |
| 141 | oor.what(); | 141 | oor.what(); |
| 142 | } catch (...) { | 142 | } catch (...) { |
| 143 | assert(0); | 143 | assert(0); |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | #ifdef SOLVED_2 | 146 | #ifdef SOLVED_2 |
| 147 | array<int,3> a1 = make_array<int,3>(); | 147 | array<int,3> a1 = make_array<int,3>(); |
| 148 | a1.fill(3); | 148 | a1.fill(3); |
| 149 | 149 | ||
| 150 | array<int,3> a2 = make_array<int,3>(); | 150 | array<int,3> a2 = make_array<int,3>(); |
| 151 | a2.fill(4); | 151 | a2.fill(4); |
| 152 | 152 | ||
| 153 | a1.swap(a2); | 153 | a1.swap(a2); |
| 154 | assert(a1[0] == 4); | 154 | assert(a1[0] == 4); |
| 155 | assert(a2[2] == 3); | 155 | assert(a2[2] == 3); |
| 156 | #endif | 156 | #endif |
| 157 | 157 | ||
| 158 | #ifdef SOLVED_3 | 158 | #ifdef SOLVED_3 |
| 159 | double mean = mean_mark(a.begin(), a.end()); | 159 | double mean = mean_mark(a.begin(), a.end()); |
| 160 | assert (mean >= 3.1 || mean <= 3.3); | 160 | assert (mean >= 3.1 || mean <= 3.3); |
| 161 | 161 | ||
| 162 | double mean_student = mean_mark_student(a.begin(), a.end()); | 162 | double mean_student = mean_mark_student(a.begin(), a.end()); |
| 163 | assert (mean_student >= 3.1 || mean_student <= 3.3); | 163 | assert (mean_student >= 3.1 || mean_student <= 3.3); |
| 164 | 164 | ||
| 165 | sarray::iterator end = remove_greater(a.begin(), a.end(), 3); | 165 | sarray::iterator end = remove_greater(a.begin(), a.end(), 3); |
| 166 | double mean2 = mean_mark(a.begin(), end); | 166 | double mean2 = mean_mark(a.begin(), end); |
| 167 | assert (mean2 >= 1.4 || mean2 <= 1.6); | 167 | assert (mean2 >= 1.4 || mean2 <= 1.6); |
| 168 | #endif | 168 | #endif |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | 171 | ||
| 172 | { | 172 | { |
| 173 | typedef array<shared_ptr<Person>, 5> parray; | 173 | typedef array<shared_ptr<Person>, 5> parray; |
| 174 | parray m; | 174 | parray m; |
| 175 | m [0] = shared_ptr<Student>(new Student(2)); | 175 | m [0] = shared_ptr<Student>(new Student(2)); |
| 176 | m [1] = shared_ptr<Pupil>(new Pupil(1)); | 176 | m [1] = shared_ptr<Pupil>(new Pupil(1)); |
| 177 | m [2] = shared_ptr<Student>(new Student(5)); | 177 | m [2] = shared_ptr<Student>(new Student(5)); |
| 178 | m [3] = shared_ptr<Student>(new Student(4)); | 178 | m [3] = shared_ptr<Student>(new Student(4)); |
| 179 | m [4] = shared_ptr<Person>(new Person()); | 179 | m [4] = shared_ptr<Person>(new Person()); |
| 180 | 180 | ||
| 181 | #ifdef SOLVED_3 | 181 | #ifdef SOLVED_3 |
| 182 | double mean = mean_mark(m.begin(), m.end()); | 182 | double mean = mean_mark(m.begin(), m.end()); |
| 183 | assert (mean >= 2.3 || mean <= 2.5); | 183 | assert (mean >= 2.3 || mean <= 2.5); |
| 184 | 184 | ||
| 185 | double mean_student = mean_mark_student(m.begin(), m.end()); | 185 | double mean_student = mean_mark_student(m.begin(), m.end()); |
| 186 | assert (mean_student >= 3.6 || mean_student <= 3.8); | 186 | assert (mean_student >= 3.6 || mean_student <= 3.8); |
| 187 | 187 | ||
| 188 | parray::iterator end = remove_greater(m.begin(), m.end(), 3); | 188 | parray::iterator end = remove_greater(m.begin(), m.end(), 3); |
| 189 | double mean2 = mean_mark(m.begin(), end); | 189 | double mean2 = mean_mark(m.begin(), end); |
| 190 | assert (mean2 >= 0.9 || mean2 <= 1.1); | 190 | assert (mean2 >= 0.9 || mean2 <= 1.1); |
| 191 | #endif | 191 | #endif |
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | { | 194 | { |
| 195 | vector<shared_ptr<Person>> m; | 195 | vector<shared_ptr<Person>> m; |
| 196 | m.push_back(shared_ptr<Student>(new Student(2))); | 196 | m.push_back(shared_ptr<Student>(new Student(2))); |
| 197 | m.push_back(shared_ptr<Pupil>(new Pupil(1))); | 197 | m.push_back(shared_ptr<Pupil>(new Pupil(1))); |
| 198 | m.push_back(shared_ptr<Student>(new Student(5))); | 198 | m.push_back(shared_ptr<Student>(new Student(5))); |
| 199 | m.push_back(shared_ptr<Student>(new Student(4))); | 199 | m.push_back(shared_ptr<Student>(new Student(4))); |
| 200 | m.push_back(shared_ptr<Person>(new Person())); | 200 | m.push_back(shared_ptr<Person>(new Person())); |
| 201 | 201 | ||
| 202 | #ifdef SOLVED_3 | 202 | #ifdef SOLVED_3 |
| 203 | double mean = mean_mark(m.begin(), m.end()); | 203 | double mean = mean_mark(m.begin(), m.end()); |
| 204 | assert (mean >= 2.3 || mean <= 2.5); | 204 | assert (mean >= 2.3 || mean <= 2.5); |
| 205 | 205 | ||
| 206 | double mean_student = mean_mark_student(m.begin(), m.end()); | 206 | double mean_student = mean_mark_student(m.begin(), m.end()); |
| 207 | assert (mean_student >= 3.6 || mean_student <= 3.8); | 207 | assert (mean_student >= 3.6 || mean_student <= 3.8); |
| 208 | 208 | ||
| 209 | assert(m.size() == 5); | 209 | assert(m.size() == 5); |
| 210 | m.erase(remove_greater(m.begin(), m.end(), 3), m.end()); | 210 | m.erase(remove_greater(m.begin(), m.end(), 3), m.end()); |
| 211 | assert(m.size() == 3); | 211 | assert(m.size() == 3); |
| 212 | 212 | ||
| 213 | double mean2 = mean_mark(m.begin(), m.end()); | 213 | double mean2 = mean_mark(m.begin(), m.end()); |
| 214 | assert (mean2 >= 0.9 || mean2 <= 1.1); | 214 | assert (mean2 >= 0.9 || mean2 <= 1.1); |
| 215 | #endif | 215 | #endif |
| 216 | } | 216 | } |
| 217 | 217 | ||
| 218 | } | 218 | } |
| 219 | |||
| 220 | /* vim: set et sw=2 ts=2: */ | ||
