// // ptr_compare.hpp // pointers // // Created by Sam Jaffe on 1/5/17. // #pragma once #define POINTER_TEMPLATE_COMPARE(ptr_t) \ POINTER_TEMPLATE_COMPARE_FULL(ptr_t, (typename T), (T), (typename U), (U)) #define EXPAND(...) __VA_ARGS__ #define POINTER_TEMPLATE_COMPARE_FULL(ptr_t, T_tname, T, U_tname, U) \ template \ bool operator==(ptr_t const & lhs, \ ptr_t const & rhs) noexcept { \ return lhs.get() == rhs.get(); \ } \ \ template \ bool operator!=(ptr_t const & lhs, \ ptr_t const & rhs) noexcept { \ return !(lhs == rhs); \ } \ \ template \ bool operator<(ptr_t const & lhs, \ ptr_t const & rhs) noexcept { \ typedef \ typename std::common_type::pointer, \ typename ptr_t::pointer>::type V; \ return std::less(lhs.get(), rhs.get()); \ } \ \ template \ bool operator>(ptr_t const & lhs, \ ptr_t const & rhs) noexcept { \ return rhs < lhs; \ } \ \ template \ bool operator<=(ptr_t const & lhs, \ ptr_t const & rhs) noexcept { \ return !(rhs < lhs); \ } \ \ template \ bool operator>=(ptr_t const & lhs, \ ptr_t const & rhs) noexcept { \ return !(lhs < rhs); \ } \ \ template \ bool operator==(ptr_t const & lhs, std::nullptr_t) noexcept { \ return !lhs; \ } \ \ template \ bool operator==(std::nullptr_t, ptr_t const & rhs) noexcept { \ return !rhs; \ } \ \ template \ bool operator!=(ptr_t const & lhs, std::nullptr_t) noexcept { \ return static_cast(lhs); \ } \ \ template \ bool operator!=(std::nullptr_t, ptr_t const & rhs) noexcept { \ return static_cast(rhs); \ } \ \ template \ bool operator<(ptr_t const & lhs, std::nullptr_t) noexcept { \ typedef typename ptr_t::pointer V; \ return std::less(lhs.get(), nullptr); \ } \ \ template \ bool operator<(std::nullptr_t, ptr_t const & rhs) noexcept { \ typedef typename ptr_t::pointer V; \ return std::less(nullptr, rhs.get()); \ } \ \ template \ bool operator>(ptr_t const & lhs, std::nullptr_t) noexcept { \ return nullptr < lhs; \ } \ \ template \ bool operator>(std::nullptr_t, ptr_t const & rhs) noexcept { \ return rhs < nullptr; \ } \ \ template \ bool operator<=(ptr_t const & lhs, std::nullptr_t) noexcept { \ return !(nullptr < lhs); \ } \ \ template \ bool operator<=(std::nullptr_t, ptr_t const & rhs) noexcept { \ return !(rhs < nullptr); \ } \ \ template \ bool operator>=(ptr_t const & lhs, std::nullptr_t) noexcept { \ return !(lhs < nullptr); \ } \ \ template \ bool operator>=(std::nullptr_t, ptr_t const & rhs) noexcept { \ return !(nullptr < rhs); \ }