Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | // // Tests for // friend std::ptrdiff_t operator-(bounded_ptr const& a, bounded_ptr const& b); // friend std::ptrdiff_t operator-(bounded_ptr const& a, T* b); // friend std::ptrdiff_t operator-(T* a, bounded_ptr const& b); // #include <libkern/c++/bounded_ptr.h> #include <array> #include <darwintest.h> #include <darwintest_utils.h> #include "test_utils.h" #define _assert(...) T_ASSERT_TRUE((__VA_ARGS__), # __VA_ARGS__) struct T { int i; }; template <typename Stored, typename Left, typename Right> static void tests() { std::array<Stored, 5> array = {Stored{0}, Stored{1}, Stored{2}, Stored{3}, Stored{4}}; // a >= b { test_bounded_ptr<Left> const a(array.begin(), array.begin(), array.end()); test_bounded_ptr<Right> const b(array.begin(), array.begin(), array.end()); std::ptrdiff_t diff = a - b; _assert(diff == 0); } { test_bounded_ptr<Left> const a(array.begin() + 1, array.begin(), array.end()); test_bounded_ptr<Right> const b(array.begin(), array.begin(), array.end()); std::ptrdiff_t diff = a - b; _assert(diff == 1); } { test_bounded_ptr<Left> const a(array.begin() + 2, array.begin(), array.end()); test_bounded_ptr<Right> const b(array.begin(), array.begin(), array.end()); std::ptrdiff_t diff = a - b; _assert(diff == 2); } { test_bounded_ptr<Left> const a(array.begin() + 3, array.begin(), array.end()); test_bounded_ptr<Right> const b(array.begin(), array.begin(), array.end()); std::ptrdiff_t diff = a - b; _assert(diff == 3); } { test_bounded_ptr<Left> const a(array.begin() + 4, array.begin(), array.end()); test_bounded_ptr<Right> const b(array.begin(), array.begin(), array.end()); std::ptrdiff_t diff = a - b; _assert(diff == 4); } { test_bounded_ptr<Left> const a(array.end(), array.begin(), array.end()); test_bounded_ptr<Right> const b(array.begin(), array.begin(), array.end()); std::ptrdiff_t diff = a - b; _assert(diff == 5); } // a < b { test_bounded_ptr<Left> const a(array.begin(), array.begin(), array.end()); test_bounded_ptr<Right> const b(array.begin() + 1, array.begin(), array.end()); std::ptrdiff_t diff = a - b; _assert(diff == -1); } { test_bounded_ptr<Left> const a(array.begin(), array.begin(), array.end()); test_bounded_ptr<Right> const b(array.begin() + 2, array.begin(), array.end()); std::ptrdiff_t diff = a - b; _assert(diff == -2); } { test_bounded_ptr<Left> const a(array.begin(), array.begin(), array.end()); test_bounded_ptr<Right> const b(array.begin() + 3, array.begin(), array.end()); std::ptrdiff_t diff = a - b; _assert(diff == -3); } { test_bounded_ptr<Left> const a(array.begin(), array.begin(), array.end()); test_bounded_ptr<Right> const b(array.begin() + 4, array.begin(), array.end()); std::ptrdiff_t diff = a - b; _assert(diff == -4); } { test_bounded_ptr<Left> const a(array.begin(), array.begin(), array.end()); test_bounded_ptr<Right> const b(array.begin() + 5, array.begin(), array.end()); std::ptrdiff_t diff = a - b; _assert(diff == -5); } // Subtract pointers with different bounds { test_bounded_ptr<Left> const a(array.begin() + 2, array.begin() + 1, array.end() - 1); test_bounded_ptr<Right> const b(array.begin() + 4, array.begin() + 3, array.end()); _assert(a - b == -2); _assert(b - a == 2); } // Subtract with raw pointers { test_bounded_ptr<Left> const a(array.begin() + 2, array.begin() + 1, array.end() - 1); Right* b = array.begin() + 4; _assert(a - b == -2); } { Left* a = array.begin() + 4; test_bounded_ptr<Right> const b(array.begin() + 2, array.begin() + 1, array.end() - 1); _assert(a - b == 2); } } T_DECL(arith_difference, "bounded_ptr.arith.difference", T_META_TAG_VM_PREFERRED) { tests<T, T, T>(); tests<T, T, T const>(); tests<T, T const, T>(); tests<T, T const, T const>(); } |