[209] | 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- |
---|
[119] | 2 | * |
---|
[209] | 3 | * This file is a part of LEMON, a generic C++ optimization library. |
---|
[119] | 4 | * |
---|
[440] | 5 | * Copyright (C) 2003-2009 |
---|
[119] | 6 | * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
---|
| 7 | * (Egervary Research Group on Combinatorial Optimization, EGRES). |
---|
| 8 | * |
---|
| 9 | * Permission to use, modify and distribute this software is granted |
---|
| 10 | * provided that this copyright notice appears in all copies. For |
---|
| 11 | * precise terms see the accompanying LICENSE file. |
---|
| 12 | * |
---|
| 13 | * This software is provided "AS IS" with no warranty of any kind, |
---|
| 14 | * express or implied, and with no claim as to its suitability for any |
---|
| 15 | * purpose. |
---|
| 16 | * |
---|
| 17 | */ |
---|
| 18 | |
---|
| 19 | #include <lemon/counter.h> |
---|
[171] | 20 | #include <vector> |
---|
[558] | 21 | #include <sstream> |
---|
| 22 | |
---|
| 23 | #include "test/test_tools.h" |
---|
[119] | 24 | |
---|
[171] | 25 | using namespace lemon; |
---|
[119] | 26 | |
---|
[171] | 27 | template <typename T> |
---|
| 28 | void bubbleSort(std::vector<T>& v) { |
---|
[558] | 29 | std::stringstream s1, s2, s3; |
---|
| 30 | { |
---|
| 31 | Counter op("Bubble Sort - Operations: ", s1); |
---|
| 32 | Counter::SubCounter as(op, "Assignments: ", s2); |
---|
| 33 | Counter::SubCounter co(op, "Comparisons: ", s3); |
---|
| 34 | for (int i = v.size()-1; i > 0; --i) { |
---|
| 35 | for (int j = 0; j < i; ++j) { |
---|
| 36 | if (v[j] > v[j+1]) { |
---|
| 37 | T tmp = v[j]; |
---|
| 38 | v[j] = v[j+1]; |
---|
| 39 | v[j+1] = tmp; |
---|
| 40 | as += 3; |
---|
| 41 | } |
---|
| 42 | ++co; |
---|
[171] | 43 | } |
---|
| 44 | } |
---|
| 45 | } |
---|
[558] | 46 | check(s1.str() == "Bubble Sort - Operations: 102\n", "Wrong counter"); |
---|
| 47 | check(s2.str() == "Assignments: 57\n", "Wrong subcounter"); |
---|
| 48 | check(s3.str() == "Comparisons: 45\n", "Wrong subcounter"); |
---|
[171] | 49 | } |
---|
[119] | 50 | |
---|
[171] | 51 | template <typename T> |
---|
| 52 | void insertionSort(std::vector<T>& v) { |
---|
[558] | 53 | std::stringstream s1, s2, s3; |
---|
| 54 | { |
---|
| 55 | Counter op("Insertion Sort - Operations: ", s1); |
---|
| 56 | Counter::SubCounter as(op, "Assignments: ", s2); |
---|
| 57 | Counter::SubCounter co(op, "Comparisons: ", s3); |
---|
| 58 | for (int i = 1; i < int(v.size()); ++i) { |
---|
| 59 | T value = v[i]; |
---|
| 60 | ++as; |
---|
| 61 | int j = i; |
---|
| 62 | while (j > 0 && v[j-1] > value) { |
---|
| 63 | v[j] = v[j-1]; |
---|
| 64 | --j; |
---|
| 65 | ++co; ++as; |
---|
| 66 | } |
---|
| 67 | v[j] = value; |
---|
| 68 | ++as; |
---|
[171] | 69 | } |
---|
| 70 | } |
---|
[558] | 71 | check(s1.str() == "Insertion Sort - Operations: 56\n", "Wrong counter"); |
---|
| 72 | check(s2.str() == "Assignments: 37\n", "Wrong subcounter"); |
---|
| 73 | check(s3.str() == "Comparisons: 19\n", "Wrong subcounter"); |
---|
[171] | 74 | } |
---|
| 75 | |
---|
| 76 | template <typename MyCounter> |
---|
[558] | 77 | void counterTest(bool output) { |
---|
| 78 | std::stringstream s1, s2, s3; |
---|
| 79 | { |
---|
| 80 | MyCounter c("Main Counter: ", s1); |
---|
| 81 | c++; |
---|
| 82 | typename MyCounter::SubCounter d(c, "SubCounter: ", s2); |
---|
| 83 | d++; |
---|
| 84 | typename MyCounter::SubCounter::NoSubCounter e(d, "SubSubCounter: ", s3); |
---|
| 85 | e++; |
---|
| 86 | d+=3; |
---|
| 87 | c-=4; |
---|
| 88 | e-=2; |
---|
| 89 | c.reset(2); |
---|
| 90 | c.reset(); |
---|
| 91 | } |
---|
| 92 | if (output) { |
---|
| 93 | check(s1.str() == "Main Counter: 3\n", "Wrong Counter"); |
---|
| 94 | check(s2.str() == "SubCounter: 3\n", "Wrong SubCounter"); |
---|
| 95 | check(s3.str() == "", "Wrong NoSubCounter"); |
---|
| 96 | } else { |
---|
| 97 | check(s1.str() == "", "Wrong NoCounter"); |
---|
| 98 | check(s2.str() == "", "Wrong SubCounter"); |
---|
| 99 | check(s3.str() == "", "Wrong NoSubCounter"); |
---|
| 100 | } |
---|
[171] | 101 | } |
---|
| 102 | |
---|
| 103 | void init(std::vector<int>& v) { |
---|
| 104 | v[0] = 10; v[1] = 60; v[2] = 20; v[3] = 90; v[4] = 100; |
---|
[209] | 105 | v[5] = 80; v[6] = 40; v[7] = 30; v[8] = 50; v[9] = 70; |
---|
[119] | 106 | } |
---|
| 107 | |
---|
| 108 | int main() |
---|
| 109 | { |
---|
[558] | 110 | counterTest<Counter>(true); |
---|
| 111 | counterTest<NoCounter>(false); |
---|
[209] | 112 | |
---|
[171] | 113 | std::vector<int> x(10); |
---|
| 114 | init(x); bubbleSort(x); |
---|
| 115 | init(x); insertionSort(x); |
---|
[119] | 116 | |
---|
| 117 | return 0; |
---|
| 118 | } |
---|