File indexing completed on 2025-08-28 08:27:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #pragma once
0019
0020 #include <memory>
0021 #include <type_traits>
0022 #include <utility>
0023
0024 #include "arrow/util/macros.h"
0025
0026 namespace arrow {
0027 namespace util {
0028
0029
0030 template <typename T>
0031 class EqualityComparable {
0032 public:
0033 ~EqualityComparable() {
0034 static_assert(
0035 std::is_same<decltype(std::declval<const T>().Equals(std::declval<const T>())),
0036 bool>::value,
0037 "EqualityComparable depends on the method T::Equals(const T&) const");
0038 }
0039
0040 template <typename... Extra>
0041 bool Equals(const std::shared_ptr<T>& other, Extra&&... extra) const {
0042 if (other == NULLPTR) {
0043 return false;
0044 }
0045 return cast().Equals(*other, std::forward<Extra>(extra)...);
0046 }
0047
0048 struct PtrsEqual {
0049 bool operator()(const std::shared_ptr<T>& l, const std::shared_ptr<T>& r) const {
0050 return l->Equals(*r);
0051 }
0052 };
0053
0054 friend bool operator==(T const& a, T const& b) { return a.Equals(b); }
0055 friend bool operator!=(T const& a, T const& b) { return !(a == b); }
0056
0057 private:
0058 const T& cast() const { return static_cast<const T&>(*this); }
0059 };
0060
0061 }
0062 }