Skip to content

Commit 4bceef5

Browse files
committed
Fix order of types in bit_reader.serialize
Add enable_if to bit_reader.serialize Add some more meta type_traits
1 parent 7399832 commit 4bceef5

File tree

3 files changed

+17
-24
lines changed

3 files changed

+17
-24
lines changed

include/bitstream/stream/bit_reader.h

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -315,11 +315,9 @@ namespace bitstream
315315
* @param ...args The arguments to pass to the serialize function
316316
* @return Whether successful or not
317317
*/
318-
template<typename Trait, typename... Args>
319-
[[nodiscard]] bool serialize(Args&&... args) noexcept(utility::is_noexcept_serialize_v<Trait, bit_reader, Args...>)
318+
template<typename Trait, typename... Args, typename = utility::has_serialize_t<Trait, bit_reader, Args...>>
319+
[[nodiscard]] bool serialize(Args&&... args) noexcept(utility::is_serialize_noexcept_v<Trait, bit_reader, Args...>)
320320
{
321-
static_assert(utility::has_serialize_v<Trait, bit_reader, Args...>, "Could not find serializable trait for the given type. Remember to specialize serializable_traits<> with the given type");
322-
323321
return serialize_traits<Trait>::serialize(*this, std::forward<Args>(args)...);
324322
}
325323

@@ -333,14 +331,10 @@ namespace bitstream
333331
* @param ...args The rest of the arguments to pass to the serialize function
334332
* @return Whether successful or not
335333
*/
336-
template<typename Trait, typename... Args>
337-
[[nodiscard]] bool serialize(Trait&& arg, Args&&... args) noexcept(utility::is_noexcept_serialize_v<utility::deduce_trait_t<Trait, bit_reader, Args...>, bit_reader, Trait, Args...>)
334+
template<typename... Args, typename Trait, typename = utility::has_deduce_serialize_t<Trait, bit_reader, Args...>>
335+
[[nodiscard]] bool serialize(Trait&& arg, Args&&... args) noexcept(utility::is_deduce_serialize_noexcept_v<Trait, bit_reader, Args...>)
338336
{
339-
using deduce_t = utility::deduce_trait_t<Trait, bit_reader, Args...>;
340-
341-
static_assert(utility::has_serialize_v<deduce_t, bit_reader, Trait, Args...>, "Could not deduce serializable trait for the given arguments. Remember to specialize serializable_traits<> with the given type");
342-
343-
return serialize_traits<deduce_t>::serialize(*this, std::forward<Trait>(arg), std::forward<Args>(args)...);
337+
return serialize_traits<utility::deduce_trait_t<Trait, bit_reader, Args...>>::serialize(*this, std::forward<Trait>(arg), std::forward<Args>(args)...);
344338
}
345339

346340
private:

include/bitstream/stream/bit_writer.h

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -373,10 +373,8 @@ namespace bitstream
373373
* @return Whether successful or not
374374
*/
375375
template<typename Trait, typename... Args, typename = utility::has_serialize_t<Trait, bit_writer, Args...>>
376-
[[nodiscard]] bool serialize(Args&&... args) noexcept(utility::is_noexcept_serialize_v<Trait, bit_writer, Args...>)
376+
[[nodiscard]] bool serialize(Args&&... args) noexcept(utility::is_serialize_noexcept_v<Trait, bit_writer, Args...>)
377377
{
378-
static_assert(utility::has_serialize_v<Trait, bit_writer, Args...>, "Could not find serializable trait for the given type. Remember to specialize serializable_traits<> with the given type");
379-
380378
return serialize_traits<Trait>::serialize(*this, std::forward<Args>(args)...);
381379
}
382380

@@ -391,13 +389,9 @@ namespace bitstream
391389
* @return Whether successful or not
392390
*/
393391
template<typename... Args, typename Trait, typename = utility::has_deduce_serialize_t<Trait, bit_writer, Args...>>
394-
[[nodiscard]] bool serialize(Trait&& arg, Args&&... args) noexcept(utility::is_noexcept_serialize_v<utility::deduce_trait_t<Trait, bit_writer, Args...>, bit_writer, Trait, Args...>)
392+
[[nodiscard]] bool serialize(Trait&& arg, Args&&... args) noexcept(utility::is_deduce_serialize_noexcept_v<Trait, bit_writer, Args...>)
395393
{
396-
using deduce_t = utility::deduce_trait_t<Trait, bit_writer, Args...>;
397-
398-
static_assert(utility::has_serialize_v<deduce_t, bit_writer, Trait, Args...>, "Could not deduce serializable trait for the given arguments. Remember to specialize serializable_traits<> with the given type");
399-
400-
return serialize_traits<deduce_t>::serialize(*this, std::forward<Trait>(arg), std::forward<Args>(args)...);
394+
return serialize_traits<utility::deduce_trait_t<Trait, bit_writer, Args...>>::serialize(*this, std::forward<Trait>(arg), std::forward<Args>(args)...);
401395
}
402396

403397
private:

include/bitstream/utility/meta.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ namespace bitstream::utility
2222

2323
// Check if type is noexcept, if it exists
2424
template<typename Void, typename T, typename Stream, typename... Args>
25-
struct is_noexcept_serialize : std::false_type {};
25+
struct is_serialize_noexcept : std::false_type {};
2626

2727
template<typename T, typename Stream, typename... Args>
28-
struct is_noexcept_serialize<std::enable_if_t<has_serialize_v<T, Stream, Args...>>, T, Stream, Args...> :
28+
struct is_serialize_noexcept<std::enable_if_t<has_serialize_v<T, Stream, Args...>>, T, Stream, Args...> :
2929
std::bool_constant<noexcept(serialize_traits<T>::serialize(std::declval<Stream&>(), std::declval<Args>()...))> {};
3030

3131
template<typename T, typename Stream, typename... Args>
32-
constexpr bool is_noexcept_serialize_v = is_noexcept_serialize<void, T, Stream, Args...>::value;
32+
constexpr bool is_serialize_noexcept_v = is_serialize_noexcept<void, T, Stream, Args...>::value;
3333

3434

3535
// Get the underlying type without &, &&, * or const
@@ -41,7 +41,7 @@ namespace bitstream::utility
4141
template<typename Void, typename Trait, typename Stream, typename... Args>
4242
struct deduce_trait
4343
{
44-
using type = void;
44+
using type = Trait;
4545
};
4646

4747
// Non-const value
@@ -87,6 +87,11 @@ namespace bitstream::utility
8787
template<typename Trait, typename Stream, typename... Args>
8888
using deduce_trait_t = typename deduce_trait<void, Trait, Stream, Args...>::type;
8989

90+
91+
// Shorthands for deduced type_traits
9092
template<typename Trait, typename Stream, typename... Args>
9193
using has_deduce_serialize_t = has_serialize_t<deduce_trait_t<Trait, Stream, Args...>, Stream, Trait, Args...>;
94+
95+
template<typename Trait, typename Stream, typename... Args>
96+
constexpr bool is_deduce_serialize_noexcept_v = is_serialize_noexcept_v<deduce_trait_t<Trait, Stream, Args...>, Stream, Trait, Args...>;
9297
}

0 commit comments

Comments
 (0)