From 2410aeb608329ed57a31315effdfd5a751788616 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Sun, 18 May 2014 02:43:55 -0700 Subject: Convert login/char and login/admin server components to proto-v2 --- src/compat/iter.hpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ src/compat/iter_test.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) (limited to 'src/compat') diff --git a/src/compat/iter.hpp b/src/compat/iter.hpp index 130bdf9..659aca9 100644 --- a/src/compat/iter.hpp +++ b/src/compat/iter.hpp @@ -94,4 +94,58 @@ IteratorPair> value_range(T b, T e) return {b, e}; } + +template +class FilterIterator +{ + C *container; + using InnerIterator = decltype(std::begin(*container)); + InnerIterator impl; +public: + void post_adv() + { + while (impl != std::end(*container)) + { + if (filter(*impl)) + break; + ++impl; + } + } + + FilterIterator(C *c) + : container(c), impl(std::begin(*c)) + { + post_adv(); + } + + void operator ++() + { + ++impl; + post_adv(); + } + + T operator *() + { + return *impl; + } + + friend + bool operator != (FilterIterator l, FilterIterator) + { + return l.impl != std::end(*l.container); + } +}; + +template +bool is_truthy(T v) +{ + return v; +} + +template +IteratorPair> filter_iterator(C *c) +{ + return {FilterIterator(c), FilterIterator(c)}; +} + #endif // TMWA_COMPAT_ITER_HPP diff --git a/src/compat/iter_test.cpp b/src/compat/iter_test.cpp index 2c3cdc8..f6f59d4 100644 --- a/src/compat/iter_test.cpp +++ b/src/compat/iter_test.cpp @@ -102,3 +102,56 @@ TEST(iterpair, unsigned8) }; EXPECT_TRUE(std::equal(pair.begin(), pair.end(), arr)); } + +static +bool is_odd_ref(int& i) +{ + return i % 2; +} + +TEST(iterpair, filter1) +{ + int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; + + int expected_arr[] = {1, 3, 5, 7}; + int *expected_it = expected_arr; + int *expected_end = expected_arr + 4; + + for (int& i : filter_iterator(&arr)) + { + EXPECT_EQ(i, *expected_it); + ++expected_it; + } + EXPECT_EQ(expected_it, expected_end); +} + +TEST(iterpair, filter2) +{ + std::vector vals = {0, 1, 0, 2, 0, 3, 0}; + + int sum = 0, count = 0; + for (int i : filter_iterator(&vals)) + { + sum += i; + count++; + } + EXPECT_EQ(sum, 6); + EXPECT_EQ(count, 3); +} + +TEST(iterpair, filter3) +{ + int one = 1; + int two = 2; + int three = 3; + std::vector vals = {0, &one, 0, &two, 0, &three, 0}; + + int sum = 0, count = 0; + for (int *i : filter_iterator(&vals)) + { + sum += *i; + count++; + } + EXPECT_EQ(sum, 6); + EXPECT_EQ(count, 3); +} -- cgit v1.2.3-70-g09d2