sstables: convert write() to concepts

There are three variants: integral, enum, and self-describing
(currently expressed as not integral and not enum). Convert to
concepts by using the standard concepts or the new self_describing
concept.
This commit is contained in:
Avi Kivity
2021-03-18 18:51:56 +02:00
parent 4832041857
commit 42e3f33722
2 changed files with 8 additions and 11 deletions

View File

@@ -256,9 +256,8 @@ struct metadata {
template <typename T>
uint64_t serialized_size(sstable_version_types v, const T& object);
template <class T, typename W>
requires Writer<W>
typename std::enable_if_t<!std::is_integral<T>::value && !std::is_enum<T>::value, void>
template <self_describing T, Writer W>
void
write(sstable_version_types v, W& out, const T& t);
// serialized_size() implementation for metadata class

View File

@@ -252,17 +252,16 @@ inline void write_vint(W& out, T value) {
}
template <typename T, typename W>
requires Writer<W>
inline typename std::enable_if_t<std::is_integral<T>::value, void>
template <std::integral T, Writer W>
void
write(sstable_version_types v, W& out, T i) {
i = net::hton(i);
out.write(reinterpret_cast<const char*>(&i), sizeof(T));
}
template <typename T, typename W>
requires Writer<W>
inline typename std::enable_if_t<std::is_enum<T>::value, void>
requires Writer<W> && std::is_enum_v<T>
inline void
write(sstable_version_types v, W& out, T i) {
write(v, out, static_cast<typename std::underlying_type<T>::type>(i));
}
@@ -320,9 +319,8 @@ inline void write(sstable_version_types v, W& out, const vint<T>& t) {
write_vint(out, t.value);
}
template <class T, typename W>
requires Writer<W>
typename std::enable_if_t<!std::is_integral<T>::value && !std::is_enum<T>::value, void>
template <self_describing T, Writer W>
void
write(sstable_version_types v, W& out, const T& t) {
// describe_type() is not const correct, so cheat here:
const_cast<T&>(t).describe_type(v, [v, &out] (auto&&... what) -> void {