|
6 | 6 | #include <vector> |
7 | 7 |
|
8 | 8 | template <typename R> |
9 | | -void print_range(R const& range) { |
10 | | - using T = typename std::iterator_traits<decltype(range.begin())>::value_type; |
11 | | - std::copy(range.begin(), range.end(), std::ostream_iterator<T>(std::cout, " ")); |
12 | | - std::cout << "\n"; |
13 | | -} |
| 9 | +void print_range(R const& range); |
14 | 10 |
|
15 | 11 | template <typename R> |
16 | | -std::size_t manual_range_size(R const& range) { |
17 | | - std::size_t size = 0; |
18 | | - for (auto const& _ : range) ++size, (void) _; |
19 | | - return size; |
20 | | -} |
21 | | - |
22 | | -namespace util { namespace lang { |
23 | | - |
24 | | -// template <typename T> |
25 | | -// struct is_a_step_range : std::false_type {}; |
26 | | - |
27 | | -// template <typename T> |
28 | | -// struct is_a_step_range<typename range_proxy<T>::step_range_proxy> : std::true_type {}; |
29 | | - |
30 | | -template <typename T> |
31 | | -std::ostream& operator <<(std::ostream& out, step_range_proxy<T> const& r) { |
32 | | - return out << "range(" << *r.begin() << ", " << *r.end() << ")" |
33 | | - << ".step(" << r.begin().step_ << ")"; |
34 | | -} |
35 | | - |
36 | | -template <typename T> |
37 | | -std::ostream& operator <<(std::ostream& out, range_proxy<T> const& r) { |
38 | | - return out << "range(" << *r.begin() << ", " << *r.end() << ")"; |
39 | | -} |
40 | | - |
41 | | -}} |
42 | | - |
43 | | -template <typename R> |
44 | | -void test_range_size(R const& range) { |
45 | | - auto const real_size = manual_range_size(R{range}); |
46 | | - if (real_size == range.size()) { |
47 | | - std::cout << range << ".size() = " << real_size << "\n"; |
48 | | - } else { |
49 | | - std::cout << "ERROR: " << range << ".size() ≠ " << real_size |
50 | | - << " (was " << range.size() << ")!\n"; |
51 | | - } |
52 | | -} |
| 12 | +void test_range_size(R const& range); |
53 | 13 |
|
54 | 14 | int main() { |
55 | 15 | using std::cout; |
@@ -110,3 +70,44 @@ int main() { |
110 | 70 | test_range_size(range(0.1, 0.11).step(2)); |
111 | 71 | test_range_size(range(-7, 1).step(7)); |
112 | 72 | } |
| 73 | + |
| 74 | +namespace util { namespace lang { |
| 75 | + |
| 76 | +template <typename T> |
| 77 | +std::ostream& operator <<(std::ostream& out, step_range_proxy<T> const& r) { |
| 78 | + return out << "range(" << *r.begin() << ", " << *r.end() << ")" |
| 79 | + << ".step(" << r.begin().step_ << ")"; |
| 80 | +} |
| 81 | + |
| 82 | +template <typename T> |
| 83 | +std::ostream& operator <<(std::ostream& out, range_proxy<T> const& r) { |
| 84 | + return out << "range(" << *r.begin() << ", " << *r.end() << ")"; |
| 85 | +} |
| 86 | + |
| 87 | +}} |
| 88 | + |
| 89 | +template <typename R> |
| 90 | +void print_range(R const& range) { |
| 91 | + using T = typename std::iterator_traits<decltype(range.begin())>::value_type; |
| 92 | + std::cout << range << " = "; |
| 93 | + std::copy(range.begin(), range.end(), std::ostream_iterator<T>(std::cout, " ")); |
| 94 | + std::cout << "\n"; |
| 95 | +} |
| 96 | + |
| 97 | +template <typename R> |
| 98 | +std::size_t manual_range_size(R const& range) { |
| 99 | + std::size_t size = 0; |
| 100 | + for (auto const& _ : range) ++size, (void) _; |
| 101 | + return size; |
| 102 | +} |
| 103 | + |
| 104 | +template <typename R> |
| 105 | +void test_range_size(R const& range) { |
| 106 | + auto const real_size = manual_range_size(R{range}); |
| 107 | + if (real_size == range.size()) { |
| 108 | + std::cout << range << ".size() = " << real_size << "\n"; |
| 109 | + } else { |
| 110 | + std::cout << "ERROR: " << range << ".size() ≠ " << real_size |
| 111 | + << " (was " << range.size() << ")!\n"; |
| 112 | + } |
| 113 | +} |
0 commit comments