This is an automated email from the ASF dual-hosted git repository.

apitrou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new c875da82e0 GH-36214: [C++] Specify `FieldPath::Hash` as template 
parameter where possible (#36222)
c875da82e0 is described below

commit c875da82e0531303e335af02f5aee097f23c7d55
Author: Ben Harkins <[email protected]>
AuthorDate: Thu Jun 22 06:42:21 2023 -0400

    GH-36214: [C++] Specify `FieldPath::Hash` as template parameter where 
possible (#36222)
    
    
    
    ### Rationale for this change
    
    Internal specializations of `std::hash<FieldPath>` have caused 
multiple-definition errors with unity builds.
    
    ### What changes are included in this PR?
    
    To avoid exposing a global specialization of `std::hash` (which must be 
declared in the `std` namespace), this specifies the `FieldPath::Hash` helper 
as a template parameter to hashable containers instead.
    
    ### Are these changes tested?
    
    Yes (covered by existing tests)
    
    ### Are there any user-facing changes?
    
    No
    
    * Closes: #36214
    
    Authored-by: benibus <[email protected]>
    Signed-off-by: Antoine Pitrou <[email protected]>
---
 cpp/src/arrow/compute/kernels/vector_sort.cc | 5 +----
 cpp/src/arrow/ipc/dictionary.cc              | 9 +--------
 2 files changed, 2 insertions(+), 12 deletions(-)

diff --git a/cpp/src/arrow/compute/kernels/vector_sort.cc 
b/cpp/src/arrow/compute/kernels/vector_sort.cc
index b58244ad6e..8ddcbb9905 100644
--- a/cpp/src/arrow/compute/kernels/vector_sort.cc
+++ b/cpp/src/arrow/compute/kernels/vector_sort.cc
@@ -20,9 +20,6 @@
 #include "arrow/compute/kernels/vector_sort_internal.h"
 #include "arrow/compute/registry.h"
 
-template <>
-struct std::hash<arrow::FieldPath> : public arrow::FieldPath::Hash {};
-
 namespace arrow {
 
 using internal::checked_cast;
@@ -1095,7 +1092,7 @@ struct SortFieldPopulator {
   }
 
   std::vector<SortField> sort_fields_;
-  std::unordered_set<FieldPath> seen_;
+  std::unordered_set<FieldPath, FieldPath::Hash> seen_;
   std::vector<int> tmp_indices_;
 };
 
diff --git a/cpp/src/arrow/ipc/dictionary.cc b/cpp/src/arrow/ipc/dictionary.cc
index 82fec31fda..4e14b3350b 100644
--- a/cpp/src/arrow/ipc/dictionary.cc
+++ b/cpp/src/arrow/ipc/dictionary.cc
@@ -35,13 +35,6 @@
 #include "arrow/util/checked_cast.h"
 #include "arrow/util/logging.h"
 
-namespace std {
-template <>
-struct hash<arrow::FieldPath> {
-  size_t operator()(const arrow::FieldPath& path) const { return path.hash(); }
-};
-}  // namespace std
-
 namespace arrow {
 
 using internal::checked_cast;
@@ -54,7 +47,7 @@ using internal::FieldPosition;
 // DictionaryFieldMapper implementation
 
 struct DictionaryFieldMapper::Impl {
-  using FieldPathMap = std::unordered_map<FieldPath, int64_t>;
+  using FieldPathMap = std::unordered_map<FieldPath, int64_t, FieldPath::Hash>;
 
   FieldPathMap field_path_to_id;
 

Reply via email to