1#ifndef POINTER_COMPARISON_TEST_HELPER_HPP
2#define POINTER_COMPARISON_TEST_HELPER_HPP
3
4#include <vector>
5#include <memory>
6#include <cstdint>
7#include <cassert>
8
9#include "test_macros.h"
10
11template <class T, template<class> class CompareTemplate>
12void do_pointer_comparison_test() {
13    typedef CompareTemplate<T*> Compare;
14    typedef CompareTemplate<std::uintptr_t> UIntCompare;
15#if TEST_STD_VER > 11
16    typedef CompareTemplate<void> VoidCompare;
17#else
18    typedef Compare VoidCompare;
19#endif
20    std::vector<std::shared_ptr<T> > pointers;
21    const std::size_t test_size = 100;
22    for (size_t i=0; i < test_size; ++i)
23        pointers.push_back(std::shared_ptr<T>(new T()));
24    Compare comp;
25    UIntCompare ucomp;
26    VoidCompare vcomp;
27    for (size_t i=0; i < test_size; ++i) {
28        for (size_t j=0; j < test_size; ++j) {
29            T* lhs = pointers[i].get();
30            T* rhs = pointers[j].get();
31            std::uintptr_t lhs_uint = reinterpret_cast<std::uintptr_t>(lhs);
32            std::uintptr_t rhs_uint = reinterpret_cast<std::uintptr_t>(rhs);
33            assert(comp(lhs, rhs) == ucomp(lhs_uint, rhs_uint));
34            assert(vcomp(lhs, rhs) == ucomp(lhs_uint, rhs_uint));
35        }
36    }
37}
38
39#endif // POINTER_COMPARISON_TEST_HELPER_HPP
40