From e3c55f983099d0a614449ec641adfd224fe38ad6 Mon Sep 17 00:00:00 2001 From: sunkaicheng Date: Tue, 20 Aug 2019 09:54:09 +0800 Subject: [PATCH] support older version cpp compiler to use is_trivially_copyable --- parallel_hashmap/phmap_base.h | 15 ++++++++++++--- parallel_hashmap/phmap_utils.h | 26 +++----------------------- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/parallel_hashmap/phmap_base.h b/parallel_hashmap/phmap_base.h index 82a38b0..b2534bd 100644 --- a/parallel_hashmap/phmap_base.h +++ b/parallel_hashmap/phmap_base.h @@ -82,12 +82,21 @@ struct PairTrait>: public std::true_type { using second_type = T2; }; +template +#if defined(__GLIBCXX__) && __GLIBCXX__ < 20150801 +struct IsTriviallyCopyable : public std::integral_constant { +}; +#else +struct IsTriviallyCopyable : public std::is_trivially_copyable { +}; +#endif + template struct IsDumpableType { - static constexpr bool value = std::is_trivially_copyable::value + static constexpr bool value = IsTriviallyCopyable::value || (PairTrait::value - && std::is_trivially_copyable::first_type>::value - && std::is_trivially_copyable::second_type>::value); + && IsTriviallyCopyable::first_type>::value + && IsTriviallyCopyable::second_type>::value); }; template diff --git a/parallel_hashmap/phmap_utils.h b/parallel_hashmap/phmap_utils.h index e517afd..9146057 100644 --- a/parallel_hashmap/phmap_utils.h +++ b/parallel_hashmap/phmap_utils.h @@ -326,7 +326,7 @@ public: ~ArchiveGuard() { if (ar_) { ar_->finish(); - } + } } private: Archive* ar_; @@ -351,23 +351,13 @@ public: } template - typename std::enable_if::value, bool>::type + typename std::enable_if::value, bool>::type dump(const V& v) { CHECK_FILE(ofs_); ofs_.write(reinterpret_cast(const_cast(&v)), sizeof(V)); return true; } - template - typename std::enable_if::value - && type_traits_internal::IsDumpableType::value, bool>::type - dump(const V& v) { - using first_type = typename type_traits_internal::PairTrait::first_type; - using second_type = typename type_traits_internal::PairTrait::second_type; - return dump(v.first) - && dump(v.second); - } - void finish() { if (ofs_.is_open()) { ofs_.close(); @@ -397,23 +387,13 @@ public: } template - typename std::enable_if::value, bool>::type + typename std::enable_if::value, bool>::type load(V* v) { CHECK_FILE(ifs_); ifs_.read(reinterpret_cast(v), sizeof(V)); return true; } - template - typename std::enable_if::value - && type_traits_internal::IsDumpableType::value, bool>::type - load(V* v) { - using first_type = typename std::remove_cv::first_type>::type; - using second_type = typename std::remove_cv::second_type>::type; - return load(const_cast(&v->first)) - && load(const_cast(&v->second)); - } - void finish() { if (ifs_.is_open()) { ifs_.close();