Skip to content

Commit 7cb1652

Browse files
committed
Replace is_trivial, resolves #236
1 parent d31897f commit 7cb1652

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

src/utils/io/base_file.hpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@ namespace detail {
1414
virtual string_view path() const = 0;
1515
virtual Result<monostate, internal_error> read_bytes(bspan buffer, off_t offset) const = 0;
1616

17-
template<typename T, typename std::enable_if<std::is_trivial<T>::value && !is_span<T>::value, int>::type = 0>
17+
template<
18+
typename T,
19+
typename std::enable_if<
20+
std::is_standard_layout<T>::value && std::is_trivially_copyable<T>::value && !is_span<T>::value,
21+
int
22+
>::type = 0
23+
>
1824
Result<T, internal_error> read(off_t offset) {
1925
T object{};
2026
auto res = read_bytes(make_bspan(object), offset);
@@ -24,7 +30,13 @@ namespace detail {
2430
return object;
2531
}
2632

27-
template<typename T, typename std::enable_if<std::is_trivial<T>::value, int>::type = 0>
33+
template<
34+
typename T,
35+
typename std::enable_if<
36+
std::is_standard_layout<T>::value && std::is_trivially_copyable<T>::value,
37+
int
38+
>::type = 0
39+
>
2840
Result<monostate, internal_error> read_span(span<T> items, off_t offset) {
2941
return read_bytes(
3042
make_span(reinterpret_cast<char*>(items.data()), reinterpret_cast<char*>(items.data() + items.size())),

src/utils/span.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ namespace detail {
8282
return {begin, count};
8383
}
8484

85-
template<typename T, typename std::enable_if<std::is_trivial<T>::value && !is_span<T>::value, int>::type = 0>
85+
template<
86+
typename T,
87+
typename std::enable_if<std::is_trivially_copyable<T>::value && !is_span<T>::value, int>::type = 0
88+
>
8689
span<char> make_bspan(T& object) {
8790
return span<char>(reinterpret_cast<char*>(std::addressof(object)), sizeof(object));
8891
}

src/utils/utils.hpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,13 @@ namespace detail {
147147
}
148148

149149
// TODO: Re-evaluate use of off_t
150-
template<typename T, typename std::enable_if<std::is_trivial<T>::value, int>::type = 0>
150+
template<
151+
typename T,
152+
typename std::enable_if<
153+
std::is_standard_layout<T>::value && std::is_trivially_copyable<T>::value,
154+
int
155+
>::type = 0
156+
>
151157
Result<T, internal_error> load_bytes(std::FILE* object_file, off_t offset) {
152158
T object;
153159
if(std::fseek(object_file, offset, SEEK_SET) != 0) {
@@ -210,7 +216,7 @@ namespace detail {
210216
// <= 19.23 msvc also appears to fail (but for a different reason https://godbolt.org/z/6Y5EvdWPK)
211217
// <= 19.39 msvc also has trouble with it for different reasons https://godbolt.org/z/aPPPT7z3z
212218
typename std::enable_if<
213-
std::is_standard_layout<T>::value && std::is_trivial<T>::value,
219+
std::is_standard_layout<T>::value && std::is_trivially_copyable<T>::value,
214220
int
215221
>::type = 0,
216222
typename std::enable_if<

0 commit comments

Comments
 (0)