only support dump&load is_trivially_copyable types

This commit is contained in:
sunkaicheng
2019-08-20 00:48:22 +08:00
parent 21c032c9a5
commit 6ae6e2ee49
5 changed files with 34 additions and 112 deletions
+12 -31
View File
@@ -351,29 +351,21 @@ public:
}
template<typename V>
typename std::enable_if<std::is_arithmetic<V>::value, bool>::type
typename std::enable_if<std::is_trivially_copyable<V>::value, bool>::type
dump(const V& v) {
CHECK_FILE(ofs_);
ofs_.write(reinterpret_cast<char*>(const_cast<V*>(&v)), sizeof(V));
return true;
}
template<typename V>
typename std::enable_if<std::is_same<std::string, typename std::remove_cv<V>::type>::value, bool>::type
dump(const V& v) {
CHECK_FILE(ofs_);
uint32_t sz = v.length();
ofs_.write(reinterpret_cast<char*>(&sz), sizeof(sz));
ofs_.write(const_cast<char*>(v.data()), sz);
return true;
}
template<typename V>
typename std::enable_if<type_traits_internal::PairTrait<V>::value
&& type_traits_internal::IsStringOrArithmeticType<V>::value, bool>::type
&& type_traits_internal::IsDumpableType<V>::value, bool>::type
dump(const V& v) {
return dump<typename type_traits_internal::PairTrait<V>::first_type>(v.first)
&& dump<typename type_traits_internal::PairTrait<V>::second_type>(v.second);
using first_type = typename type_traits_internal::PairTrait<V>::first_type;
using second_type = typename type_traits_internal::PairTrait<V>::second_type;
return dump<first_type>(v.first)
&& dump<second_type>(v.second);
}
void finish() {
@@ -405,32 +397,21 @@ public:
}
template<typename V>
typename std::enable_if<std::is_arithmetic<V>::value, bool>::type
typename std::enable_if<std::is_trivially_copyable<V>::value, bool>::type
load(V* v) {
CHECK_FILE(ifs_);
ifs_.read(reinterpret_cast<char*>(v), sizeof(V));
return true;
}
template<typename V>
typename std::enable_if<std::is_same<std::string, typename std::remove_cv<V>::type>::value, bool>::type
load(V* v) {
CHECK_FILE(ifs_);
uint32_t sz = 0;
ifs_.read(reinterpret_cast<char*>(&sz), sizeof(sz));
const_cast<std::string*>(v)->resize(sz);
ifs_.read(const_cast<char*>(v->data()), sz);
return true;
}
template<typename V>
typename std::enable_if<type_traits_internal::PairTrait<V>::value
&& type_traits_internal::IsStringOrArithmeticType<V>::value, bool>::type
&& type_traits_internal::IsDumpableType<V>::value, bool>::type
load(V* v) {
using first_type = typename type_traits_internal::PairTrait<V>::first_type;
using second_type = typename type_traits_internal::PairTrait<V>::second_type;
return load<first_type>(const_cast<first_type*>(&v->first))
&& load<second_type>(const_cast<second_type*>(&v->second));
using first_type = typename std::remove_cv<typename type_traits_internal::PairTrait<V>::first_type>::type;
using second_type = typename std::remove_cv<typename type_traits_internal::PairTrait<V>::second_type>::type;
return load<first_type>(const_cast<first_type*>(&v->first))
&& load<second_type>(const_cast<second_type*>(&v->second));
}
void finish() {